APIテストで迷子になった場合の対処方法

投稿日:

(2020年5月12日)

まだテストを書いていません、あなたは始めるべきです。テストにより、コードの品質が向上し、バグが減り、おそらく設計と品質についてもっと考える必要があります。実際、最も難しいのは、どのタイプのテストを作成するかを開始して把握することです。

つまり、グーグルを開始すると、ユニット、統合、受け入れ、機能、システム、煙など、多くのテストタイプが見つかります。 e2e…一部のリソースでは、100%のカバレッジが必要であると記載されていますが、完全なカバレッジでは、コードが完全にテストされているとは限らないと記載されています。使用するテストの種類を決定する場合でも、アプリで特定のロジックをテストする方法を決定するのは難しい場合があります。

あきらめないでください!その過程で学んだヒントがいくつかあり、それがあなたの生活を楽にしてくれることを願っています。

機能テストだけですべてをテストしようとしないでください

これが一番の間違いです開発者はテストを行います。それでは、最初にそれを明確にしましょう。

REST Apiでの機能テストは、1つのエンドポイントでリクエストを送信し、そのレスポンスをアサートすることを意味します。ルートにドメインロジックが進む可能性のある複数の異なるケースがある場合、それらがすべて機能することを確認するために、ケースごとに個別のテストを作成する必要があります。

これは非常に小さなアプリでも機能する可能性がありますが、アプリが大きくなるとすぐに、これを維持するのが非常に難しくなり、非常に遅くなります。ある時点で、実際にアプリで作業するよりも、テストの修正と保守に多くの時間を費やし始めるでしょう。それはテストがどうあるべきかではありません。難しい方法であることがわかりました。

テストピラミッド

テストピラミッドは、各レイヤーに書き込む必要のあるテストの量を示すグラフです。

下位レイヤーより高速であるため、ユニットテストと統合テストで可能な限りカバーする必要があります。高レベルになるほど、必要なテストは少なくなります。個々のレイヤーには異なる名前が付けられていますが、その背後にあるロジックは同じです。

テストピラミッド

ユニットテスト

では、最初から始めましょう—ユニットテスト。定義は次のとおりです。

単体テストは、ソフトウェアの個々のユニット/コンポーネントをテストするソフトウェアテストのレベルです。目的は、ソフトウェアの各ユニットが期待どおりに機能することを検証することです。ユニットは、ソフトウェアの中でテスト可能な最小の部分です。

つまり、各メソッドを個別にテストし、他のすべてのメソッドをモックする必要があります。

そうではありません。ユニットテスト、それはあなたです!

ユニットテストは、コードが機能することを確認するのに役立つだけでなく、リファクタリングも行います。それらは書きやすいはずです。特定のコードのテストに苦労している場合は、コードの記述が不適切であるため、リファクタリングする必要があります。 SOLIDの原則がここで役立ちます。 SOLIDは、クリーンでエレガントで読みやすいコードを作成するための一連の設計原則です。堅実なコードを作成する場合、単体テストは簡単です。

したがって、基本的に、単体テストでは、コード内の分離された各メソッドが正常に機能することを確認します。つまり、すべてのコードが期待どおりに機能するということですよね?あんまり。また、個々のコンポーネントが正常に機能することを確認する必要があります。そこで、統合テストが行​​われます。

統合テスト

統合テストは、個々のソフトウェアモジュールを組み合わせてグループとしてテストするソフトウェアテストのフェーズです。

単体テストでは不十分な場合の良い例は、データベースクエリです。ビルダー。単体テストでは、クエリで必要な条件を呼び出したことを確認できますが、クエリがより複雑な場合は、データベースを実際に呼び出すまで、使用した条件が期待される結果を返すかどうかを実際に確認することはできません。したがって、ここで、テストデータベースでクエリを実行し、期待される結果を表明する統合テストを実行する必要があります。

統合テストが必要な場合:

  • 3番目との正しい統合の検証パーティライブラリまたはAPI
  • ユニットテストが期待どおりに機能する2つ以上のモジュールの検証

機能テスト

機能テストは、一部のアプリケーションの完全な機能のテストとして定義されます。

