使用无构建测试,xctestrun和Fastlane加速iOS CI

PS:这篇文章最初发表在我的个人博客上; XCBlog 在这里

在WWDC 2016上,有一个关于“高级测试和持续集成”的精彩演讲,其中提到了XCTest Framework,Xcode-Sever和xcodebuild命令行工具中的许多新功能。 我们可以使用这些功能来加快iOS持续集成过程。

当前的iOS CI限制

在Xcode 8之前,我们必须在CI上运行单元测试和UI测试之前构建,编译和应用程序,这是正在运行的任务的重复。 分布式测试非常耗时,而且我们已经在每台机器上构建和编译源代码。 实际上,在CI Server上进行构建和编译需要花费大量的构建时间。

Xcode 8和xcodebuild功能

Xcode 8版本在“ xcodebuild”中购买了几个新功能,可以为iOS开发和测试过程增加很多价值。

“ xcodebuild”是用于从命令行构建,运行和执行我们的应用程序的命令行工具。 在Xcode服务器中使用。 Xcode 8现在在xcodebuild命令行工具中进行了一些改进。

测试构建

xcodebuild现在具有“ build-for-testing”选项,它像往常一样采用工作区方案和目标,但是最重要的是它将创建“ XCTESTRUN”文件。 我们只需要执行“测试构建”操作

  $ xcodebuild -workspace  -scheme  -sdk iphonesimulator -destination'platform = iOS Simulator,name = ,OS = 10.2'构建测试 

这应该构建用于测试的应用程序,并在DerivedData中创建xctestrun文件。

无需构建即可测试

xcodebuid还具有另一个名为“ test-without-building”的选项,在这里我们不需要提供工作区,而是指定XCTESTRUN文件,该文件将注入该文件并运行所有测试。

此功能对于分布式测试非常有用,因为我们可以在一台计算机上创建XCTESTRUN文件并分发到其他特定于测试的计算机。 为了使用它,我们可以在不构建的情况下将此选项指定为ru测试

  $ xcodebuild -workspace  -scheme  -sdk iphonesimulator -destination'platform = iOS Simulator,name = ,OS = 10.2'测试无需构建 

这次它将不会生成和应用。

仅限测试/跳过测试

假设您不想运行单元测试。 Xcodebuild现在有两个新的测试选项

  • –only-testing:包括测试套件
  • –跳过测试:排除测试服
  $ xcodebuild -workspace  -scheme  -sdk iphonesimulator -destination'platform = iOS Simulator,name = ,OS = 10.2'测试而无构建-仅测试: 

在CI上加速XCTest

使用上述功能,我们可以加快测试执行速度并节省构建时间。 让我们跳入Xcode,看看如何做到这一点

设置Xcode方案

在Xcode中创建一个示例iOS应用,并将其命名为XCTestRun,其中包括单元测试和UI测试。 您可能还希望将此项目另存为“工作区”,因为大多数实际项目都另存为“ .workspace”。 您可以使用File-> Save as Workspace Xcode选项来实现。 您还可以创建单独的方案来运行单元测试和UI测试。 而已

测试构建

现在让我们尝试使用xcodebuild的新功能来构建该项目。 首先让我们使用“测试构建”功能来准备我们的应用程序以进行测试。

  $ xcodebuild-for-testing -workspace“ XCTestRun.xcworkspace” -scheme“ XCTestRun” -destination“平台= iOS Simulator,名称= iPhone 7,OS = 10.2” -derivedDataPath“ build” 

这将构建一个用于测试的应用程序,并在build / Build / Products目录中创建XCTestRun_iphonesimulator10.2-x86_64.xctestrun文件。 现在,我们可以使用该文件运行测试而无需构建。

使用xctestrun无需构建即可进行测试

现在,我们可以使用此文件来运行测试,而无需使用无构建测试选项进行构建,我们还可以使用-only-testing和-skip-testing

  $ xcodebuild test-without-building -xctestrun“构建/构建/产品/XCTestRun_iphonesimulator10.2-x86_64.xctestrun”-目标“ platform = iOS Simulator,name = iPhone 7,OS = 10.2”-仅测试:XCTestRunTests / XCTestRunTests。迅速 

我们可以将这些脚本作为CI的一部分来执行,也可以使用下面提到的Fastlane之类的工具。

使用Fastlane

Fastlane具有用于iOS自动化的工具集以及执行任务的大量操作。 为了设置Fastlane,我们需要在该目录中创建Fastlane目录和Fastfile。

Fastlane具有xcodebuild动作以及扫描工具,但是不幸的是,在撰写本文时,没有额外的努力,它们都不支持本机构建用于测试和非构建测试。 我们需要编写自定义操作来执行这些步骤。 我已经编写了名为“ xctestrun”的自定义Fastlane动作,该动作几乎不需要运行即可进行构建和测试。

现在,我们有了自定义操作,让我们通过添加以下代码在Fastfile中进行操作。

  require_relative'actions / xctestrun' 
  require_relative'xcode8-xctestrun' 
  Xcode8.runner = self.runner 
  fastlane_version“ 2.19.3” 
  default_platform:ios 
  desc“测试无人区” 
 车道:build_for_testing做 
  xctestrun(xcodebuild_action:“为测试构建”,方案:“ XCTestRun”,工作区:“ XCTestRun.xcworkspace”,目标:“ platform = iOS Simulator,名称= iPhone 7,OS = 10.2”) 
 结束 
 车道:unittest do 
  xctestrun(xcodebuild_action:'test-without-building',方案:“ unittest”,工作区:“ XCTestRun.xcworkspace”,目标:“ platform = iOS Simulator,name = iPhone 7,OS = 10.2”) 
 结束 
 泳道:uitest do 
  xctestrun(xcodebuild_action:'test-without-building',方案:“ uitest”,工作区:“ XCTestRun.xcworkspace”,目标:“ platform = iOS Simulator,name = iPhone 7,OS = 10.2”) 
 结束 

此快速文件具有用于“测试构建”,运行单元测试和UI测试的单独通道,还请注意,我们正在使用自定义操作“ xctestrun”

现在,我们可以运行快速通道“构建用于测试”来构建和应用进行测试。

  $ fastlane build_for_testing 

这将构建一个用于测试的应用程序

现在,我们的应用程序已构建用于测试,让我们使用“单元测试”通道执行单元测试

  $ fastlane单元测试 

这将仅执行“ unittest”方案。

同样,我们可以执行UI测试

  $ fastlane uitest 

这将仅执行UI测试。

我们不需要构建或编译应用程序即可运行单元和UI测试。

源代码

该演示的源代码可在Github’XCTestRun’上获得。您可以自己尝试。

结论

使用“ xcodebuild”的新功能,我们可以通过将xctestrun文件传递到多台测试机上,从而节省iOS持续集成过程的构建时间并实现分布式测试。 这肯定会加快iOS持续集成过程。

像XCBlog的 XCTEQ 发布的帖子一样 您可能还喜欢我们的一些服务,例如访客博客或Mobile DevOps(CI / CD)或测试自动化。 Github 搜索我们的 服务 ,开源项目, 或者在 Twitter Facebook Youtube LinkedIn 上关注我们 下载我们的 XCBlog iOS应用程序以离线阅读博客。

X CTEQ 一家专门从事基于Mobile DevOps,CI / CD,Mobile,AI / ML的测试自动化Checkout XCTEQ产品和服务的公司, 网址 http://www.xcteq.co.uk 或写信给我们info@xcteq.co。英国..