SlideShare uma empresa Scribd logo
1 de 25
Copyright © DeNA Co.,Ltd. All Rights Reserved.
iOSDC Reject Conference days2
2016/08/31(Wed)
平田敏之@DeNA
iOSアプリ開発のテスト環境
- テストをはじめる最初の一歩 -
Copyright © DeNA Co.,Ltd. All Rights Reserved.
自己紹介
 平田 敏之
⁃ 経歴
• GWの開発 → ホムペサービスの開発、iOSアプリの開発 → SWET
⁃ SWET(Software Engineer in Test)
• ミッション
⁃ DeNAサービス全般の品質向上
⁃ DeNAエンジニアの開発生産性向上
• 事業サポートチーム / テスト基盤チーム
⁃ 私がやっていること(の一部)
• クライアントアプリ周りのテスト戦略、自動テストの開発
• CI/CD環境整備
• テスト基盤環境の開発
Copyright © DeNA Co.,Ltd. All Rights Reserved.
本発表のゴール
 皆さんが、自らのアプリでテストを書き始める
 そして、テストについて苦悩する苦悩する
 苦悩したことを勉強会などで共有する
約1年後
 iOSDC2017にテスト関係で発表を申し込む
 誰か1人でもiOSDC2017でテスト関係で発表する
Copyright © DeNA Co.,Ltd. All Rights Reserved.
今日、皆さんに話すこと
 iOSアプリ開発でテストってどうしていますか?
 E2Eテストしていますか?
 マニュアルテストにまかせていませんか?
 テストは(基本的に)書いたほうが良い
 しかし、iOSアプリ開発におけるテストって「何ができるのか」「何からはじめ
たら良いか」分かっていなかったりしませんか?
 iOSアプリ開発においても(以前より)色々できるようになってきています
 そこで、どのようなものがあるのか(の一部)を皆さんに紹介します
⁃ 色々とありますが、「コレだ」というベストのものは無く、プロジェクト
に応じて利用するものは変えたほうが良い
Copyright © DeNA Co.,Ltd. All Rights Reserved.
今日の発表の流れ
 最近のiOSアプリ開発のテスト環境についての紹介
1. テストを書くために
• UIテスティングフレームワーク
2. 書いたテストを動かすために
• 実行環境
3. 継続的にテストを動かし続けるために
• CI環境
 テスト環境の例を紹介
⁃ テスト環境があるときのリリースフローの例を紹介
 まとめ
Copyright © DeNA Co.,Ltd. All Rights Reserved.
本日話さないこと
 以下については話しきれませんので省略
⁃ 自動テストのテスト戦略
⁃ 自動テストの書き方
⁃ UIテストを書き続けるつらみ
⁃ Appleのつらみ
⁃ CI環境のつらみ
• ここは少々Kyobashi.swift#2で話しました
ここらへんは別の機会に
Copyright © DeNA Co.,Ltd. All Rights Reserved.
iOSアプリ開発をとりまくテスト環境(の一例)
UIテスティングフレームワーク 実行環境 CI
XCUITest AWS Device Farm Jenkins
EarlGrey Xamarin Test Cloud CircleCI
Appium iOSシミュレーター
iOS実機
Androidに比べるとツライ面もあるが以前よりは良くなっている
※他にも多数あります※
Copyright © DeNA Co.,Ltd. All Rights Reserved.
UIテスティングフレームワーク
一番注意して選ぶべきところ
別に1つで全てのテストを書かなくても良いのです
Copyright © DeNA Co.,Ltd. All Rights Reserved.
UIテスティングフレームワーク
 プロダクトコードと一緒
⁃ XCUITest
• Apple純正
• OS ver: iOS9 〜
⁃ EarlGrey
• Google製
 プロダクトコードとは別(アプリがあればOK)
⁃ Appium
• iOS / Androidに対応
• RspecやJUnitなどが使える
Copyright © DeNA Co.,Ltd. All Rights Reserved.
サンプルアプリ x UIテスティングフレームワーク
[Swiftで書かれた簡単なアプリ]
 機能説明
⁃ 上記のタブをタップしたら下部の
ページが対応するページに遷移する
今回のサンプルテストは以下
⁃ Action:
• 上部の2をタップ
⁃ Result:
• 下部のページが2と書かれたページに遷
移する
サンプルアプリ
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が
返ってくる。
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
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を使用しています。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
UIテストを書くときのTips
 iOSシミュレーターのAcccessibility Inspectorは便利
 要素にuniqueなidは必須
