有可能将空手道与AWS设备场一起用于Android和iOS测试吗



我想知道是否可以将空手道与AWS设备场一起用于Android和iOS测试。如果这是可能的,有什么配置的例子吗?

我能找到的唯一与空手道和AWS设备场相关的东西是这个存储库,但它是关于web应用程序测试的。

感谢

是的,AWS设备农场确实支持在Android和iOS设备上执行网络测试的Karate框架。AWS设备场上的桌面测试和移动测试之间的主要区别在于,对于移动测试,我们要求将测试打包并上传到我们的服务中,以便在服务器端执行。例如,在下面的代码中,我们使用一个简单的条件分支来检查"我们是为移动设备运行服务器端还是为桌面浏览器设备运行客户端":

class DeviceFarmWebTests(unittest.TestCase):
def setUp(self):
if os.getenv("DEVICEFARM_DEVICE_NAME"):
print("Running my test on a real physical device in Device Farm (server-side)")
url = "http://127.0.0.1:4723/wd/hub"
desired_capabilities = {}
else:
print("Running my test on a desktop browser in Device Farm (client-side)")
session = boto3.Session(profile_name='simsjon')
devicefarm = session.client('devicefarm', region_name='us-west-2')
project_arn = create_project(devicefarm, "Test Desktop Browsers Project") 
print("Project ARN:", project_arn)
url = create_presigned_url(devicefarm, arn=project_arn) 
print("Creating a new remote web driver session at:", url)
desired_capabilities = DesiredCapabilities.CHROME
self.driver = webdriver.Remote(command_executor=url,
desired_capabilities=desired_capabilities) 
print("A new WebDriver session has been created. SessionId:", self.driver.session_id)
def test_main(self):
...

请参阅我们这里的包装和上传测试说明,这些测试将通过Appium服务器与AWS设备场移动设备通信(因此被称为Appium测试(:https://docs.aws.amazon.com/devicefarm/latest/developerguide/test-types-appium.html

用于直接在aws设备场中运行:

根据以下文档修改您现有的空手道项目:https://docs.aws.amazon.com/devicefarm/latest/developerguide/test-types-appium.html

步骤非常简单,更新pom.xml,创建assembly/zip.xml,并运行mvn package来创建jar文件,您必须zip并上传到设备场项目。

我注意到,通过直接上传项目在设备场上运行只适用于Junit4,因此您只能在依赖中使用karate-junit4

对于本地:

参考中的DeviceFarmTarget类https://github.com/ptrthomas/karate-devicefarm-demo并在你现有的空手道项目中实施类似的项目

public class AwsDeviceFarmMobileTarget implements Target {
private String arn;
private String driverType = "android";
public AwsDeviceFarmMobileTarget(Map<String, Object> options) {
arn = (String) options.get("arn");
if (arn == null) {
throw new RuntimeException("arn is null");
}
// update driver type and browserName if needed
}
@Override
public Map<String, Object> start(ScenarioRuntime sr) {
sr.logger.info("starting driver using: {}", AwsDeviceFarmMobileTarget.class);
DeviceFarmClient client = DeviceFarmClient.builder().region(Region.US_WEST_2).build();
CreateTestGridUrlRequest request = CreateTestGridUrlRequest.builder()
.expiresInSeconds(300)
.projectArn(arn)
.build();
CreateTestGridUrlResponse response = client.createTestGridUrl(request);
String webDriverUrl = response.url();
sr.logger.info("aws url provisioned: {}", webDriverUrl);
Map<String, Object> map = new HashMap();
map.put("type", driverType);
map.put("start", false);
map.put("webDriverUrl", webDriverUrl);
// this is needed because it can take a minute or two for the "desktop" to be provisioned by aws
map.put("httpConfig", Collections.singletonMap("readTimeout", 120000));
// refer: https://docs.aws.amazon.com/devicefarm/latest/testgrid/techref-support.html
Map<String, Object> session = new HashMap();
map.put("webDriverSession", session);
Map<String, Object> capabilities = new HashMap();
session.put("capabilities", capabilities);
// for some reason, both are needed for aws device farm
session.put("desiredCapabilities", capabilities);
return map;
}
@Override
public Map<String, Object> stop(ScenarioRuntime sr) {
return Collections.EMPTY_MAP;
}

}

最新更新