Slide 1

Slide 1 text

1 Confidential - Do Not Share UIテスト結果の可視化を進めよう! 〜Allure導入〜 メルカリ AQA 関根 康史 おれたま@AHA_oretama

Slide 2

Slide 2 text

2 Confidential - Do Not Share Automation&QA Group(通称AQA) ● 半年前にジョイン ● テスト自動化 ○ Appium, WebdriverIO, Espresso… ○ CI/CD Links ● https://github.com/aha-oretama ● https://www.slideshare.net/aha_oretama ● https://speakerdeck.com/ahaoretama 関根 康史 おれたま@AHA_oretama

Slide 3

Slide 3 text

3 Confidential - Do Not Share 話すこと/話さないこと 今回話すこと ● UIテスト結果の可視化の重要性 ● Allureの技術的なポイント 今回話さないこと ● Allure以外の技術要素 ● チームへの導入事例や実際の効果など

Slide 4

Slide 4 text

4 Confidential - Do Not Share 狙い UIテストのデファクトレポートツールになりつつある Allureについて、技術的なポイントを紹介することで 利用者が増え、情報交換できるようになりたい

Slide 5

Slide 5 text

5 Confidential - Do Not Share UIテスト結果の可視化の重要性について アジェンダ Allureの導入と技術的なポイント まとめ 02 03 01

Slide 6

Slide 6 text

6 Confidential - Do Not Share UIテスト結果の可視化の重要性について アジェンダ Allureの導入と技術的なポイント まとめ 02 03 01

Slide 7

Slide 7 text

7 Confidential - Do Not Share テストピラミッド 上に行くほど ● 忠実度が高い ● 不安定 ● 実行時間がかかる

Slide 8

Slide 8 text

8 Confidential - Do Not Share 特徴 問題点 不安定 メンテナンスコストが増える 実行時間 実行時間が長いため、実行頻度が少なくなりがち その間にアプリケーション、テストスクリプトに 複数の修正がされやすくなる → 作るよりも運用していくことが難しい UIテストの問題

Slide 9

Slide 9 text

9 Confidential - Do Not Share 可視化することで改善できる!

Slide 10

Slide 10 text

10 Confidential - Do Not Share テスト結果の可視化の目的とその効果 ● テスト結果を見やすくする ○ テスト結果を見るだけで原因をつかみ、対策を打つことができ、 効率的にメンテナンスができる ● 変化に気づけるようにする ○ 変化に気づければ、新たな問題を早期にキャッチアップできる ● 改善へのインスペクションを与える ○ 表面化しにくい、さまざまな問題に気づいて 改善への第一歩が踏み出せる

Slide 11

Slide 11 text

11 Confidential - Do Not Share UIテストの問題 特徴 問題点 不安定 メンテナンスコストが増える 実行時間 実行時間が長いため、実行頻度が少なくなりがち その間にアプリケーション、テストスクリプトに 複数の修正がされやすくなる → 作るよりも運用していくことが難しい

Slide 12

Slide 12 text

12 Confidential - Do Not Share テスト結果を見やすくする テスト結果の可視化を進める 変化に気づけるようにする 改善へのインスペクションを与える 02 03 01 Allure Looker https://tech.mercari.com/entry/2019/02/12/080000

Slide 13

Slide 13 text

13 Confidential - Do Not Share テスト結果を見やすくする テスト結果の可視化を進める 変化に気づけるようにする 改善へのインスペクションを与える 02 03 01 Allure Looker https://tech.mercari.com/entry/2019/02/12/080000

Slide 14

Slide 14 text

14 Confidential - Do Not Share UIテスト結果の可視化の重要性について アジェンダ Allureの導入と技術的なポイント まとめ 02 03 01

Slide 15

Slide 15 text

15 Confidential - Do Not Share Allure 導入 Allureの導入と技術的なポイント 並列実行 / 端末情報の付与 失敗時情報の追加 02 03 01 実行時情報の追加 04 Turnip対応 05 Retry対応 06

Slide 16

Slide 16 text

