API テストを Scenarigo と GitHub Actions で自動化する
はじめに
Hogetic Lab でエンジニアをしている佐々木と申します。
API テストは、システムの信頼性を確保するために不可欠なプロセスです。特に、複雑なシステムや多くの依存関係を持つアプリケーションでは、手動でのテストは時間と労力がかかります。弊社では API のテストツールとして Scenarigo を導入しています。本記事では、Scenarigo を使用して API テストを行い、GitHub Actions を使って CI パイプラインに統合する方法について紹介します。
Scenarigo とは?
Scenarigo は、YAML 形式のシナリオファイルを使用して API テストを簡単に記述・実行できるツールです。主な特徴として以下が挙げられます。
選定理由
-
シナリオベースのテスト:
テストシナリオを YAML ファイルに記述することで、直感的にテストケースを管理できます。 -
導入の容易さ:
Scenarigoは、Postmanなどの他ツールと比較して、CIパイプラインへの統合が容易です。また、YAMLでシンプルに記述できるため学習コストが低く、テストケースの再利用も可能です。これらの点から、他のツールに比べて魅力的です。 -
Go言語との親和性:
ScenarigoはGo言語で書かれており、Goのエコシステムと自然に統合できます。そのため、Goで開発しているプロジェクトに適しています。 -
明確なエラーメッセージ:
テストが失敗した場合、Scenarigoは明確なエラーメッセージを提供します。そのため、どこで何が間違っているのかを迅速に特定でき、デバッグがしやすくなります。
インストール
Scenarigo は Go 言語で実装されているため、Go の開発環境が必要です。以下のコマンドでインストールできます。
go install github.com/zoncoen/scenarigo/cmd/scenarigo@latest
シナリオファイルの作成
YAML 形式でシナリオを記述します。サンプルコードからの簡単な抜粋です。
title: user test # テストシナリオのタイトル
vars:
url: http://localhost:9000/v1 # テストで使用する基本URLを変数として定義
steps:
- title: create user # ユーザー作成のテストステップ
protocol: http # 使用するプロトコルは HTTP
request:
method: POST # HTTP メソッドを指定
url: "{{vars.url}}/users"
header:
Content-Type: application/json # リクエストのヘッダー、JSON 形式を指定
body:
name: testname # リクエストボディを設定
expect:
code: OK # レスポンスコードがOK(200)であることを期待
body:
id: '{{int($) > 0}}' # レスポンスボディの id が0より大きい整数であることを期待
name: "{{request.body.name}}" # レスポンスボディの name がリクエストボディの name と一致することを期待
bind:
# 返り値などを変数としてバインドします。
vars:
user_id: '{{response.body.id}}'
user_name: '{{response.body.name}}'
- title: get user
protocol: http
request:
method: GET
url: "{{vars.url}}/users/{{int(vars.user_id)}}" # パラメーターにバインドされた user_id を設定
header:
Content-Type: application/json
expect:
code: OK
body:
id: '{{int(vars.user_id)}}' # レスポンスボディの id がバインドされた user_id と一致することを期待
name: '{{vars.user_name}}' # レスポンスボディの name がバインドされた user_name と一致することを期待
plugin の作成
plugin を使用することでテストを拡張し標準の機能では対応できないケースに柔軟に対応することができます。今回は uuid を生成するプラグインを作成します。
- ディレクトリ構造
root/
├── scenarigo/
│ └── scenarigo.yaml
│ └── user.yaml
│ └── plugins
│ └── uuid
│ └── main.go
│ └── gen
│ └── uuid.so
- scenarigo/plugins/uuid/main.go
package main
import "github.com/google/uuid"
func New() string {
return uuid.New().String()
}
- scenarigo/scenarigo.yaml
-
scenarigo plugin build -c ./scenarigo/scenarigo.yaml
を使用することでプラグインをビルドします。
schemaVersion: config/v1
scenarios:
- user.yaml
pluginDirectory: ./gen
plugins:
uuid.so: # scenarigo plugin build で生成されたファイルを指定
src: ./plugins/uuid
output:
verbose: false
- scenarigo/user.yaml
title: user test
plugins:
uuid: uuid.so # scenarigo plugin build で生成されたファイルを指定
vars:
url: http://localhost:9000/v1
steps:
...
body:
name: '{{plugins.uuid.New()}}' # uuid/main.go で設定した関数名を使用
...
GitHub Actions の CI 環境
GitHub Actions は、GitHub リポジトリに対して自動化されたワークフローを設定するための強力なツールです。これにより、コードの変更がプッシュされた際に自動でテストを実行することが可能になります。以下の理由から、CI でのテスト実行は重要です。
- 継続的な品質保証: コードがリポジトリにマージされるたびに自動でテストが実行されるため、常に最新のコードが正しく機能していることを確認できます。
- 早期のバグ検出: 変更が加えられた際に即座にテストが実行されるため、バグを早期に検出し、修正することができます。
- 一貫性の確保: 手動テストではヒューマンエラーが発生しやすいですが、自動化されたテストは一貫して同じ手順を実行するため、信頼性が高まります。
- 効率の向上: 自動テストにより、開発者は手動テストに費やす時間を削減でき、その分開発や他の重要なタスクに集中できます。
GitHub Actions での Scenarigo テストの設定例
以下は、GitHub Actions を使って Scenarigo テストを実行するための簡単な設定例です。
name: ci
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
go-version: ['1.22.x']
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Go ${{ matrix.go-version }}
uses: actions/setup-go@v4
with:
go-version: ${{ matrix.go-version }}
- name: run container
run: docker-compose up -d
- name: run test
run: make test
この設定ファイルは、プルリクエストが作成されたときに Scenarigo テストを実行します。これにより、自動的にテストが実行され、問題がないことを確認できます。
まとめ
API テストの自動化は、システムの信頼性を高めるために非常に重要です。Scenarigo を使用することで、シナリオベースのテストを簡単に作成・実行でき、GitHub Actions を利用することで CI/CD パイプラインに統合することができます。これにより、継続的な品質保証、早期のバグ検出、一貫性の確保、効率の向上を実現できます。
次回は CD の構築を行ってみようと思います。
サンプルコード
Discussion