ユーザーインターフェイスを備えたアプリケーションと比較して、APIでの記述ははるかに簡単です。 APIの機能テストは、APIエンドポイントへの実際のリクエストの送信と、応答形式の検証で構成する必要があります。各ルートの成功とエラー応答をテストする必要があります。

ただし、やりすぎないでください。考えられるエラーごとにテストする必要はありません。それはすでにユニットテストと統合テストでカバーされているはずです。ここでは、ルートがエラーに対して正しい応答形式を返すことを確認するだけです。ルートの役割が異なる場合は、セキュリティエラー応答もテストする必要があります。

機能テストを簡単に作成できるようにするための便利なツールを次に示します。

  • PHPマッチャー —パターンに対する応答を確認できるライブラリ。データベースで実際の値をアサートする代わりに、応答の各フィールドに期待するパターンを設定できます。このようにして、テストデータベースで文字列や数値が変更されたかどうかを心配することなく、応答形式とフィールドタイプのみをテストできます。
  • ポストマンテスト —フロントエンドチームにとって非常に便利な機能テストをポストマンで作成できます。 APIエンドポイントを試してください。インタラクティブなAPIドキュメントのようになります。 Postmanテストを Newman と統合できます—コマンドラインでテストを実行して継続的統合(CI)
  • Faker —テストデータベースの偽のデータを生成するためのライブラリ

さらに一歩進んで

コードが機能することがわかったので、パフォーマンスを確認できます。

負荷テスト

負荷テストでは、 apiはさまざまなサーバーに期待どおりに応答しています。

ストレステスト

同時に多数のリクエストを受信したときにAPIが期待どおりに機能するかどうかを確認します。

100%のカバレッジが必要ですか?

100%のカバレッジはコードが完全にテストされ、機能しています。これは、テストでコードの各行を使用したことを意味するだけですが、コードカバレッジを実行して、コードの一部をカバーできなかったかどうかを確認するのに役立ちます。

記述してもメリットがないことがわかりました。ゲッターやセッターなどの単純なメソッドをテストします。特に大規模なプロジェクトでは、作成と保守に時間がかかります。

テストによって潜在的なバグのほとんどが排除されますが、思いもよらなかったエッジケースがいくつかあります。バグが発生した場合は、必ず最初に新しいテストで再現してから、コードを修正してください。そうすれば、カバレッジが向上し、そのケースを確実にカバーできるようになります。これは、まだテストが行​​われていないレガシープロジェクトのカバーを開始するための優れた方法でもあります。

コードとテストの品質をチェックするのに役立つツールは次のとおりです。

  • 感染 —ミューテーションテスト用のツール。 ミューテーションテストは、既存のテストの品質を評価します。ミューテーションテストはプログラムを小さな方法で変更し、テストが失敗することを期待します。これはミューテーションが強制終了されることを意味します。合格したテストごとに、変異体は生きたままです。テストスイートは、それらが殺す変異体のパーセンテージによって測定されます。ミューテーションテストは、ミューテーションスコアインジケーター(MSI)と呼ばれるテスト基準を提供します。 MSIは、障害を検出する能力の観点からテストセットの有効性を測定します。 CIに統合し、CIが合格するために必要な最小MSIを設定することもできます。
  • PHPStan — PHPStanは、実際に実行せずにコード内のエラーを見つけることに重点を置いています。コードのテストを作成する前でも、クラス全体のバグをキャッチします。実際の行を実行する前にコードの各行の正確さを確認できるという意味で、PHPをコンパイル言語に近づけます。
  • 継続的インテグレーション(CI) —コミットごとにgitでテストを実行できます。これにより、PRと失敗したテストをマージすることができなくなります。

結論

テストの作成について見つけたすべてのことに迷うのは簡単です。テストの主な目標は、コードが機能し、保守が容易であることを確認することです。テストに慣れていない場合は、時間がかかりすぎるように思われるかもしれませんが、あきらめないでください。一度テストを取得すると、コーディング作業がはるかに簡単かつ高速になります。 🙂

このクリエイティブな作品は、もともとLocastic.comに投稿されました— https://locastic.com/blog/what-to-do-when- you-get-lost-in-api-testing /

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です