版本记录
版本号 | 时间 |
---|---|
V1.0 | 2019.04.30 星期二 |
前言
我们在做App开发的时候,开发人员开发完成以后就要交给QA进行测试了,有几种方式,一种就是将QA的测试机加到账号里面的Device里面,这个有个数限制(每种硬件类型不能超过100台,即使删除设备也不会重置),然后利用三方平台比如说蒲公英进行分发,还有一种方法就是使用TestFlight进行测试,这个专题就主要说一下App分发测试相关的内容。感兴趣的看上面几篇。
1. App的分发测试(一) —— 浅谈蒲公英平台分发测试的使用(一)
2. App的分发测试(二) —— TestFlight集成和分发测试(一)
3. App的分发测试(三) —— fastlane自动化打包并上传(一)
4. App的分发测试(四) —— fastlane自动化打包(一)
开始
首先看下写作环境
Swift 4.2, iOS 12, Xcode 10
您为代码编写单元测试,但是在添加新代码和测试时是否运行所有测试?或者至少,在您将提交提交到存储库之前?随着您的应用程序的增长,单元测试的数量也在增长 - 运行所有这些测试可能需要很长时间才能打破您的注意力。所以你准备好迈出下一步了吗?持续集成!
在开发过程中使用持续集成(continuous integration - CI)
是改变游戏规则的。通过测试检查每个提交,您立即知道什么时候出错了。测试在另一台服务器上运行,因此您可以继续开发新功能,而不会分心。
设置CI
有很多种方法。本教程将启动您使用Travis CI
在每个GitHub提交上运行测试并将结果通过电子邮件发送给您。然后,您将添加fastlane
以添加更多自动化。
Travis CI
可能满足您的所有CI
需求。如果没有,继续完成本教程以开始使用Jenkins
- 一个经过实战测试的系统,它是免费的,相当容易安装和设置,并且完全可配置。它适用于GitHub
和fastlane
。
注意:本教程假设您熟悉使用
GitHub
进行基本版本控制,编写单元测试以及使用命令行。
打开初始项目,在Numero-Starter
文件夹中构建并运行应用程序。
在浏览器中,登录您的GitHub帐户,或创建一个GitHub
帐户(如果您还没有)。
Numero
项目已经有一个git存储库和一个为Swift
和macOS
量身定制的.gitignore
文件。 使用您喜欢的方法将其推送到您的GitHub
帐户。
Doing CI With Travis CI
如果您在GitHub
上托管了存储库,那么Travis CI
是开始持续集成的最简单方法。 该服务对于公共存储库是免费的。
1. Setting Up Travis
设置Travis
帐户非常简单。 只需访问Travis-ci.com,然后使用GitHub
登录。
因为您已经登录GitHub
,所以甚至不需要输入您的GitHub
用户名 - Travis就知道了!
单击Authorize travis-ci
。
Travis
创建您的个人资料,包括您的GitHub个人资料图片和您的公共GitHub存储库。 单击绿色的大绿色激活Activate
按钮,在您的GitHub帐户中安装Travis-CI
。 您可能必须在浏览器完成后刷新浏览器以查看您的存储库。
单击Numero
以显示其存储库页面:
没有这个存储库的构建 - 您将立即处理它!
注意:如果要激活另一个存储库,请单击
My Repositories
旁边的+
按钮。如果您没有看到所有存储库,请单击Sync account
,然后重新加载页面。
2. Your First Travis Build
要设置Travis CI
,你需要向Numero
添加两个东西 - 一个单元测试,所以Travis
有事情要做,还有一个.travis.yml
文件,所以Travis
知道怎么做。然后你将你的本地仓库推送到GitHub
,Travis CI
会自动地将它拉出来,构建它并运行测试!
Test-Driven Development
我们的TDD
教程列出了其优点,包括出色的代码覆盖率和高度可靠的代码,然后引导您完成red-green-refactor cycle
。对于每个用例,您执行以下步骤:
- 1) Red:写一个失败的测试。
- 2) Green:编写足够的代码以使测试通过。
- 3) Refactor:清理并优化代码。
在Xcode中,打开ConverterTests.swift
并添加以下代码:
import XCTest
@testable import Numero
class ConverterTests: XCTestCase {
var converter: Converter!
override func setUp() {
super.setUp()
converter = Converter()
}
override func tearDown() {
converter = nil
super.tearDown()
}
func testConversionForOne() {
let result = converter.convert(1)
XCTAssertEqual(result, "I", "Conversion for 1 is incorrect")
}
}
您可以在setup()
中创建被测系统转换器converter
,并在tearDown()
中将其删除。 然后,编写第一个单元测试,以查看converter.convert(1)
是否返回“I”
。
Spoiler:它不会 - 这是
TDD
周期的所有部分:首先,编写一个失败的测试。
现在检查Numero scheme
的测试Test
设置以确保选择了ConverterTests
:
这可确保Travis CI
在运行Numero
时运行测试。
好的,这是第一个完成的任务。 现在进行第二项任务。
Creating .travis.yml
创建.travis.yml
文件 - 在Terminal
中,cd
到Numero
项目的根目录,然后输入以下命令在TextEdit
中创建和打开一个空文件:
touch .travis.yml
open -a TextEdit .travis.yml
这是一个隐藏文件,因此使用Unix
命令创建和打开它更容易。 检查您是使用文本文件,而不是Rich Text
。
将这些行添加到文件中:
osx_image: xcode10.1
language: swift
os: osx
xcode_project: Numero.xcodeproj
xcode_scheme: Numero
xcode_destination: platform=iOS Simulator,OS=12.2,name=iPhone 8
前三行告诉Travis CI
使用Xcode 10.2
,Swift和macOS来构建和运行你的项目。 此Xcode的默认macOS
版本是10.14
。 检查Travis CI
的macOS Build Environment: macOS Version页面以获取更新。
最后三行指定要运行的.xcodeproj
文件,scheme
名称以及Travis CI
运行项目的位置 - 在这种情况下,您要求在iPhone 8
上运行iOS 12.2
的iOS模拟器。 您可以在Travis CI I macOS Build Environment: Xcode version中找到其他Xcode和iOS版本以及模拟器设备。
好的,你们都准备好了! 保存.travis.yml
,然后提交并将更改推送到GitHub
。 在Travis CI Numero
存储库页面上,单击Build History
。 很快你就会看到你的第一个构建开始:
现在单击#1 started
并向下滚动以查看Job log
。 它很长,所以我只展示它的一部分。
Travis CI
是用Ruby
编写的,因此Ruby Version Manager(rvm)
使用默认的Ruby
版本。
$ rvm use default
Using /Users/travis/.rvm/gems/ruby-2.4.5
$ ruby --version
ruby 2.4.5p335 (2018-10-18 revision 65137) [x86_64-darwin17]
然后Travis CI
运行xcodebuild
,你会看到它编译,链接和处理Numero
中的文件,包括ConverterTests.swift
。 然后它链接NumeroTests
并复制iPhoneSimulator.platform
:
$ set -o pipefail && xcodebuild -project Numero.xcodeproj -scheme Numero -destination platform\=iOS\ Simulator,OS\=12.1,name\=iPhone\ 8 build test | xcpretty
▸ Compiling GameDoneViewController.swift
▸ Compiling Shuffle.swift
▸ Compiling ViewController.swift
▸ Compiling Game.swift
▸ Compiling Converter.swift
▸ Compiling AppDelegate.swift
▸ Linking Numero
...
▸ Processing Info.plist
▸ Compiling ConverterTests.swift
▸ Linking NumeroTests
▸ Copying /Applications/Xcode-10.1.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/lib/libXCTestBundleInject.dylib
您将看到Travis CI
将日志写入DerivedData
:
Writing diagnostic log for test session to:
/Users/travis/Library/Developer/Xcode/DerivedData/Numero-...
然后Travis CI
开始test session NumeroTests
:
Beginning test session NumeroTests-B7DA7C58-1134-45E5-AD03-87B9C1FFA667 at 2019-02-16 22:14:12.074 with Xcode 10B61 on target <DVTiPhoneSimulator: 0x7fd75cbf3cc0> {
SimDevice: iPhone 8 (ADFB69A9-BD7C-45E7-BEBA-6E438C39952C, iOS 12.2, Shutdown)
} (12.1 (16B91))
All tests
Test Suite NumeroTests.xctest started
ConverterTests
✗ testConversionForOne, XCTAssertEqual failed: ("") is not equal to ("I") - Conversion for 1 is incorrect
NumeroTests.ConverterTests
testConversionForOne, XCTAssertEqual failed: ("") is not equal to ("I") - Conversion for 1 is incorrect
/Users/travis/build/mataharimau/Numero/NumeroTests/ConverterTests.swift:27
let result = converter.convert(1)
XCTAssertEqual(result, "I", "Conversion for 1 is incorrect")
}
Executed 1 test, with 1 failure (0 unexpected) in 0.017 (0.019) seconds
</code>
正如我所猜测的,测试失败了,日志报告了这个:
Failing tests:
ConverterTests.testConversionForOne()
** TEST FAILED **
现在查看您的电子邮件帐户以获取通知:
Using fastlane With Travis
事实上,使用fastlane
可以让您的CI
生活更轻松。 您可能会将其视为简化App Store
部署的超级助手,但它也可以通过使用fastlane scan
自动执行单元测试来帮助CI
。
而且因为Travis CI
非常适应,所以你甚至不必在Mac
上安装fastlane
。
打开.travis.yml
进行编辑,用以下代码替换最后四行:
script:
- fastlane scan
就这些 - 您只需指定Xcode
版本和Swift
语言,然后fastlane
负责其余部分!
现在编辑Converter.swift
中的代码,使您的单元测试通过。 starter
项目有一个convert(_ :)
方法,它返回一个空String
。 更改它以便返回“I”
:
return "I"
提交并推送到GitHub
。 在Travis CI Numero
存储库页面上,单击Build History
,然后单击#2
- 可以received, booting or started
其状态。
这次,Travis CI
引导虚拟机(VM)
:
Job log
显示了使用Swift
,macOS 10.14.4
和各种实用程序的VM
配置。 然后Travis CI
运行fastlane
,它运行xcodebuild
命令:
$ fastlane scan
...
$ xcodebuild -showBuildSettings -scheme Numero -project ./Numero.xcodeproj
Cool - fastlane
为您自己计算出您在第一个.travis.yml
文件中编写的scheme
和项目值! 然后fastlane
找到了一个模拟器 - 它只是模拟器列表中的第一个,即5s
。 fastlane
默认使用最新的iOS:
Found simulator "iPhone 5s (12.2)"
注意:使用
--device
选项告诉fastlane
使用特定的模拟器设备,例如--device“iPhone 8”
。 这对UI测试很有用。 类似命名的--devices
(复数)选项允许您指定与服务器连接的物理设备数组。 此选项对Travis CI
无用,因为它不支持针对实际的iOS设备运行测试。
然后fastlane
显示一个很长的扫描表摘要Summary for scan
,并最终显示测试结果:
+--------------------+---+
| Test Results |
+--------------------+---+
| Number of tests | 1 |
| Number of failures | 0 |
+--------------------+---+
...
The command "fastlane scan" exited with 0.
Done. Your build exited with 0.
这一次,构建成功了! 但是你知道会发生这种情况。 这是您邮箱中的好消息:
可以庆祝下了
注意:您可以自定义Travis CI构建customize the Travis CI build,包括构建超时,自动取消以仅构建最新提交,安全列表或阻止分支,以及 - 我最喜欢 - 通过在提交消息中包含
[skip travis]
来跳过构建。 只有在出现问题时我才能找到发送电子邮件的方法:这是你可以在Jenkins
中配置的 - 事实上,这是默认行为。
后记
本篇主要讲述了GitHub, Fastlane & Jenkins集成,感兴趣的给个赞或者关注~~~