⁃ 無くても書けるが後で苦労する
 テスト名は分かりやすくする
⁃ 無理して英語にしなくても良い
 頑張り過ぎない
⁃ 単にスクリーンショットを撮るレベルにするのも1つの手
 CIに載せておいて、結果が全員が見えるようにしておく
⁃ 手元だけで動く状態だと確実に廃れていく
Copyright © DeNA Co.,Ltd. All Rights Reserved.
自動テストの実行環境
Androidに比べて非常に面倒なのがコレですよね
Copyright © DeNA Co.,Ltd. All Rights Reserved.
自動テストの実行環境(1/2)
 AWS Device Farm
⁃ 利用できるテスティングフレームワークが限られている
• Appium Java Junit / Java TestNG / Python
• Calabash
• UI Automation
• XCTest
• XCUITest
 Xamarin Test Cloud
• Cucumber(C# / Ruby)
 iOSシミュレーター
• CI環境であるMac上で起動
• あくまでもシミュレーター
 (自前の)iOS実機
• CI環境であるMacに接続している必要がある
Copyright © DeNA Co.,Ltd. All Rights Reserved.
自動テストの実行環境(2/2)
 AWS Device Farm
⁃ 💰 定額 250 USD/デバイススロット/月
⁃ 💰 0.17 USD/分
 Xamarin Test Cloud
⁃ 💰 ¥178,200(税抜き)/年間 → 1日1時間 / 1デバイス
⁃ 💰 ¥682,200(税抜き)/年間 → 1日5時間 / 3デバイス
 iOSシミュレーター
⁃ シミュレーターだから..
⁃ (基本的に)mac1台につき1iOSシミュレーター
 (自前の)iOS実機
⁃ CI環境に接続されたiOS実機を用いる形
• Jenkinsなどのようなオンプレミスでないと無理
• 資産をいかすならコレが良いのだけど運用がなかなか..
Copyright © DeNA Co.,Ltd. All Rights Reserved.
CI環境
プロジェクトの状況に応じて決めるのが良い
Copyright © DeNA Co.,Ltd. All Rights Reserved.
CI環境
 Jenkins(オンプレミス)
⁃ ど定番だが学習コストや運用コストがかかる
⁃ なんでも出来るがJenkinsおじさんも出来やすい
⁃ 見た目に抵抗がある人も…
• blueocean pluginで多少は良くなる
⁃ LTS 2.7.2 (https://jenkins.io/changelog-stable/)
 CircleCI(クラウド)
⁃ さくっと簡単に利用できる優れもの
• ただしiOSは有料になってしまいました…
⁃ Bitriseというのもあります
⁃ 痒いところに手が届かない
⁃ Enterprise版もある
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Jenkins 2.7.1(LTS) + blueocean plugin
Jenkinsも進化しています
Copyright © DeNA Co.,Ltd. All Rights Reserved.
今回紹介するテスト環境一式
Jenkins x XCUITest x iOSシミュレーター
※この環境だとさくっとすぐにはじめられます※
Copyright © DeNA Co.,Ltd. All Rights Reserved.
iOSアプリ開発のテスト環境の例(1/2)
lane :test do
scan(
sdk: 'iphonesimulator',
device: ENV[“device”],
workspace: "sample-ios-swift.xcworkspace",
scheme: "sample-ios-swift",
configuration: "Debug",
output_directory: 'test-report/',
buildlog_path: 'test-report/',
output_types: 'html, junit',
clean: true
)
end
Jenkins x XCUITest x iOSシミュレーター
XCUITest
• テストの実行はfastlane/scanを使用
• 実行するdeviceは環境変数で渡す
• テストの結果はJUnit形式、htmlファイルで出力
Jenkins (Mac上で動作)
Jenkinsのjobの設定
• ビルドパラメータを用意
• 対象branch
• ソースコード管理(Git)でのBranch Specifierで利用する
• 対象device
• groove scriptで動的表
• Dynamic Parameter pluginを利用
• xcrun simctl listコマンドを使ってiOSシミュレーター一覧は取得可能
•※実機の場合はmobiledeviceを利用するとIDも取得できる
• ビルドのシェルの実行でテストを実行
• fastlane test
• 出力結果を集計して表示
• JUnit pluginを利用
• 出力結果をslackにpost
• slack pluginを利用
fastlaneの例
Copyright © DeNA Co.,Ltd. All Rights Reserved.
iOSアプリ開発のテスト環境の例(2/2)
 Jenkinsにおけるテスト結果の表示
⁃ 右画像のように表示される
• 全てが成功した場合の例
 Jenkinsにおけるテスト結果の通知
⁃ Slackに下画像のように通知される
⁃ テストが落ちた場合は、mentionが飛ばされる
Copyright © DeNA Co.,Ltd. All Rights Reserved.
テスト環境がある場合のリリースフロー例
1. WIPでPRを出す
2. 機能を実装する
3. 上記機能のテスト観点を記述しレビュー依頼
⁃ 主にQA担当者がチェックする
⁃ これにより手動で検証する箇所を把握する
4. 上記機能のテストコードを実装
5. PR中においてはテストフレーズでテストを動かす
⁃ 例) build this please: アプリをビルドする
⁃ 例) test this please: 自動テストを実行する
• これを詠唱のように長くしてみようというアホな案を出したが、当然却下された..
6. コードのレビューはテストが全て通った後におこなう
7. 全レビュー後、merge
8. QA検証へ
⁃ 自動テストで担保している箇所は特にやらない
Copyright © DeNA Co.,Ltd. All Rights Reserved.
まとめ
 テスト周りは以前より色々とできるようになりました
 開発環境と同様にテスト環境を整えるのはプロダクトにおいて重要
 iOSアプリ開発のテスト環境を用意してみましょう
