web-dev-qa-db-ja.com

テストデータを使用したクエリ自体のテストは、単体テストですか、統合テストですか?

私が維持しているphpプロジェクトでは、移行のないデータベース構造を持っているため、それを再現したり、その場でテストデータベースを作成したりする方法はありません。

そして、それらに対して実行されていたクエリはかなり複雑なものです。それらで使用されるコードのパターンは次のとおりです(私は問題の一般化されたプレビューを表示しようとします):

public function someMethod(PDO $connection, string $param) {

  $sql="^some complex sql query^";
  $pdo->prepare($sql);
  $pdo->bindParam('param',$param);
  $stmt->execute();

  return $stmt->fetchAll();
}

この機能をテストするために、複製データベースを作成し、そこからすべての本番データを最小限に抑えて削除しました。 phphunit testを作成するとき、次のテスト方法を使用します

  1. データベースにテストデータを入力します。
  2. メソッドを実行します。
  3. アサーションを実行してください。
  4. Delete SQLステートメントを使用して、テストデータを手動で削除します。

このアプローチにより、アプリケーションまたは統合テストの単体テストが作成されましたか?ロジック全体がphpレイヤーではなくSQLクエリに実装されていることに注意してください。

たとえば、次のようなクエリ:

Select
    value,
    CASE 
     WHEN "time"::time < '12:00' and "time"::time > '00:00' then true 
    ELSE 
      false end as observed_in_morning  
from 
  observations

私の朝に観察が行われたかどうかを示すロジックの上の例は、明らかにビジネスロジックであるsqlステートメントに記述されています。

では、午前中に観測が行われたかどうかをテストするテストは、単体テストですか、それとも統合テストですか?

2

純粋主義者は、データベースに関わる「単体テスト」をいかなるテストとも呼びません。他の純粋主義者は、2つ以上のコンポーネントが含まれていない場合、テストを「統合テスト」とは呼びません(通常、DBのSQLエンジンのようなプラットフォームは、コンポーネントとしてカウントされません)。

そして、それほど純粋ではない人々は、すべてを「phpunit」のような自動テストツールによって開始されるユニットテストと呼んでいます。他の人々は、すべてをデータベースを伴う統合テストと呼んでいます。

正直言って、これらの名前は、一緒に作業している人々のグループであまり混乱を引き起こさない限り、重要ではありません。安全にしたい場合は、単体テストでも統合テストでもない、自動機能テストと呼んでください。

7
Doc Brown