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登录。

因为您已经登录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知道怎么做。然后你将你的本地仓库推送到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

这可确保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 CImacOS 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显示了使用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.

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

可以庆祝下了

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

后记

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容