⁃ 環境を変えやすいようにしつつ作るのがベターです
 そして、テストをどんどん書いてみましょう
⁃ その先の苦悩は別の勉強会で

Mais conteúdo relacionado

Mais procurados

バージョンアップの対応を軽減するためのサービスの構築
バージョンアップの対応を軽減するためのサービスの構築バージョンアップの対応を軽減するためのサービスの構築
バージョンアップの対応を軽減するためのサービスの構築Toshiyuki Hirata
 
スマホアプリディレクターが考えていること
スマホアプリディレクターが考えていることスマホアプリディレクターが考えていること
スマホアプリディレクターが考えていることKazuaki KURIU
 
iOSアプリ開発のCI環境 - Jenkins編 -
iOSアプリ開発のCI環境 - Jenkins編 -iOSアプリ開発のCI環境 - Jenkins編 -
iOSアプリ開発のCI環境 - Jenkins編 -Toshiyuki Hirata
 
iOSアプリの自動テストをはじめよう
iOSアプリの自動テストをはじめようiOSアプリの自動テストをはじめよう
iOSアプリの自動テストをはじめようToshiyuki Hirata
 
Bluepillを使ったiOS自動テストの並列化
Bluepillを使ったiOS自動テストの並列化Bluepillを使ったiOS自動テストの並列化
Bluepillを使ったiOS自動テストの並列化Toshiyuki Hirata
 
iOSアプリ UIテスト自動化入門
iOSアプリ UIテスト自動化入門iOSアプリ UIテスト自動化入門
iOSアプリ UIテスト自動化入門Shingo Tamaki
 
バージョンアップ対応を軽減するサービス:マスティフ
バージョンアップ対応を軽減するサービス:マスティフバージョンアップ対応を軽減するサービス:マスティフ
バージョンアップ対応を軽減するサービス:マスティフToshiyuki Hirata
 
iOSで利用できるデバイスファームのメリット・デメリットの紹介
iOSで利用できるデバイスファームのメリット・デメリットの紹介iOSで利用できるデバイスファームのメリット・デメリットの紹介
iOSで利用できるデバイスファームのメリット・デメリットの紹介Shunsuke Maeda
 
Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会Koji Hasegawa
 
UIテストの実行時間の短縮の方法
UIテストの実行時間の短縮の方法UIテストの実行時間の短縮の方法
UIテストの実行時間の短縮の方法Toshiyuki Hirata
 
fastlane snapshotの並列実行についてまとめてみた
fastlane snapshotの並列実行についてまとめてみたfastlane snapshotの並列実行についてまとめてみた
fastlane snapshotの並列実行についてまとめてみたToshiyuki Hirata
 
Win7 * appium * androidで実機自動テストやってみた。
Win7 * appium * androidで実機自動テストやってみた。Win7 * appium * androidで実機自動テストやってみた。
Win7 * appium * androidで実機自動テストやってみた。Naoto Kishino
 
