App的分发测试(五) —— GitHub, Fastlane & Jenkins集成(一)

版本记录

版本号 时间
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 - 一个经过实战测试的系统,它是免费的,相当容易安装和设置,并且完全可配置。它适用于GitHubfastlane

注意:本教程假设您熟悉使用GitHub进行基本版本控制,编写单元测试以及使用命令行。

打开初始项目,在Numero-Starter文件夹中构建并运行应用程序。

在浏览器中,登录您的GitHub帐户,或创建一个GitHub帐户(如果您还没有)。

Numero项目已经有一个git存储库和一个为SwiftmacOS量身定制的.gitignore文件。 使用您喜欢的方法将其推送到您的GitHub帐户。


Doing CI With Travis CI

如果您在GitHub上托管了存储库,那么Travis CI是开始持续集成的最简单方法。 该服务对于公共存储库是免费的。

1. Setting Up Travis

设置Travis帐户非常简单。 只需访问Travis-ci.com,然后使用GitHub登录。

App的分发测试(五) —— GitHub, Fastlane & Jenkins集成(一)_第1张图片

因为您已经登录GitHub,所以甚至不需要输入您的GitHub用户名 - Travis就知道了!

单击Authorize travis-ci

App的分发测试(五) —— GitHub, Fastlane & Jenkins集成(一)_第2张图片

Travis创建您的个人资料,包括您的GitHub个人资料图片和您的公共GitHub存储库。 单击绿色的大绿色激活Activate按钮,在您的GitHub帐户中安装Travis-CI。 您可能必须在浏览器完成后刷新浏览器以查看您的存储库。

App的分发测试(五) —— GitHub, Fastlane & Jenkins集成(一)_第3张图片

单击Numero以显示其存储库页面:

App的分发测试(五) —— GitHub, Fastlane & Jenkins集成(一)_第4张图片

没有这个存储库的构建 - 您将立即处理它!

注意:如果要激活另一个存储库,请单击My Repositories旁边的+按钮。如果您没有看到所有存储库,请单击Sync account,然后重新加载页面。

2. Your First Travis Build

要设置Travis CI,你需要向Numero添加两个东西 - 一个单元测试,所以Travis有事情要做,还有一个.travis.yml文件,所以Travis知道怎么做。然后你将你的本地仓库推送到GitHubTravis 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

App的分发测试(五) —— GitHub, Fastlane & Jenkins集成(一)_第5张图片

这可确保Travis CI在运行Numero时运行测试。

好的,这是第一个完成的任务。 现在进行第二项任务。

Creating .travis.yml

创建.travis.yml文件 - 在Terminal中,cdNumero项目的根目录,然后输入以下命令在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。 很快你就会看到你的第一个构建开始:

App的分发测试(五) —— GitHub, Fastlane & Jenkins集成(一)_第6张图片

现在单击#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  {
  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

正如我所猜测的,测试失败了,日志报告了这个:

Failing tests:
   ConverterTests.testConversionForOne()
** TEST FAILED **

现在查看您的电子邮件帐户以获取通知:

App的分发测试(五) —— GitHub, Fastlane & Jenkins集成(一)_第7张图片

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其状态。

App的分发测试(五) —— GitHub, Fastlane & Jenkins集成(一)_第8张图片

这次,Travis CI引导虚拟机(VM)

App的分发测试(五) —— GitHub, Fastlane & Jenkins集成(一)_第9张图片

Job log显示了使用SwiftmacOS 10.14.4和各种实用程序的VM配置。 然后Travis CI运行fastlane,它运行xcodebuild命令:

$ fastlane scan
...
$ xcodebuild -showBuildSettings -scheme Numero -project ./Numero.xcodeproj

Cool - fastlane为您自己计算出您在第一个.travis.yml文件中编写的scheme和项目值! 然后fastlane找到了一个模拟器 - 它只是模拟器列表中的第一个,即5sfastlane默认使用最新的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.

这一次,构建成功了! 但是你知道会发生这种情况。 这是您邮箱中的好消息:

App的分发测试(五) —— GitHub, Fastlane & Jenkins集成(一)_第10张图片

可以庆祝下了

App的分发测试(五) —— GitHub, Fastlane & Jenkins集成(一)_第11张图片

注意:您可以自定义Travis CI构建customize the Travis CI build,包括构建超时,自动取消以仅构建最新提交,安全列表或阻止分支,以及 - 我最喜欢 - 通过在提交消息中包含[skip travis]来跳过构建。 只有在出现问题时我才能找到发送电子邮件的方法:这是你可以在Jenkins中配置的 - 事实上,这是默认行为。

后记

本篇主要讲述了GitHub, Fastlane & Jenkins集成,感兴趣的给个赞或者关注~~~

App的分发测试(五) —— GitHub, Fastlane & Jenkins集成(一)_第12张图片

你可能感兴趣的:(App的分发测试(五) —— GitHub, Fastlane & Jenkins集成(一))