Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

マイクロサービスのテスト作成方針

More than 3 years have passed since last update.

マイクロサービスをつくった。
一からマイクロサービスの開発フローを作った話

そこで、実際にどのように開発していたかを共有する。

今後、おおまかに分けて以下の3つのカテゴリで書いていく。

  • テスト
  • ドキュメント作成
  • エラー/負荷対策

今回はテストに関してだけで、結構な量になったので、ドキュメント作成とエラー/負荷対策については、今後記載する。

テスト

各サービスごとに単体テストと結合テストを作成した。

方針

  • テストコードを先に書く
  • 優先度は「結合テスト > 単体テスト」

テストツール

  • 単体テスト : PHPUnit
  • 結合テスト : Cucumber (ruby)

結合テストはサービスのプロジェクトとは独立して作成しておき、新しいプロジェクトとして作りなおす場合でも利用できるようにした。(将来的には、Go言語で作り直したい)

テストを書くまでの手順

だいたい以下のようなフローで行った。
platform_dev_env.png

さらに詳細に書くと以下のようになる。

endpointのURLと、正常系のテストで何をすべきか洗い出す

まずはやりたいことを整理して、
引数と、どのようなが必要かまとめる。
先にチェックリストをつくり、本当に実装できているかを最後に確認することで、自分の中でダブルチェックができる。

正常系の結合テストを書く

json-schemeを使い、返り値の型もチェックする。
このjson-schemeはのちほどAPIドキュメントを自動作成する場合にも利用する。

異常系の結合テストを書く

不正なURL, 不正なHTTP METHOD, 不正な引数は最低限チェック。

数値を引数とする場合は、
正負の数, 0, データの境界値(最小 / 最大値), 小数点は最低限チェックする。
これら、必ずテストするものは、1行で呼び出せるよう自動化しておく。

結合テストを通過するようにコードを書く

書いてある通り。

動作を保証したい/テストパターンが多いようであれば単体テストを書く

今回のプロジェクトでは、各メソッドごとにテストを書いたりしていない。条件分岐がとても多い場合以外は、結合テスト側で各パターンを作ってチェックしている。

理由としては、今後、別の言語でつくるときなどに、再利用できるという点。

逆に、単体テストを作ったのは以下のようなパターン。

  • メールアドレス/書き込み内容など、入力されるデータの正当性チェック
  • 確率で成功したり、失敗するもの

コードチェック

作成したコードが規約に則っているか、自動でコードチェック。
PHPの場合は、以下のチェックツールを使う。

  • PHP Linter
  • PHP Code Sniffer
  • PHP Mess Detecter

pull request

Pull request時に、Circle CIで、自動テストを行う。
Circle CIのサーバで、localhostにwebサーバを作成し、単体テスト/結合テストを行う。

複数のプロジェクトで相互に通信を行う場合は、
テストの度にすべてのプロジェクトをcloneし、circle ci環境内でポートを分け、webサーバを立ち上げる。

CucumberでAPIでのテストを楽にする

前述のとおり、今回、APIの結合テストでCucumberを利用した。
デフォルトのCucumberでは、テストが書きづらそうだったので、
以下のgemを改良させて使わせていただいた。
https://github.com/hidroh/cucumber-api

基本、ほぼそのまま利用しているが、以下の点を自分のやりたいことに合うように変更した。

  • APIリクエスト対象を、特定のドメインで固定する
  • セッションを保持したまま、リクエストを送れる
    • ログインしたアカウントでしかできないことなどをチェックする

変更したコードはこちら。
https://github.com/tomoyamachi/cucumber-api

tomoyamachi
Go / JavaScript / Docker / Python / K8s コンテナの導入〜セキュリティに関するコンサルティングをお受けしています。 コンテナのセキュリティツールDockle作者です。脆弱性スキャンツールのVuls, Trivyのコミッタです。 https://twitter.com/tomoyamachi
https://scrapbox.io/tomoyamachi/about_GoodWith
goodwith
技術支援や技術コンサルティングを行っています。Container Image LinterのDockleなどのOSS開発も行っています。
https://www.goodwith.tech/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away