Pull request時の画面差分取得の自動化
Pull request時の画面差分取得の自動化Pull request時の画面差分取得の自動化
Pull request時の画面差分取得の自動化Shunsuke Maeda
 
20141018 selenium appium_cookpad
20141018 selenium appium_cookpad20141018 selenium appium_cookpad
20141018 selenium appium_cookpadKazuaki Matsuo
 
コードレビューをより良くする Danger x Android
コードレビューをより良くする Danger x Androidコードレビューをより良くする Danger x Android
コードレビューをより良くする Danger x AndroidToshiyuki Hirata
 
Dangerでpull requestレビューの指摘事項を減らす
Dangerでpull requestレビューの指摘事項を減らすDangerでpull requestレビューの指摘事項を減らす
Dangerでpull requestレビューの指摘事項を減らすShunsuke Maeda
 
iOSにおけるコードレビューを一歩先へ進める
iOSにおけるコードレビューを一歩先へ進めるiOSにおけるコードレビューを一歩先へ進める
iOSにおけるコードレビューを一歩先へ進めるShunsuke Maeda
 
JaSST'16 Tokyo モバイルセッション
JaSST'16 Tokyo モバイルセッションJaSST'16 Tokyo モバイルセッション
JaSST'16 Tokyo モバイルセッションmirer
 
Android e2e testing at mercari
Android e2e testing at mercariAndroid e2e testing at mercari
Android e2e testing at mercariVishal Banthia
 

Mais procurados (20)

バージョンアップの対応を軽減するためのサービスの構築
バージョンアップの対応を軽減するためのサービスの構築バージョンアップの対応を軽減するためのサービスの構築
バージョンアップの対応を軽減するためのサービスの構築
 
スマホアプリディレクターが考えていること
スマホアプリディレクターが考えていることスマホアプリディレクターが考えていること
スマホアプリディレクターが考えていること
 
iOSアプリ開発のCI環境 - Jenkins編 -
iOSアプリ開発のCI環境 - Jenkins編 -iOSアプリ開発のCI環境 - Jenkins編 -
iOSアプリ開発のCI環境 - Jenkins編 -
 
iOSアプリの自動テストをはじめよう
iOSアプリの自動テストをはじめようiOSアプリの自動テストをはじめよう
iOSアプリの自動テストをはじめよう
 
Bluepillを使ったiOS自動テストの並列化
Bluepillを使ったiOS自動テストの並列化Bluepillを使ったiOS自動テストの並列化
Bluepillを使ったiOS自動テストの並列化
 
iOSアプリ UIテスト自動化入門
iOSアプリ UIテスト自動化入門iOSアプリ UIテスト自動化入門
iOSアプリ UIテスト自動化入門
 
バージョンアップ対応を軽減するサービス:マスティフ
バージョンアップ対応を軽減するサービス:マスティフバージョンアップ対応を軽減するサービス:マスティフ
バージョンアップ対応を軽減するサービス:マスティフ
 
iOSで利用できるデバイスファームのメリット・デメリットの紹介
iOSで利用できるデバイスファームのメリット・デメリットの紹介iOSで利用できるデバイスファームのメリット・デメリットの紹介
iOSで利用できるデバイスファームのメリット・デメリットの紹介
 
Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
 
DroidKaigi_devicefarm
DroidKaigi_devicefarmDroidKaigi_devicefarm
DroidKaigi_devicefarm
 
UIテストの実行時間の短縮の方法
UIテストの実行時間の短縮の方法UIテストの実行時間の短縮の方法
UIテストの実行時間の短縮の方法
 
fastlane snapshotの並列実行についてまとめてみた
fastlane snapshotの並列実行についてまとめてみたfastlane snapshotの並列実行についてまとめてみた
fastlane snapshotの並列実行についてまとめてみた
 
Win7 * appium * androidで実機自動テストやってみた。
Win7 * appium * androidで実機自動テストやってみた。Win7 * appium * androidで実機自動テストやってみた。
Win7 * appium * androidで実機自動テストやってみた。
 
Pull request時の画面差分取得の自動化
Pull request時の画面差分取得の自動化Pull request時の画面差分取得の自動化
Pull request時の画面差分取得の自動化
 
20141018 selenium appium_cookpad
20141018 selenium appium_cookpad20141018 selenium appium_cookpad
20141018 selenium appium_cookpad
 
