如今,当一个大都市的每个居民的口袋里都有一台计算机,除了飞向月球以外,还可以做更多的事情时,我们每天都会使用移动应用程序。 新闻,天气,促销,购物-所有这些功能都在成千上万的应用程序中实现。 但是,如果您最喜欢的应用程序死机或崩溃,它很快就会不再是您的最爱。

本文由
WaveAccess的人员撰写。我们开发移动应用程序已有10多年的历史了,我们不能负担不起发布给用户的产品。 这就是为什么“抽调”测试团队和基础架构对我们而言同样重要。
数以百计的Android设备,具有不同版本操作系统的iPhone和不同的设备对角线使QA工程师承担了“捕捉”真实移动设备和不同版本操作系统上的缺陷的任务。 但是很少有人可以在10、20、50个设备上运行相同的手动脚本。 由于这些任务,我们提升了自动测试的技能,尤其是在移动设备上。 但是说实话:即使使用20个用于运行自动测试的真实设备来创建和维护基础架构,也令人头疼。
在本文中,我们想告诉我们我们如何亲自尝试新的Microsoft App Center服务,以检查我们在真实设备的动物园中开发的应用程序的质量。
为什么出现使用服务的问题
现在,我们正在开发一个支持购物的应用程序。 该项目已经进行了很长时间:客户不断提供一些新功能,而他只是为开发而开发。 应用程序中已经有数十个屏幕,从“购买”到各种消息选项,推送,“收弓”功能。 一直以来,向投资者介绍该项目的情况都是在新的购物中心举行的,因此发布速度越高(产品质量不会下降)就越好。
到目前为止,我们已经在可供使用的有限设备上进行了自动测试(对于该项目-大约有30个Android设备和“苹果”)。 现在,应用程序达到了一个新的水平,观众不断增长,质量变得更加重要。 出现了有关使用云服务在更多不同设备上运行自动测试的问题。
在发布过程中,我想使用所有经过验证的现代软件开发实践:交叉审核,持续集成,在iOS + Android上的大量设备上进行自动化功能和单元测试,分析和crashlytics的集合。
我们较早时已单独或组合应用了每种实践。 但是鉴于项目的规模和团队的庞大规模,我希望获得一个通用的解决方案。 让该工具能够完成上述所有任务,并且可以在一处为管理不同平台的移动应用程序的开发和交付状态提供机会,并对其进行监视。
团队中的每个角色都有自己的条件:开发人员不想更改已经建立的开发流程(存储库,构建工具等),而不想在产品中切换到太新的未经验证的工具。 测试工程师梦想着减少动物园检查设备的负担,管理人员和客户都希望有一个方便的界面,以透明的流程监视整个状态。
在选择工具时,类似物的研究是一个相当重要的阶段。 我们研究了提供这种功能的各种服务(例如Appium测试,例如BrowserStack)。 在Microsoft App Center的情况下,我们有一个试用期,因此我们有机会尝试了解如果将更多的资源投入到质量上并使该移动应用程序针对具有一项服务的任何平台的整个发布过程自动化的情况,项目将会发生什么情况。 我们告诉它如何。
如何设置iOS应用
因此,使用不限制功能性的试用期,我们在Microsoft App Center中创建iOS应用程序:

选择平台:

将App Center SDK添加到项目中:
pod 'AppCenter'
安装炉床之后,打开AppDelegate.swift文件,并在您自己的导入命令下添加以下行:
import AppCenter import AppCenterAnalytics import AppCenterCrashes
在同一文件中,将以下行添加到didFinishLaunchingWithOptions方法中:
MSAppCenter.start("{Your App Secret}", withServices:[ MSAnalytics.self, MSCrashes.self ])
针对目标C的过程与此类似, 此处是该指令的完整版本。
Buildim!
转到“构建”选项卡,选择我们的svc服务。


配置构建。 不要忘了签名,因为这会生成一个可以在真实设备上运行的应用程序格式的应用程序文件:


做完了! 单击立即构建按钮,然后等待构建。