16 Confidential - Do Not Share Allure 導入 Allureの導入と技術的なポイント 並列実行 / 端末情報の付与 失敗時情報の追加 02 03 01 実行時情報の追加 04 Turnip対応 05 Retry対応 06

Slide 17

Slide 17 text

17 Confidential - Do Not Share Allure 導入 ローカルインストール $ brew install allure $ allure serve {path} Allure Client Library ● Allure Rspec Adaptor CI Integration ● Jenkins Allure Plugin

Slide 18

Slide 18 text

18 Confidential - Do Not Share Allure 導入 Allureの導入と技術的なポイント 並列実行 / 端末情報の付与 失敗時情報の追加 02 03 01 実行時情報の追加 04 Turnip対応 05 Retry対応 06

Slide 19

Slide 19 text

19 Confidential - Do Not Share 並列実行 高速化のためにテストの並列実行を行うことが多いが、 Allureに並列実行の機能はない。 ライブラリを組み合わせて実現する。 Jenkins ● parallel steps ● stash, unstash steps Ruby ● Knapsack

Slide 20

Slide 20 text

20 Confidential - Do Not Share step { script { def parallels = createNodes(config) // 端末ごとテスト、結果を stash(config:端末情報) parallel parallels // 並列実行 sh 'mkdir gather' config.keySet().each { unstash it // 端末ごとの結果を取得 sh "mv allure/* gather/ | true" // テスト結果を一箇所に } allure([ // Allure 表示 jdk : "${JAVA_HOME}", results: [[path: 'gather']] ]) } }

Slide 21

Slide 21 text

21 Confidential - Do Not Share def createNodes(config) { def keys = config.keySet() def ciNodeTotal = keys.size() def nodes = [:] for(int i = 0; i < ciNodeTotal; i++) { def index = i; nodes["ci_node_${i}"] = { withEnv([ "CI_NODE_INDEX=$index", "CI_NODE_TOTAL=$ciNodeTotal"]) { sh 'bundle exec rake knapsack:rspec | true' // Knapsackで並列化 stash name:keys[index], includes: "allure/*", allowEmpty: true // テスト結果をStash } } } return nodes; }

Slide 22

Slide 22 text

22 Confidential - Do Not Share 端末情報の付与 端末はそれぞれ異なる。 並列化して実施したときに 実施した端末情報が残しておく。 Allure Rspec Adaptor ● host ラベルの付与 ● feature ラベルの付与

Slide 23

Slide 23 text

23 Confidential - Do Not Share module AllureRSpec class Formatter < RSpec::Core::Formatters::BaseFormatter alias original_example_group_started example_group_started def example_group_started(notification) notification.group.metadata[:feature] = ENV['RUN_MOBILE'] // featureラベルの付与 notification.group.metadata[:host] = ENV['RUN_MOBILE'] // host ラベルの付与 original_example_group_started(notification) end end end

Slide 24

Slide 24 text

24 Confidential - Do Not Share

Slide 25

Slide 25 text

25 Confidential - Do Not Share

Slide 26

Slide 26 text

26 Confidential - Do Not Share Allure 導入 Allureの導入と技術的なポイント 並列実行 / 端末情報の付与 失敗時情報の追加 02 03 01 実行時情報の追加 04 Turnip対応 05 Retry対応 06

Slide 27

Slide 27 text

27 Confidential - Do Not Share 失敗時情報の追加 失敗時の情報をなるべく多く残しておくことで、 失敗の原因を調査するのに役立てる。 ● スクリーンショット ● スクリーンレコード ● ログ ● ページソース → appium-source-viewer Allure Rspec Adaptor ● attach_file メソッド

Slide 28

Slide 28 text

28 Confidential - Do Not Share RSpec.configure do |config| config.after do |example| if example.exception example.attach_file("failed_screenshot", take_screen_shot) // スクリーンショットの付加 example.attach_file("failed_record", take_screen_record) // スクリーンレコードの付加 example.attach_file("failed_page_source", take_page_source) // ページソースの付加 end end end

Slide 29

Slide 29 text

29 Confidential - Do Not Share

Slide 30

Slide 30 text

30 Confidential - Do Not Share Allure 導入 Allureの導入と技術的なポイント 並列実行 / 端末情報の付与 失敗時情報の追加 02 03 01 実行時情報の追加 04 Turnip対応 05 Retry対応 06

Slide 31

Slide 31 text

31 Confidential - Do Not Share 実行時情報の追加 どのような条件で実行されたか、を残しておくことで 同条件での再現確認や問題の切り分けができる。 ● Git情報(ブランチ、コミットハッシュ) ● App情報(apkバージョン) ● テスト管理情報 ● (端末情報(前述済み)) etc. Allure ● environment.properties

Slide 32

Slide 32 text

32 Confidential - Do Not Share def take_device_environment(allure_report_path, app_path) File.open("#{allure_report_path}/environment.properties", 'w') do |f| // environment.propertiesの作成&書き込み f.puts "UiTest.GitUrl = #{ENV['GIT_URL']}" // Git情報の追加 f.puts "UiTest.GitCommit = #{ENV['GIT_COMMIT']}" // Git情報は環境変数から f.puts "UiTest.GitBranch = #{ENV['GIT_BRANCH']}" f.puts "Apkfile = #{get_apk_number(app_path)}" // apkのバージョン情報 f.puts "TestMg.Url = https://XXX?/#{ENV['TEST_RUN_ID']}" // テスト管理システム end end

Slide 33

Slide 33 text

33 Confidential - Do Not Share

Slide 34

Slide 34 text

34 Confidential - Do Not Share Allure 導入 Allureの導入と技術的なポイント 並列実行 / 端末情報の付与 失敗時情報の追加 02 03 01 実行時情報の追加 04 Turnip対応 05 Retry対応 06

Slide 35

Slide 35 text

35 Confidential - Do Not Share Turnip対応 AllureはTurnipをサポートしていない。 Allure Rspec Adaptorを使用できるが、 見づらい点と一部機能が使えない(使いにくい)。 Allure Turnip ● Turnip’s feature, step → Allure’s Suites, step ● Issue管理システム連携 ● Test管理システム連携 Jenkinsプラグイン ● Issue, Test管理システム連携部分 ○ https://docs.qameta.io/allure/#_jenkins

Slide 36

Slide 36 text

36 Confidential - Do Not Share Feature: Timeline @Test-C6095 Scenario: "おすすめ"タブが表示されることを確認 When 10回以上商品を検索しているユーザーでログインする Then [ホーム] "おすすめ" タブが表示されていること And [ホーム] 商品が表示されていること allure([ jdk : "${JAVA_HOME}", reportBuildPolicy: 'ALWAYS', results : [[path: 'gather']], properties: [[key: 'allure.tests.management.pattern', value: 'https://xxx?case=%s']] ]) Feature Jenkins pipeline

Slide 37

Slide 37 text

37 Confidential - Do Not Share

Slide 38

Slide 38 text

38 Confidential - Do Not Share Allure 導入 Allureの導入と技術的なポイント 並列実行 / 端末情報の付与 失敗時情報の追加 02 03 01 実行時情報の追加 04 Turnip対応 05 Retry対応 06

Slide 39

Slide 39 text

39 Confidential - Do Not Share Retry対応 UIテストでは、テストの安定化のため、 複数回の自動Retry機能を入れることがある。 複数回のRetryごとの結果を見ることは重要。 Allure ● Retries ※ただし、Pytestのみ ● Ruby はPR中 ○ https://github.com/allure-framework/allure-cucumber/pull/78

Slide 40

Slide 40 text

40 Confidential - Do Not Share UIテスト結果の可視化の重要性について アジェンダ Allureの導入と技術的なポイント まとめ 02 03 01

Slide 41

Slide 41 text

41 Confidential - Do Not Share まとめ ● UIテスト結果を可視化することは重要 可視化することでUIテストの問題を改善できる ● Allureをかしこく使えば、有効な情報を可視化できる これからAllureを使う人の役に立つと幸いです!

Slide 42

Slide 42 text

42 Confidential - Do Not Share ご清聴ありがとうございました。