コードレビューをより良くする Danger x Android
コードレビューをより良くする Danger x Androidコードレビューをより良くする Danger x Android
コードレビューをより良くする Danger x Android
 
Dangerでpull requestレビューの指摘事項を減らす
Dangerでpull requestレビューの指摘事項を減らすDangerでpull requestレビューの指摘事項を減らす
Dangerでpull requestレビューの指摘事項を減らす
 
iOSにおけるコードレビューを一歩先へ進める
iOSにおけるコードレビューを一歩先へ進めるiOSにおけるコードレビューを一歩先へ進める
iOSにおけるコードレビューを一歩先へ進める
 
JaSST'16 Tokyo モバイルセッション
JaSST'16 Tokyo モバイルセッションJaSST'16 Tokyo モバイルセッション
JaSST'16 Tokyo モバイルセッション
 
Android e2e testing at mercari
Android e2e testing at mercariAndroid e2e testing at mercari
Android e2e testing at mercari
 

Semelhante a iOSアプリ開発のテスト環境 - テストをはじめる最初の一歩 -

CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~SEGADevTech
 
Introduction to Visual Studio App Center
Introduction to Visual Studio App CenterIntroduction to Visual Studio App Center
Introduction to Visual Studio App CenterTakeshi Fujimoto
 
【Agile Conference tokyo 2011】 継続的フィードバック
【Agile Conference tokyo 2011】 継続的フィードバック【Agile Conference tokyo 2011】 継続的フィードバック
【Agile Conference tokyo 2011】 継続的フィードバック智治 長沢
 
Open STF Plugin 作ってみた
Open STF Plugin 作ってみたOpen STF Plugin 作ってみた
Open STF Plugin 作ってみたjustice_sm
 
Device Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テストDevice Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テスト健一 辰濱
 
【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!
【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!
【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!智治 長沢
 
福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介Mori Shingo
 
【QCon】 Get Clean, Stay Clean 価値を向上し続けるための秘訣 #QConTokyo
【QCon】 Get Clean, Stay Clean 価値を向上し続けるための秘訣 #QConTokyo 【QCon】 Get Clean, Stay Clean 価値を向上し続けるための秘訣 #QConTokyo
【QCon】 Get Clean, Stay Clean 価値を向上し続けるための秘訣 #QConTokyo 智治 長沢
 
ぼくのかんがえた iOSテスト戦略
ぼくのかんがえた iOSテスト戦略ぼくのかんがえた iOSテスト戦略
ぼくのかんがえた iOSテスト戦略Naoki Umehara
 
DeNAにおけるSWETの役割
DeNAにおけるSWETの役割DeNAにおけるSWETの役割
DeNAにおけるSWETの役割Toshiyuki Hirata
 
Windows 8 Developers カンファレンス
Windows 8 Developers カンファレンスWindows 8 Developers カンファレンス
Windows 8 Developers カンファレンスKaoru NAKAMURA
 
Androidリリース作業の効率化(2)
Androidリリース作業の効率化(2)Androidリリース作業の効率化(2)
Androidリリース作業の効率化(2)Kenichi Kambara
 
5minQues - SWET近況報告
5minQues - SWET近況報告5minQues - SWET近況報告
5minQues - SWET近況報告Masaki Nakagawa
 
Androidテスティング実践3 ユニットテスト・CI編
Androidテスティング実践3 ユニットテスト・CI編Androidテスティング実践3 ユニットテスト・CI編
Androidテスティング実践3 ユニットテスト・CI編株式会社 NTTテクノクロス
 
Sharoid Service Menu
Sharoid Service MenuSharoid Service Menu
Sharoid Service Menusharoid
 
テスト自動化の現場で困ること SI-Toolkitが解決すること
テスト自動化の現場で困ること SI-Toolkitが解決することテスト自動化の現場で困ること SI-Toolkitが解決すること
テスト自動化の現場で困ること SI-Toolkitが解決することyuichi_kuwahara
 
Agile japan2010 rakuten様プレゼン資料
Agile japan2010 rakuten様プレゼン資料Agile japan2010 rakuten様プレゼン資料
Agile japan2010 rakuten様プレゼン資料Akiko Kosaka
 

Semelhante a iOSアプリ開発のテスト環境 - テストをはじめる最初の一歩 - (20)

CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
 