有关Android应用程序的类似故事,请参见此处的说明。
我们启动了针对iOS的首个测试
程序集中可以包含每个平台的单元测试和本机测试(带有复选标记)。 我们在下面介绍不同设备上AT的功能。
设置一组iOS,Android设备,将测试发送到一组
转到“测试”,“设备集”选项卡。 我们创建了一组将在其上进行测试的设备。 有250多种Android设备可供选择,还有200多种不同的iOS设备(生成版本+ iOS版本)。 设备的详细列表在这里 。
在这里,对于这个问题的官方回答有点令人失望,新的苹果设备将在发布后多久出现,听起来像是“售后1-2个月”。
我们准备在App Center中启动测试(XCUITest的示例),并将其发送以启动。 App Center只能构建应用程序,因此您仍然必须在计算机或CI中本地构建测试项目。
Shell: # Generate an XCUITest bundle and your iOS application as described above. $ rm -rf DerivedData $ xcrun xcodebuild build-for-testing -derivedDataPath DerivedData -scheme YOUR_APP_SCHEME # Upload your test to App Center $ appcenter test run xcuitest \ --app "<app center username/<app name>" \ --devices DEVICE_SET \ --test-series "master" \ --locale "en_US" \ --build-dir DerivedData/Build/Products/Debug-iphoneos
阿皮 测试
值得确保使用的测试框架与支持的框架一致。 此外,您必须使用App Center提供的驱动程序,这对框架的使用施加了限制(例如,不能使用Google Giuce)。
Maven用户的项目构建
步骤1.添加存储库和依赖项
您将需要将JCenter存储库添加到pom.xml文件。
XML <repositories> <repository> <id>jcenter</id> <url>https://jcenter.bintray.com/</url> </repository> </repositories>
然后为Appium测试扩展添加依赖项
XML <dependency> <groupId>com.microsoft.appcenter</groupId> <artifactId>appium-test-extension</artifactId> <version>1.3</version> </dependency>
因此,在编译期间,将提供扩展的Android和iOS驱动程序(首先,需要这些驱动程序来实现“标签”功能;有关此步骤的更多信息,请参见步骤4)。
步骤2.添加启动配置文件
将代码段复制到<profiles>中的pom.xml中。 如果pom文件中缺少<profiles>部分,则需要创建它。 激活后,配置文件将我们的测试类和所有依赖项打包到target / upload文件夹中,准备上传到TestCloud。
为Gradle用户打造
步骤1.信息库和依赖项
我们确保在项目根文件夹的build.gradle中激活了JCenter存储库:
gradle allprojects { repositories { jcenter() } }
将以下代码段添加到application。文件夹中的build.gradle中:
gradle androidTestCompile('com.microsoft.appcenter:appium-test-extension:1.0')
从Gradle 3.0开始, 不推荐使用 androidTestCompile。 相反,您需要androidTestImplementation。
步骤2.自动生成pom 文件
为了使上传器正常工作,需要pom.xml文件。 在build.gradle中的应用程序文件夹中添加以下代码段,以便自动收集pom文件:
gradle apply plugin: 'maven' task createPom { pom { withXml { def dependenciesNode = asNode().appendNode('dependencies') //Iterate over the compile dependencies (we don't want the test ones), adding a <dependency> node for each configurations.testCompile.allDependencies.each { def dependencyNode = dependenciesNode.appendNode('dependency') dependencyNode.appendNode('groupId', it.group) dependencyNode.appendNode('artifactId', it.name) dependencyNode.appendNode('version', it.version) } def profilesNode = asNode().appendNode('profiles') profilesNode.append(new XmlParser().parse('https://raw.githubusercontent.com/Microsoft/AppCenter-Test-Appium-Java-Extensions/master/gradleuploadprofilesnippet.xml')) } }.writeTo("pom.xml")
测试变更
步骤1.添加导入
将包导入到您的测试类中:
Java import com.microsoft.appcenter.appium.Factory; import com.microsoft.appcenter.appium.EnhancedAndroidDriver; import org.junit.rules.TestWatcher; import org.junit.Rule;
步骤2.创建一个TestWatcher实例
添加到每个JUnit Rule测试类(或基本测试类):
Java @Rule public TestWatcher watcher = Factory.createWatcher();
步骤3.更改驱动程序类型
在声明驱动程序时将其类型更改,从AndroidDriver <MobileElement>更改为EnhancedAndroidDriver <MobileElement>,或者从IOSDriver <MobileElement>更改为EnhancedIOSDriver <MobileElement>
Java private static EnhancedAndroidDriver<MobileElement> driver;
步骤4.更新驱动程序实例
我们更改驱动程序实例,以使表格的行:
Java driver = new AndroidDriver<MobileElement>(url, capabilities);
...外观改变:
Java driver = Factory.createAndroidDriver(url, capabilities);
使用这些驱动程序仍然可以使您无需进行其他修改即可在本地运行测试,但是此外,您还可以使用driver.label(“您的文本”)在可执行测试的步骤中添加“标签”。 设备的文本和屏幕截图将在Test Cloud的测试报告中提供。 强烈建议您通过After方法访问标签,因为这会将最新应用程序状态的屏幕截图添加到测试报告中。
即使测试失败,也会截取屏幕截图。 通常,其中包含足够的信息以了解发生这种情况的原因。 After方法中的示例实现:
Java: @After public void TearDown(){ driver.label("Stopping App"); driver.quit(); }
下载到App Center 测试
加载过程如下:
- 生成App Center测试上传命令。 文档(EN)- 开始测试运行 。
- 我们将测试类和所有依赖项打包在target / upload文件夹中
外壳:
- mvn -DskipTests -P准备上载软件包
- 开始下载和运行测试
完成后,我们可以从列表中查看每个设备上的结果:

屏幕上显示结果,日志,报告
在每个iOS或Android设备上,您都可以查看详细的日志和用于诊断测试崩溃的屏幕截图:



以及一段时间内所有发射的统计信息:

的确,没有提供对“设备”进行调试和检查的访问权限。 如果测试出了点问题并且日志还不够-一切都只能通过支持来确定。 在设备上启动AT的一种流行服务-BrowserStack-中就有这样的机会,它内置于Appium中。 可以提供URL和端口以创建与设备服务器的连接。
结论
令人惊讶的是,从一个应用程序的从持续集成到持续交付的整个发布过程都集中在一个地方:Microsoft App Center提供CI构建,测试,部署以存储,分析,崩溃解决方案。
尝试了不到建议功能的一半后,该团队给人留下了很好的印象。 从明显的优点来看:您不需要以代码形式编写对每个设备的支持。 好吧,请其他好东西:
- 无需为大量设备增加服务器。
- 无需将100500设备连接到该服务器。
- 开启24 \ 7时,无需忍受Android故障。
- 无需为设备组装容器,也无需管理这些容器。
- 无需忍受有限的模拟器。
Microsoft App Center根据初始参数安排了我们:在集成方面要求不是很高,但是它提供了所有要求的功能,从而消除了困难的支持。 我们计划在项目上使用该服务,因为它可以在确保质量的同时解决工具的任务。