【问题标题】:Is it possible to use karate with AWS device farm for Android and iOS testing?是否可以将空手道与 AWS 设备场一起用于 Android 和 iOS 测试?
【发布时间】:2021-07-07 10:48:34
【问题描述】:

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

我能找到的唯一与空手道和 AWS 设备农场有关的东西是 this repository,但它是关于 Web 应用程序测试的。

谢谢

【问题讨论】:

  • 这里是空手道的开发者。我不知道。也许你可以帮助研究/贡献。

标签: karate aws-device-farm


【解决方案1】:

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

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 Device Farm 移动设备进行通信(因此称为 Appium 测试):https://docs.aws.amazon.com/devicefarm/latest/developerguide/test-types-appium.html

【讨论】:

    【解决方案2】:

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

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

    步骤非常简单,更新pom.xml,创建assembly/zip.xml,然后运行mvn package 以创建您必须压缩 并上传到devicefarm 的jar 文件项目。

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

    本地:

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

    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;
        }
    
    
    }
    

    【讨论】:

    • 看起来测试网格目前不支持移动设备进行本地执行,上传测试 jar 并直接从设备场运行似乎是唯一的选择
    猜你喜欢
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 2016-02-28
    • 2018-01-22
    相关资源
    最近更新 更多