快適・簡単・安心なアプリE2Eテストの実行環境 #stac2017
快適・簡単・安心なアプリE2Eテストの実行環境 #stac2017快適・簡単・安心なアプリE2Eテストの実行環境 #stac2017
快適・簡単・安心なアプリE2Eテストの実行環境 #stac2017
 
Introduction to Visual Studio App Center
Introduction to Visual Studio App CenterIntroduction to Visual Studio App Center
Introduction to Visual Studio App Center
 
【Agile Conference tokyo 2011】 継続的フィードバック
【Agile Conference tokyo 2011】 継続的フィードバック【Agile Conference tokyo 2011】 継続的フィードバック
【Agile Conference tokyo 2011】 継続的フィードバック
 
Open STF Plugin 作ってみた
Open STF Plugin 作ってみたOpen STF Plugin 作ってみた
Open STF Plugin 作ってみた
 
Device Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テストDevice Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テスト
 
【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!
【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!
【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!
 
福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介
 
【QCon】 Get Clean, Stay Clean 価値を向上し続けるための秘訣 #QConTokyo
【QCon】 Get Clean, Stay Clean 価値を向上し続けるための秘訣 #QConTokyo 【QCon】 Get Clean, Stay Clean 価値を向上し続けるための秘訣 #QConTokyo
【QCon】 Get Clean, Stay Clean 価値を向上し続けるための秘訣 #QConTokyo
 
ぼくのかんがえた iOSテスト戦略
ぼくのかんがえた iOSテスト戦略ぼくのかんがえた iOSテスト戦略
ぼくのかんがえた iOSテスト戦略
 
DeNAにおけるSWETの役割
DeNAにおけるSWETの役割DeNAにおけるSWETの役割
DeNAにおけるSWETの役割
 
Windows 8 Developers カンファレンス
Windows 8 Developers カンファレンスWindows 8 Developers カンファレンス
Windows 8 Developers カンファレンス
 
Androidリリース作業の効率化(2)
Androidリリース作業の効率化(2)Androidリリース作業の効率化(2)
Androidリリース作業の効率化(2)
 
5minQues - SWET近況報告
5minQues - SWET近況報告5minQues - SWET近況報告
5minQues - SWET近況報告
 
Androidテスティング実践3 ユニットテスト・CI編
Androidテスティング実践3 ユニットテスト・CI編Androidテスティング実践3 ユニットテスト・CI編
Androidテスティング実践3 ユニットテスト・CI編
 
Sharoid Service Menu
Sharoid Service MenuSharoid Service Menu
Sharoid Service Menu
 
Androidテスティング実践2 システムテスト編
Androidテスティング実践2 システムテスト編Androidテスティング実践2 システムテスト編
Androidテスティング実践2 システムテスト編
 
テスト自動化の現場で困ること SI-Toolkitが解決すること
テスト自動化の現場で困ること SI-Toolkitが解決することテスト自動化の現場で困ること SI-Toolkitが解決すること
テスト自動化の現場で困ること SI-Toolkitが解決すること
 
Androidアプリケーション開発中級研修 前編
Androidアプリケーション開発中級研修 前編Androidアプリケーション開発中級研修 前編
Androidアプリケーション開発中級研修 前編
 
Agile japan2010 rakuten様プレゼン資料
Agile japan2010 rakuten様プレゼン資料Agile japan2010 rakuten様プレゼン資料
Agile japan2010 rakuten様プレゼン資料
 

Mais de Toshiyuki Hirata

iOSにおけるパフォーマンス計測
iOSにおけるパフォーマンス計測iOSにおけるパフォーマンス計測
iOSにおけるパフォーマンス計測Toshiyuki Hirata
 
iOSにおけるパフォーマンス計測
iOSにおけるパフォーマンス計測iOSにおけるパフォーマンス計測
iOSにおけるパフォーマンス計測Toshiyuki Hirata
 
iOSにおける自動テストの並列化
iOSにおける自動テストの並列化iOSにおける自動テストの並列化
iOSにおける自動テストの並列化Toshiyuki Hirata
 
UIテスト(Espresso)の高速化をさらにすすめる
UIテスト(Espresso)の高速化をさらにすすめるUIテスト(Espresso)の高速化をさらにすすめる
UIテスト(Espresso)の高速化をさらにすすめるToshiyuki Hirata
 
