私が維持している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を作成するとき、次のテスト方法を使用します
このアプローチにより、アプリケーションまたは統合テストの単体テストが作成されましたか?ロジック全体が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つ以上のコンポーネントが含まれていない場合、テストを「統合テスト」とは呼びません(通常、DBのSQLエンジンのようなプラットフォームは、コンポーネントとしてカウントされません)。
そして、それほど純粋ではない人々は、すべてを「phpunit」のような自動テストツールによって開始されるユニットテストと呼んでいます。他の人々は、すべてをデータベースを伴う統合テストと呼んでいます。
正直言って、これらの名前は、一緒に作業している人々のグループであまり混乱を引き起こさない限り、重要ではありません。安全にしたい場合は、単体テストでも統合テストでもない、自動機能テストと呼んでください。