こんにちは。Merpay Advent Calendar 2021の24日目はメルペイQAチームでエンジニアリングマネージャーをしている miisan が「メルペイQAチームにおける自動化のイマ」についてQAチームを代表してお送りします。
昨年のMerpay Advent Calendar 2020で「なぜメルペイQAはDevOpsに取り組むのか?」を書いてから1年が経とうとしています。メルペイQAチームではこの1年を通して注力してきたことの一つとして、テストの自動化の推進があげられます。今回は、テスト自動化を進めていく中で、どのような課題感に取り組み、どのようなツールを使って、プロダクトを支えているかを紹介します。
メルペイを支えるQAと自動化
メルペイQAチームが、テストの自動化を進める理由は「工数削減」と「リリーススピードのアップ」そして「品質の安定化」です。単純明快ですが、他社の事例でも多くの場合はこの理由が大半ではないでしょうか。
メルペイがDevOpsに積極的に取り組む理由は、『お客さまにより早く、より確実に、よりよいサービスを継続的に届けるため』です。そのため、QAのスピードを上げて効率化し、
より多くのテストを少人数で対応するには、インパクトの大きい効果的な箇所でのテストの自動化は必要不可欠です。
とくにメルペイQAの特徴として、「止めるQA」ではなく「早く出すためのQA」を意識しています。QAと開発の責任範囲を相互支援の協力体制とし、開発フェーズの中に多くのテストを組み込むことで品質の向上と、開発早期からの自動テストの組み込みに挑戦することで、検証フェーズでのテストの効率化を図っています。
QAというと、リリース前の最終フェーズでテストをすると思われがちですが、プロダクトの開発自体は常に変化を伴いながら進行し、断続的にリリースするサイクルが発生します。そのため「最後にテストをする」という考え方ではなく、「ずっとテストをし続ける」ことを前提にQAを考えなければいけません。こういった環境でマニュアルテストだけに頼ると、常にテストし続けるために大きな工数がかかったり、プロダクトがスケールするたびに膨大なQA工数がかかったりすることになります。
また、自動化するためには、そもそも自動化を行うために必要な環境に整える必要があります。以前はコミュニケーションを取り合うことで対応していた事象も、あらかじめ自動化しやすい形に整える必要があります。これらを実現するためにメルペイでは、開発文化に合うテスト自動化ツールをうまく活用しています。
社内で利用している自動化ツール
メルペイで利用している主なテストの自動化ツールやプロジェクト管理ツールは、Backend、Frontend、Nativeアプリで大きく分けて以下の内容に分けられます。
様々なテストツールがある中で他社の事例と大きく違わないとは思いますが、特筆すべき点としては、社内に開発者がいる「Scenarigo」を採用しているのはメルペイらしさがあるかなと思います。
Scenarigo
「Scenarigo」はメルペイの @zoncoenさん が開発しているオープンソースのソフトウェアで、Go言語で作られているシナリオベースのテスト自動化ソフトウェアです。
Scenarigoは、Backendのテストでよく用いられるPostmanと同じようにAPIサーバーのシナリオテストを行うためのツールで、以下のような特徴があります。
【Scenarigoの特徴】
・テストシナリオをYAMLで記述できる
・YAMLで記述したテストシナリオを使い回すことができる
・JavaScriptではなくGoで拡張することができる
・HTTPだけでなくgRPCが使える
テストシナリオをYAMLで記述できる
テストシナリオをプルリクエストベースで管理する場合、PostmanではエクスポートしたJSONのテストの定義を取り扱うことになります。そのJSONファイルが複雑な構造をしていて、プルリクエストベースでのGitHub上での差分の確認が難しいためデベロッパーフレンドリーではない点が課題でした。
Scenarigoのテストシナリオは、JSONよりも可読性が高いと思われるYAMLでの記述を採用し、比較的シンプルな構造になっています。
テストシナリオを使い回すことができる
汎用的なテストシナリオや共通して行いたいテスト処理を再利用できることはとても便利です。
例えば、「ユーザー作成やログイン」のような汎用的なテストシナリオや、「メルペイ残高を付与する」というテストの開始時によく行う処理などは積極的に再利用して効率的なテストシナリオにしています。
JavaScriptではなくGoで拡張することができる
実開発でGo言語を使うメルペイの開発エンジニアにとって、Scenarigoはとても親和性が高いツールになります。Go言語プラグインを作ることもできて、さらにテストシナリオのYAMLで作成したプラグインを呼び出すこともできます。
例えば、APIを呼び出した後に次のステップでジョブが動いた結果をテストするという通常のPostmanでは難しいテストシナリオも、ScenarigoではGo言語で作ったプラグインを呼び出せることで容易に実現できます。このおかげで実現できるテストシナリオの幅が広がりました。
また、開発エンジニアがテストをメンテナンスしやすいツール環境にすることで、開発エンジニアとQAの境界線をなくすことにとても役立っています。
HTTPだけでなくgRPCが使える
Backendのリグレッションテストでは、基本的には各マイクロサービスにリクエストを投げてレスポンス結果を検証します。
メルペイのアーキテクチャの特徴として、各マイクロサービスはそのほとんどがGoで実装されていて、gRPCで通信しているため、HTTPだけでなくgRPCが使えるのはメリットです。(HTTPでのリクエストはAPI GatewayでgRPCに変換する必要があるためです。)
Scenarigoについては、こちらのセッション内容でより詳しい解説がされていますのでぜひご覧ください。
【書き起こし】Scenario-Based Integration Testing Platform for Microservices – 森 健太【Merpay Tech Fest 2021】
特定のマイクロサービスで内製しているツール
他には特定のマイクロサービスで内製しているツールを用いて自動化を実現しているチームもあります。内製ツールについては、こちらのセッション内容でより詳しい解説がされています。
【書き起こし】リグレッションテストの自動化を段階的に実装した話 – 高野 純知【Merpay Tech Fest 2021】
「Cypress + TestRail」
Frontend E2E テストにおける自動化は、E2E テストフレームワークである「Cypress」の採用で統一化されています。
「Cypress」は、Frontendの開発側のテストでも使っているので、何かあったらすぐに聞くことが出来ますし、レビューをお願いできてとても便利です。
リリース前のリグレッションテストはQAエンジニアが担当し、プロダクト開発のエンジニアが単体テストやインテグレーションテストを担当するという分担で進めています。
加えて、「TestRail」 を用いてテストケース管理も仕組み化することでワークフローの整備を進めています。
「Cypress + TestRail」や「メルペイフロントエンドのテスト自動化方針」についてのより詳しい内容は以下の記事で解説されています。
Cypress + TestRail による Frontend E2E テストの効率化について
自動化に当たっての課題
自動化を進めていくに当たっての課題は、正直たくさんあります。
- メンテナンス性
作成したテストケースのメンテナンスについてです。自分以外の人でもメンテナンスを継続してもらえるように環境を準備しておくことがとても重要なポイントで、現在でも大きな課題の一つです。 - 属人化
テストの対象がマイクロサービスであることがほとんどのため、その特性上テストで問題が発生したときの問題発生場所が分かりづらいということです。問題が発生したときに原因の特定に時間がかかったり、原因がわかっても他チームの部分で問題が発生し知見不足で対処に時間がかかったりすることもあります。こういったケースを減らし、よりわかりやすく、属人的な状況を解消していくことも課題だと思います。
また、テストシナリオ作成に Scenarigo を使っていく際の課題も見えてきました。 - 敷居の高さ
Scenarigo を使っていくメリットとしては、内製ツールなのでツールの改善に期待できる点です。エンジニアのAll for oneな協力もあり、2年前に比べてできることが増えてとても使いやすくなりました。
一方で内製ツールとしてのデメリットとして、みなさんが知っているツールではないので仕方のないことですが、外部の方にはツールの使い方がわからないということが挙げられます。社内で使用方法のマニュアル作成や、勉強会などを開催して使い方などをレクチャーすることでカバーしています。 - 可読性/可視化不足
自動化をしてテストを実行された結果をどのように扱うかも課題です。リリース前の判断だけでなく、自動テストを利用してサービスに対して常に健康診断ができる状態にする必要があります。テストの診断結果をいつでもどこでも、そして誰でも見られるのがいい状態だと思いますので、そのような環境を整えていきたいです。
今後挑戦していきたいこと
このようにツールを導入しテストの自動化を進めていますが、まだ、マニュアルテストの後追いで自動化のシナリオテストを書くケースがあるので、「より上流工程に近いタイミングから自動化のシナリオを書きましょう」と、早めのタイミングで自動化の基盤を取り入れていくようにチーム内では共有しています。短期的に見るとマニュアルテストですべてを検証したほうが早期にリリースできる確度は高まるかもしれませんが、繰り返されるシナリオテストを自動化することが将来的にはテスト効率を高め、安心安全な品質保証につながることをメンバー全員が理解し自動テストを取り入れられる環境を整備していきたいです。
今後もメルペイではスピード感のあるリリースサイクルの中でプロダクト開発をしていくと思うので、中長期的な目線をもって各自が検証プランを考える必要があると考えています。
また、今後は、Backend・Frontend・Nativeアプリと分けずにプロダクト全体での自動化についても模索していきたいです。まだ、QAチームの主な自動テストはBackendに閉じたところが多いので、FrontendやNativeアプリにも視野を広げて全体を通した最適な自動化の方法に取り組んでいこうと考えています。
今回紹介を割愛したNativeアプリに関しては、AndroidはEspresso、iOSはXCUITestで自動テストを書いていますが、QAとしてはまだ介入できておらず、これからどんどんテストコードを書いていけるようにクライアントチームと連携しながらチャレンジしていきたいと考えている段階です。
終わりに
メルペイQAチームにおける自動化のイマについてお伝えしました。
今年はQAチーム一丸となって様々な情報発信を行ってきました。
その一つに 「Merpay Tech Talk」や「QA Talk」というイベントにて、QAチームが目指している「全員品質」についてや自動化の取り組み、プロダクトごとのQA方針についてなどさまざまな情報発信を行っています。
今回はQAの「自動化」について主にお話しましたが、開発とQAチームが信頼関係を築きチームとして協力体制にあることはメルペイの文化「全員品質」があってこそです。
「全員品質」とは
→プロダクト開発・運用に関わる全てのメンバーが、立場や役割を超え、より良いサービスをお客様に届けるために、全員で品質を作り上げていくこと
「全員品質」についてのより詳しい内容は以下の記事で解説しています。
「全員品質」を実現するためのメルペイにおけるDevOpsの取り組み
最後に、メルペイではミッション・バリューに共感できるQAエンジニアを募集しています。一緒に働ける仲間をお待ちしております。興味のある方のご連絡、お待ちしています!
Merpay Advent Calendar 2021の最終日はVPoE @nozaqさんとBackendチーム Manager of Managersの @godricさんの記事で2本公開されます。お楽しみに!メリークリスマス!!!