Xcode10での テスト周りの進化をふりかえる
Xcode10での テスト周りの進化をふりかえるXcode10での テスト周りの進化をふりかえる
Xcode10での テスト周りの進化をふりかえるToshiyuki Hirata
 
UIテストの実行時間を短縮させる方法
UIテストの実行時間を短縮させる方法UIテストの実行時間を短縮させる方法
UIテストの実行時間を短縮させる方法Toshiyuki Hirata
 
我が家のLINEを中心とした情報共有
我が家のLINEを中心とした情報共有我が家のLINEを中心とした情報共有
我が家のLINEを中心とした情報共有Toshiyuki Hirata
 
レビューのコストを削減するための施策
レビューのコストを削減するための施策レビューのコストを削減するための施策
レビューのコストを削減するための施策Toshiyuki Hirata
 

Mais de Toshiyuki Hirata (8)

iOSにおけるパフォーマンス計測
iOSにおけるパフォーマンス計測iOSにおけるパフォーマンス計測
iOSにおけるパフォーマンス計測
 
iOSにおけるパフォーマンス計測
iOSにおけるパフォーマンス計測iOSにおけるパフォーマンス計測
iOSにおけるパフォーマンス計測
 
iOSにおける自動テストの並列化
iOSにおける自動テストの並列化iOSにおける自動テストの並列化
iOSにおける自動テストの並列化
 
UIテスト(Espresso)の高速化をさらにすすめる
UIテスト(Espresso)の高速化をさらにすすめるUIテスト(Espresso)の高速化をさらにすすめる
UIテスト(Espresso)の高速化をさらにすすめる
 
Xcode10での テスト周りの進化をふりかえる
Xcode10での テスト周りの進化をふりかえるXcode10での テスト周りの進化をふりかえる
Xcode10での テスト周りの進化をふりかえる
 
UIテストの実行時間を短縮させる方法
UIテストの実行時間を短縮させる方法UIテストの実行時間を短縮させる方法
UIテストの実行時間を短縮させる方法
 
我が家のLINEを中心とした情報共有
我が家のLINEを中心とした情報共有我が家のLINEを中心とした情報共有
我が家のLINEを中心とした情報共有
 
レビューのコストを削減するための施策
レビューのコストを削減するための施策レビューのコストを削減するための施策
レビューのコストを削減するための施策
 

