Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Are your automated tests improving?

teyamagu
November 05, 2022

Are your automated tests improving?

「皆さんの自動テストは改善されていますか?」 in JaSST'22 Kyushu #jasstkyushu

teyamagu

November 05, 2022
Tweet

More Decks by teyamagu

Other Decks in Programming

Transcript

  1. ※(1)2022年6月末時点の有料課金ユーザー数。有料課金ユーザー企業数には個人事業主を含む。またfreeeグループ全体で集計。 2019年 6月期 2020年 6月期 2017年 6月期 2018年 6月期 2021年

    6月期 有料課金ユーザー 企業数(件) 有料課金ユーザー企業数(1)は 約38万 事業所 8.3万 12.1万 22.4万 29.3万 16万 37.9万 2022年 6月期
  2. 13 freeeの自動テスト ユニットテスト、APIテスト、ユースケースベースのEnd2Endテスト、様々な自動テストが社内では動いている freeeのサービスの提供形式としてはWEBとモバイルアプリがあり、それぞれの確認で自動テストを利用している 下記以外に、セキュリティやアクセシビリティのテストなどが半自動で実施されている 目指す自動テストと量 メソッド・モジュール・クラ ス・コンポーネントが設計通り の挙動・DOMとなるか APIレスポンスやレポート計算な

    ど複数モジュールやクラスの動 作が設計通りの挙動となるか 表示が想定通りか ユースケースが実施できるか 責務 言語が持つテスト フレームワークでのテスト snapshotテスト APIベースのユースケーステスト 数値計算系のテスト apiのテスト 表示の差分のテスト jestのテスト E2Eテスト ユニットテスト E2Eテスト 今回の講演での呼び名 APIテスト
  3. 14 Jenkins Node Ruby テスト シナリオ ページ オブジェクト サポート メソッド

    RSpec EC2 Jenkins Node Ruby テスト シナリオ ページ オブジェクト サポート メソッド RSpec EC2 ・テストフレームワークとしては、プログラミング言語のユニットテストフレームワークや パッケージ(RSpec, golang testing, Jestなど) ・各サービスごとのシステムだが、基本的には開発環境とCircleCI, GitHub Actionsで動いている freeeのユニットテストシステムの現在の構成 Rubyのテスト実行ノード CircleCI / Github Selfhosted runner Docker Ruby テスト対象 コード テスト シナリオ サポート メソッド RSpec
  4. 15 ・テストフレームワークとしては、RSpec, Capybara, SitePrismをベースに独自サポートメソッド群などを追加したもの ・CapybaraはRubyでのSelenium supportをおこなうOSS ・SitePrismはCapybaraでページオブジェクトパターンを簡単に実現するためのOSS ・テストスクリプトは、RSpecをベースにした手続き型記述形式 ・全サービス共通のE2Eテストシステム freeeのWEBのE2Eテストシステムの現在の構成

    EC2 EC2 Slack 自家製Slack bot Jenkins Master Allure テスト実行ノード 実行管理・レポートサーバ 実行指示サーバ BigQuery Redash EC2 Jenkins Node Ruby Capybara SitePrism テスト シナリオ ページ オブジェクト サポート メソッド RSpec EC2 Jenkins Node Ruby Capybara SitePrism テスト シナリオ ページ オブジェクト サポート メソッド RSpec EC2 Jenkins Node Ruby Capybara SitePrism テスト シナリオ ページ オブジェクト サポート メソッド RSpec EC2 Jenkins Node Ruby Capybara SitePrism テスト シナリオ ページ オブジェクト サポート メソッド RSpec TestRail
  5. 30 ・2012/7 (開発初期) 頃: RSpecのみ ・2014/10 頃: Jenkins 第1世代 ・2017/10

    頃: Jenkins 第2世代(Jenkinsfile化) ・2017/12 頃: CircleCI(多並列化) ユニットテストの運用と改善の概要 いくつかのサービスのユニットテストおよび APIテストのファイル数
  6. 32 ユニットテストの運用と改善(2) ・2014/10 頃: Jenkins 第1世代 ・運用内容 ・実行失敗の要因分析 ・実行環境のアップデート ・実行時間の適正化

    ・改善内容 ・並列実行による自動テスト実行の高速化 ・自分のPC以外でのテスト実行が可能になった ・実行環境と実行方法の追加: ・各Pull Requestのコード更新時の手動実行 ・Jenkinsからテスト環境デプロイ前やリリースプロセスで手動実施
  7. 33 ユニットテストの運用と改善(3) ・2017/10 頃: Jenkins 第2世代 ・改善内容 ・実行環境の運用の改善:設定のファイル化 ・2017/12 頃:

    CircleCI ・改善内容 ・実行方法の追加: ・各Pull Requestのコード更新時の手動実行 ・実行環境の運用の改善:実行環境のIaC化 ・実行時間の適正化:多コンテナ実行
  8. 34 ・運用内容 ・実行失敗時の要因分析 ・ライブラリのアップデート ・ときどき改善 ・改善内容 ・基本的には実行時間の適正化 ・無駄な前処理の削除 ・並列実行の改善 ・同一コンテナ内でのマルチプロセス実行

    ・実行の動的変更、動きの遅い実行環境での実行を回避する:Knapsackの導入 ・確認の効率化 ・テスト実行を安定化させる ユニットテストの運用と改善(4):その他
  9. 35 ・2012/7 (開発初期) 頃: Request spec ・2019/9 頃: 会計帳簿計算用テストシステム稼働 ・2020/5

    頃: Postman ・2020/11 頃: NewmanとJenkins での自動実行 APIテストの運用と改善の概要
  10. 39 APIテストの運用と改善(4) ・2020/11 頃: NewmanとJenkins での自動実行 ・運用内容 ・実行失敗の要因分析 ・実行環境のアップデート ・実行時間の適正化

    ・改善内容 ・並列実行による自動テスト実行の高速化 ・自分のPC以外でのテスト実行が可能になった ・実行環境と実行方法の追加: ・Jenkinsからテスト環境デプロイ後やリリースプロセスで手動実施 ・特定のQA担当者以外でもSlackからの実行可能に ・複数のQA担当者とSEQ担当者による作成・運用
  11. 40 ・2014/9 頃: Selenium IDEによるテストシステム ・2015/2 頃: RubyのWebDriverによるテストシステム ・2016 頃:

    RubyのWebDriverのJenkins実行 ・2016/6 頃: chatbotの導入 ・2017/10から段階的に: Jenkinsでの連携実行 ・2017/11 頃: Capybara+SitePrismによるテストシステム(1サービスごと) ・2019/9 頃: 結果の独自Slack通知 ・2019/10 頃: E2Eテストの実行結果のデータ基盤への格納・可視化 ・2019/12頃から段階的に: Capybara+SitePrismの全サービス共通構成によるテストシステム ・2020/2 頃: URLとページオブジェクトの構造とオブジェクト名の同一化 ・2020/11頃から段階的に: 開発チームによるテストの運用 ・2021/5 頃: レコード&リプレイ型の自動テストSaaSの併用開始 ・2021/11 頃: Slackからの実行結果をスレッドに表示させる ・開発中: Pull Request上でE2Eテスト実行 WEBのE2Eテストの運用と改善の概要 統合したWEBのE2Eテストリポジトリにお けるテストファイル数とサービス数
  12. 42 ・2015/2 頃: RubyのWebDriverによるテストシステム ・コードベースのテストシステムを導入 ・運用内容 ・実行失敗の要因分析 ・ライブラリのアップデート ・改善内容 ・複数人数で作成やレビューできるようになった

    ・自動テストシナリオや利用サービス数: ・2サービスから徐々に増え、最終的には5サービスで実施。シナリオも徐々に増加 ・徐々にメンバー増加。3名程度のQA担当者が片手間で作成・運用するようになった WEBのE2Eテストの運用と改善(2)
  13. 43 ・2016 頃: RubyのWebDriverのJenkins実行 ・運用内容 ・実行失敗の要因分析 ・自動テストの実行環境のアップデート ・自動テスト実行時間の適正化 ・改善内容 ・並列実行による自動テスト実行の高速化

    ・自分のPC以外でのテスト実行が可能になった ・QA担当者以外でのテスト実行が可能になった ・実行環境と実行方法の追加: Jenkinsからテスト環境デプロイ後やリリースプロセスで手動実施 WEBのE2Eテストの運用と改善(3)
  14. 44 ・2016/6 頃: chatbotの導入 ・改善内容 ・実行方法の追加:Slackからのテスト実行開始が可能になった ・全ての人によるテスト実行が容易になった ・再実行までの時間が短くなった ・2017/10から段階的に: Jenkinsでの連携実行

    ・改善内容 ・実行方法の変更:テスト環境デプロイ後やリリースプロセスで自動実施 ・リリース前に実施忘れがなくなり、作業をなくすることができた WEBのE2Eテストの運用と改善(4)
  15. 45 ・2017/11 頃: Capybara+SitePrismによるテストシステム ・Ruby開発者が慣れているテストフレームワークを導入 ・運用内容 ・実行失敗の要因分析 ・ライブラリのアップデート ・改善内容 ・開発者による作成・修正などができるようになった

    ・テストシナリオとページファイルの分離により、テストの作成・修正が容易化 ・自動テストシナリオや利用サービス数: ・1つのサービスから導入開始し、最終的に2サービスで導入。シナリオは徐々に増加 ・RubyのWebDriverのテストシステムで動作していたサービスはそのまま ・数名の開発者とQA担当者が作成・運用するようになった WEBのE2Eテストの運用と改善(5)
  16. 49 ・2019/12頃から段階的に: Capybara+SitePrismの全サービス共通構成 によるテストシナリオ(現行の基本システム) ・運用内容 ・実行失敗の要因分析 ・ライブラリ・実行環境のアップデート ・実行時間の適正化 ・改善内容 ・全サービスで、同一の使い方や、テスト作成・修正が可能になった

    ・運用すべき箇所が1つに統合されたため、運用コストを下げられ、 改善も一括提供できるようになった。 ・人員およびその構成:1名のSEQ担当者と3名のアルバイトで運用開始 WEBのE2Eテストの運用と改善(8)
  17. 50 ・2020/2 頃: URLとページファイルのディレクトリ構造とオブジェクト名の同一化 ・改善内容 ・テストシナリオの作成・読みやすさの向上 WEBのE2Eテストの運用と改善(9) scenario 'サインアップし、ホーム経由で取引登録画面まで遷移できるか確認する(個人、課金無し)' do

    @helpers.accounting.signup(plan: :trial) @app.accounting_index.header.navbar_menu.deal_link.hover @app.accounting_index.header.navbar_menu.deal_dropdown_menu.deal_link.click expect(@app.accounting_deals_index.header.deals_tab_menu.deal_link.text).to eq '取引(収入・支出)' end テストシナリオ例:改善前) テストシナリオ例:改善後) @app.{URL}.要素名.処理 で記述する scenario 'サインアップし、ホーム経由で取引登録画面まで遷移できるか確認する(個人、課金無し)' do @helpers.accounting.signup(plan: :trial) index = Pages::Accounting::Index.new index.header.navbar_menu.deal_link.hover index.header.navbar_menu.deal_dropdown_menu.deal_link.click deals_index = Pages::Accounting::Deals::Index.new deals_index.header.deals_tab_menu.deal_link.text).to eq '取引(収入・支出)' end
  18. 51 ・2020/2 頃: URLとページファイルのディレクトリ構造とオブジェクト名の同一化 ・改善内容 ・テストシナリオの作成・読みやすさの向上 /e2e-test ├─ lib テストシナリオで利用するクラス群

    │ ├─ helpers 複数のサービスで利用するサポートメソッドの置き場 │ │ ├── accounting_helper 会計サービスのみで利用するサポートメソッドの置き場 │ │ └── payroll_helper 人事労務サービスのみで利用するサポートメソッドの置き場 │ ├─ pages ページオブジェクト置き場 │ │ ├─ accounting 会計サービスのページオブジェクトの置き場 │ │ │ ├── deals 会計サービスの/deals以下のページオブジェクトの置き場 │ │ │ │ └── index.rb (例)会計サービスの/deals/indexのページオブジェクト │ │ │ └── index.rb (例)会計サービスの/indexのページオブジェクト │ │ ├─ payroll 人事労務サービスのページオブジェクトの置き場 WEBのE2Eテストの運用と改善(9) ディレクトリ構造 URLの" / " 区切りごとに ディレクトリ階層と一致させる
  19. 56 WEBのE2Eテストの運用と改善(13) ・開発中: Pull Request上でE2Eテスト実行 ・複数コンテナで構成されるサービスをPull Requestごとに起動させ、 そこにE2Eテストを実行するシステム ・改善内容 ・E2Eテスト失敗をリリースプロセス時ではなく、前倒しで発見する

    ・2022/11 現在: 約20サービス、370ファイル以上に対して、 SEQ担当者による運用は、日々1名程度の運用係として おこなっている 統合したWEBのE2Eテストリポジトリにお けるテストファイル数とサービス数