3. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
本発表のゴール
? 皆さんが、自らのアプリでテストを書き始める
? そして、テストについて苦悩する苦悩する
? 苦悩したことを勉強会などで共有する
約1年後
? iOSDC2017にテスト関係で発表を申し込む
? 誰か1人でもiOSDC2017でテスト関係で発表する
4. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
今日、皆さんに話すこと
? iOSアプリ開発でテストってどうしていますか?
? E2Eテストしていますか?
? マニュアルテストにまかせていませんか?
? テストは(基本的に)書いたほうが良い
? しかし、iOSアプリ開発におけるテストって「何ができるのか」「何からはじめ
たら良いか」分かっていなかったりしませんか?
? iOSアプリ開発においても(以前より)色々できるようになってきています
? そこで、どのようなものがあるのか(の一部)を皆さんに紹介します
? 色々とありますが、「コレだ」というベストのものは無く、プロジェクト
に応じて利用するものは変えたほうが良い
5. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
今日の発表の流れ
? 最近のiOSアプリ開発のテスト環境についての紹介
1. テストを書くために
? UIテスティングフレームワーク
2. 書いたテストを動かすために
? 実行環境
3. 継続的にテストを動かし続けるために
? CI環境
? テスト環境の例を紹介
? テスト環境があるときのリリースフローの例を紹介
? まとめ
6. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
本日話さないこと
? 以下については話しきれませんので省略
? 自動テストのテスト戦略
? 自動テストの書き方
? UIテストを書き続けるつらみ
? Appleのつらみ
? CI環境のつらみ
? ここは少々Kyobashi.swift#2で話しました
ここらへんは別の機会に
7. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
iOSアプリ開発をとりまくテスト環境(の一例)
UIテスティングフレームワーク 実行環境 CI
XCUITest AWS Device Farm Jenkins
EarlGrey Xamarin Test Cloud CircleCI
Appium iOSシミュレーター
iOS実機
Androidに比べるとツライ面もあるが以前よりは良くなっている
※他にも多数あります※
8. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
UIテスティングフレームワーク
一番注意して選ぶべきところ
別に1つで全てのテストを書かなくても良いのです
9. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
UIテスティングフレームワーク
? プロダクトコードと一緒
? XCUITest
? Apple純正
? OS ver: iOS9 ?
? EarlGrey
? Google製
? プロダクトコードとは別(アプリがあればOK)
? Appium
? iOS / Androidに対応
? RspecやJUnitなどが使える
10. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
サンプルアプリ x UIテスティングフレームワーク
[Swiftで書かれた簡単なアプリ]
? 機能説明
? 上記のタブをタップしたら下部の
ページが対応するページに遷移する
今回のサンプルテストは以下
? Action:
? 上部の2をタップ
? Result:
? 下部のページが2と書かれたページに遷
移する
サンプルアプリ
11. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
XCUITest
import XCTest
class SampleUITest: XCTestCase {
private let app: XCUIApplication = XCUIApplication()
override func setUp() {
super.setUp()
continueAfterFailure = false
app.launch()
}
override func tearDown() {
super.tearDown()
app.terminate()
}
//testというprefixが必要
func test上部の2のタブをタップするとページ2に遷移する() {
let pageNumber = “2”
app.scrollViews.otherElements.staticTexts[pageNumber].tap()
XCTAssertTrue(app.scrollViews.elementBoundByIndex(1).staticTexts[pageNumber].exists)
}
}
サンプルコード
ユニークなidを利用せずにテス
トコードを書いた場合の例
.existsは、その要素が存在するか
どうかでtrue/falseが返ってくる。
※従ってhidden=trueでもtrueが
返ってくる。
12. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
EarlGrey
import XCTest
class SampleUITest: XCTestCase {
let earlgray = EarlGrey()
override func setUp() {
super.setUp()
}
override func tearDown() {
super.tearDown()
}
//testというprefixが必要
func test上部の2のタブをタップするとページ2に遷移する() {
let pageNumber = 2
let pageLabel= “label-” + pageNumber
earlgray .selectElementWithMatcher(grey_accessibilityLabel(pageNumber )).performAction(grey_tap())
earlgray .selectElementWithMatcher(grey_accessibilityLabel(pageLabel)).assertWithMatcher(grey_sufficientlyVisible())
}
}
サンプルコード
SetupはCocoaPodsを使っておこなうことを推奨。
基本的に要素にuniqueなidをふることを推奨している。
(テストを書く上では当然な行為だと思います)
要参考
https://github.com/google/EarlGrey/blob/1.0.0/docs/api.md
13. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
Appium
describe “画面遷移テスト” do
before(:each) do
end
after(:each) do
end
let(:pageNumber) { “2” }
it “上部の2のタブをタップするとページ2に遷移する” do
find_element(:name, pageNumber).click()
pageTitle= find_element(:name, “label” + pageNumbe).text
expect(pageTitle).to eq(pageNumber)
end
end
サンプルコード(Rspec)
AppiumはXCTestやEarlGreyとはアー
キテクチャーが異なる点に注意
※左のコード以外にも必要なコードがあります。
上記のサンプルコードはRspecなので、describe/itなどが使えます。
要素の取得には、accessibilityIdentifierやaccessibilityLabelやXpathを使用しておこないます。
上記の例では、accessibilityLabelを使用しています。
14. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
UIテストを書くときのTips
? iOSシミュレーターのAcccessibility Inspectorは便利
? 要素にuniqueなidは必須
? 無くても書けるが後で苦労する
? テスト名は分かりやすくする
? 無理して英語にしなくても良い
? 頑張り過ぎない
? 単にスクリーンショットを撮るレベルにするのも1つの手
? CIに載せておいて、結果が全員が見えるようにしておく
? 手元だけで動く状態だと確実に廃れていく
15. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
自動テストの実行環境
Androidに比べて非常に面倒なのがコレですよね