iOSアプリ開発のテスト環境 - テストをはじめる最初の一歩 -

  • 1. Copyright © DeNA Co.,Ltd. All Rights Reserved. iOSDC Reject Conference days2 2016/08/31(Wed) 平田敏之@DeNA iOSアプリ開発のテスト環境 - テストをはじめる最初の一歩 -
  • 2. Copyright © DeNA Co.,Ltd. All Rights Reserved. 自己紹介  平田 敏之 ⁃ 経歴 • GWの開発 → ホムペサービスの開発、iOSアプリの開発 → SWET ⁃ SWET(Software Engineer in Test) • ミッション ⁃ DeNAサービス全般の品質向上 ⁃ DeNAエンジニアの開発生産性向上 • 事業サポートチーム / テスト基盤チーム ⁃ 私がやっていること(の一部) • クライアントアプリ周りのテスト戦略、自動テストの開発 • CI/CD環境整備 • テスト基盤環境の開発
  • 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に比べて非常に面倒なのがコレですよね
  • 16. Copyright © DeNA Co.,Ltd. All Rights Reserved. 自動テストの実行環境(1/2)  AWS Device Farm ⁃ 利用できるテスティングフレームワークが限られている • Appium Java Junit / Java TestNG / Python • Calabash • UI Automation • XCTest • XCUITest  Xamarin Test Cloud • Cucumber(C# / Ruby)  iOSシミュレーター • CI環境であるMac上で起動 • あくまでもシミュレーター  (自前の)iOS実機 • CI環境であるMacに接続している必要がある
  • 17. Copyright © DeNA Co.,Ltd. All Rights Reserved. 自動テストの実行環境(2/2)  AWS Device Farm ⁃ 💰 定額 250 USD/デバイススロット/月 ⁃ 💰 0.17 USD/分  Xamarin Test Cloud ⁃ 💰 ¥178,200(税抜き)/年間 → 1日1時間 / 1デバイス ⁃ 💰 ¥682,200(税抜き)/年間 → 1日5時間 / 3デバイス  iOSシミュレーター ⁃ シミュレーターだから.. ⁃ (基本的に)mac1台につき1iOSシミュレーター  (自前の)iOS実機 ⁃ CI環境に接続されたiOS実機を用いる形 • Jenkinsなどのようなオンプレミスでないと無理 • 資産をいかすならコレが良いのだけど運用がなかなか..
  • 18. Copyright © DeNA Co.,Ltd. All Rights Reserved. CI環境 プロジェクトの状況に応じて決めるのが良い
  • 19. Copyright © DeNA Co.,Ltd. All Rights Reserved. CI環境  Jenkins(オンプレミス) ⁃ ど定番だが学習コストや運用コストがかかる ⁃ なんでも出来るがJenkinsおじさんも出来やすい ⁃ 見た目に抵抗がある人も… • blueocean pluginで多少は良くなる ⁃ LTS 2.7.2 (https://jenkins.io/changelog-stable/)  CircleCI(クラウド) ⁃ さくっと簡単に利用できる優れもの • ただしiOSは有料になってしまいました… ⁃ Bitriseというのもあります ⁃ 痒いところに手が届かない ⁃ Enterprise版もある
  • 20. Copyright © DeNA Co.,Ltd. All Rights Reserved. Jenkins 2.7.1(LTS) + blueocean plugin Jenkinsも進化しています
  • 21. Copyright © DeNA Co.,Ltd. All Rights Reserved. 今回紹介するテスト環境一式 Jenkins x XCUITest x iOSシミュレーター ※この環境だとさくっとすぐにはじめられます※
  • 22. Copyright © DeNA Co.,Ltd. All Rights Reserved. iOSアプリ開発のテスト環境の例(1/2) lane :test do scan( sdk: 'iphonesimulator', device: ENV[“device”], workspace: "sample-ios-swift.xcworkspace", scheme: "sample-ios-swift", configuration: "Debug", output_directory: 'test-report/', buildlog_path: 'test-report/', output_types: 'html, junit', clean: true ) end Jenkins x XCUITest x iOSシミュレーター XCUITest • テストの実行はfastlane/scanを使用 • 実行するdeviceは環境変数で渡す • テストの結果はJUnit形式、htmlファイルで出力 Jenkins (Mac上で動作) Jenkinsのjobの設定 • ビルドパラメータを用意 • 対象branch • ソースコード管理(Git)でのBranch Specifierで利用する • 対象device • groove scriptで動的表 • Dynamic Parameter pluginを利用 • xcrun simctl listコマンドを使ってiOSシミュレーター一覧は取得可能 •※実機の場合はmobiledeviceを利用するとIDも取得できる • ビルドのシェルの実行でテストを実行 • fastlane test • 出力結果を集計して表示 • JUnit pluginを利用 • 出力結果をslackにpost • slack pluginを利用 fastlaneの例
  • 23. Copyright © DeNA Co.,Ltd. All Rights Reserved. iOSアプリ開発のテスト環境の例(2/2)  Jenkinsにおけるテスト結果の表示 ⁃ 右画像のように表示される • 全てが成功した場合の例  Jenkinsにおけるテスト結果の通知 ⁃ Slackに下画像のように通知される ⁃ テストが落ちた場合は、mentionが飛ばされる
  • 24. Copyright © DeNA Co.,Ltd. All Rights Reserved. テスト環境がある場合のリリースフロー例 1. WIPでPRを出す 2. 機能を実装する 3. 上記機能のテスト観点を記述しレビュー依頼 ⁃ 主にQA担当者がチェックする ⁃ これにより手動で検証する箇所を把握する 4. 上記機能のテストコードを実装 5. PR中においてはテストフレーズでテストを動かす ⁃ 例) build this please: アプリをビルドする ⁃ 例) test this please: 自動テストを実行する • これを詠唱のように長くしてみようというアホな案を出したが、当然却下された.. 6. コードのレビューはテストが全て通った後におこなう 7. 全レビュー後、merge 8. QA検証へ ⁃ 自動テストで担保している箇所は特にやらない
  • 25. Copyright © DeNA Co.,Ltd. All Rights Reserved. まとめ  テスト周りは以前より色々とできるようになりました  開発環境と同様にテスト環境を整えるのはプロダクトにおいて重要  iOSアプリ開発のテスト環境を用意してみましょう ⁃ 環境を変えやすいようにしつつ作るのがベターです  そして、テストをどんどん書いてみましょう ⁃ その先の苦悩は別の勉強会で