runn で 改善: API 統合テストの困りごと
テックタッチ株式会社 / nome
バックエンドエンジニア / 従業員規模: 101名〜300名 / エンジニア組織: 11名〜50名
利用機能 | ツールの利用規模 | ツールの利用開始時期 |
---|---|---|
シナリオベーステスト | 10名以下 | 2024年4月 |
利用機能 | シナリオベーステスト |
---|---|
ツールの利用規模 | 10名以下 |
ツールの利用開始時期 | 2024年4月 |
導入の背景・解決したかった問題
導入背景
ツール導入前の課題
API の統合テストに Postman を NewmanCLI 経由で、ローカル・ CI 環境にて利用していました。
Postman の Collection Runner 機能にてシナリオベースのテストを実行するというものです。
API 統合テストとして一定の効果は得られていたのですが、以下の点で課題がありました。
- シナリオの履歴管理
- Git 連携機能でシナリオを Git 管理していましたが、連携されるファイルには GUI 用のメタデータが多く含まれおり、シナリオを直接編集することが困難でした。
- シナリオの共有
- Team 機能により GUI ベースでのチーム内でのシナリオ共有はできていましたが、CI 環境等 CLI ベースでシナリオを同期する際に、認証や CI 用のファイル調整など複雑なセットアップ手順が必要でした
- シナリオのメンテナンス性
- シナリオの更新には GUI 上でのレビュー機能を利用していました。上で挙げていたようにメタデータが多分に含まれるため差分の把握が難しかったり、シナリオの本数が多くなると GUI が固まってしまったりなどメンテナンス作業の足枷となっていました。
どのような状態を目指していたか
API 統合テストが形骸化しないよう、開発者がメンテナンスしやすい状態を目指していました。 具体的には
- Postman でのシナリオベーステストと同等の機能が担保できている
- シナリオが開発コードと同居でき、日々の開発の中で追加・改修が行える
これらを満たしたうえで Postman にはない便利機能や、コスト・動作速度において有意なものを探してrunnに辿り着きました。
比較検討したサービス
選定理由
- YAML ベースでシナリオ管理ができる
- 社内での API 開発言語と同じ Go で書かれているため
- 不具合に遭遇しても runn のソースコードまで追うことができる
- Go の Unit Test に組み込むことも可能
- シナリオ並列実行が簡単にできたり、高速な実行が可能
- 作者が日本人であり、作者自らの解説記事や SNS などで最新の情報をフォローできる
導入の成果
改善したかった課題はどれくらい解決されたか
導入によりシナリオが開発コードと同居して管理できるようになり、作業効率・コスト観点においてもAPI統合テストを改善することができました。
どのような成果が得られたか
- メンテナンス性の向上
- シナリオの作成・修正作業のハードルが大きく下がり、日々の開発作業でシナリオの改善が行えます
- CI 実行時間の短縮
- セットアップ時間や実行の高速化などの改善で、CI 実行時間を 20分 -> 10分程度に大幅に短縮
- コスト削減
- 10人分ほどの Postman 利用料を削減できたうえ、前述の CI のコストも圧縮
導入に向けた社内への説明
上長・チームへの説明
もともと Postman によるAPI統合テストの課題はチーム内で共有されていたため 改善活動のタスクとしてツール移行も含め工数を設けていました。 そのなかで次のような流れで検証を計画し、徐々に移行作業を行なっていきました。
- 既存シナリオの整理
- メンテナンスが行えていなかったシナリオを統廃合して移行対象を整理
- 整理したシナリオの移植
- シナリオ共通のセットアップ等基本的なものが runn で実行できるか確認しながら移植
- 継続的な動作確認
- 既存 CI と並列に runn による新しい CI を起動し動作確認期間を設ける(約1-2ヶ月)
- チームへのナレッジ共有
- 上記の作業で得られた知見などを定期的にチームへ共有し、完全移行までにツールへの理解を深める
活用方法
よく使う機能
紹介仕切れないくらい多機能なので、詳しくはクックブック等を参照してください。シナリオテストにおいてやりたいことは一通り可能ですし、 Go に組み込むことで足りない部分は自前で作り込むこともできます(やりすぎ注意)。
そのなかで特にこれらの機能を活用することで、シナリオの保守性が向上しました。
- 共通部分のモジュール化と再利用
- fakerによる動的変数注入
runners:
apiReq: http://localhost:8000
steps:
bindDefault:
bind:
uuid: faker.UUID()
email: faker.Email()
createTenant:
desc: テナント作成
include:
path: ../../unit/setup_tenant.yml
vars:
TenantID: "{{ uuid }}"
email: "{{ email }}"
ツールの良い点
- YAML ベースでシナリオ作成
- Github Actions などに慣れている方は入りやすいと思います
- 開発者フレンドリーな機能が豊富
- curl から yaml への変換
- gdb ライクなステップ実行デバッグツールなど
- Go Unit Test への組み込みが可能
- 作者が日本の方なので応援したい
- 質問に回答していただいたり、 SNS で反応していただいたことも嬉しかったです(もはやファン) 🥰
ツールの課題点
- Go Test に組み込むことで、 assert を作り込むことができますが、YAML 側からその内容を追いかけることができないため Go Test 側の実装を追う必要があります
- 作り込みが可能なゆえにシンプルな利用(ハックしない)を意識しないとメンテナンスが辛くなってしまいます
ツールを検討されている方へ
「API統合テストを用意したもののメンテナンスが大変」ですとか「これからAPI統合テストを導入したい」方々に runn は胸を張っておススメできますのでぜひご検討ください。
また弊社では runn を Go の TestHelper にして API テストを実行し、統合テスト以外でも積極的に活用していますのでよろしければこちらも参照していただければ幸いです。
Techtouch Developers Blog: runn と Testcontainers で「ちょうどいい」Go API テスト
テックタッチ株式会社 / nome
バックエンドエンジニア / 従業員規模: 101名〜300名 / エンジニア組織: 11名〜50名
よく見られているレビュー
テックタッチ株式会社 / nome
バックエンドエンジニア / 従業員規模: 101名〜300名 / エンジニア組織: 11名〜50名
レビューしているツール
目次
- 導入の背景・解決したかった問題
- 活用方法