私の現在のプロジェクトでは、副作用のないスケーラブルな統合テストを作成するための優れたソリューションを思いつくのに苦労しています。副作用のないプロパティに関する少しの明確化:それはほとんどデータベースに関するものです。テストが完了した後、データベースに変更が加えられるべきではありません(状態は保持されるべきです)。スケーラビリティと状態保存は一緒にならないかもしれませんが、私は本当にもっと良い解決策を求めています。
一般的な統合テストを次に示します(これらのテストはデータベース層に影響を与えます):
public class OrderTests {
List<Order> ordersToDelete = new ArrayList<Order>();
public testOrderCreation() {
Order order = new Order();
assertTrue(order.save());
orderToDelete.add(order);
}
public testOrderComparison() {
Order order = new Order();
Order order2 = new Order();
assertFalse(order.isEqual(order2);
orderToDelete.add(order);
orderToDelete.add(order2);
}
// More tests
public teardown() {
for(Order order : ordersToDelete)
order.delete();
}
}
ご想像のとおり、このアプローチではテストが非常に遅くなります。また、統合テスト全体に適用すると、システムのごく一部のみをテストするのに約5秒かかります。カバレッジが増加すると、この数値が増加することを想像できます。
そのようなテストを書くための別のアプローチは何でしょうか?私が考えることができる1つの選択肢は、一種のグローバル変数(クラス内)を持つことであり、すべてのテストメソッドはこの変数を共有します。その結果、少数の注文のみが作成および削除されます。テストが高速になります。ただし、これにより大きな問題が発生すると思います。テストはもはや分離されておらず、テストの理解と分析がますます困難になっています。
統合テストは、単体テストほど頻繁に実行されることを意図していないのかもしれません。したがって、これらの場合、低いパフォーマンスが許容される場合があります。いずれにせよ、誰かがスケーラビリティを改善するための代替案を思いついたかどうかを知ることは素晴らしいでしょう。