在当前的项目中,我很难找到一个好的解决方案来创建没有副作用的可扩展集成测试。关于副作用自由属性的一些澄清:它主要是关于数据库的;测试完成后,数据库中不应有任何更改(应保留状态)。也许可伸缩性和状态保存并没有融合在一起,但是我真的想推动一个更好的解决方案。
这是一个典型的集成测试(这些测试涉及数据库层):
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秒钟即可测试系统的一小部分。我可以想象当覆盖范围增加时,这个数字会上升。
编写此类测试的另一种方法是什么?我可以想到的一种替代方法是使用一种全局变量(在一个类中),并且所有测试方法都共享该变量。结果,只有很少的订单被创建和删除。导致更快的测试。但是,我认为这带来了更大的问题。这些测试不再是孤立的,并且越来越难以理解和分析它们。
可能仅仅是集成测试并不像单元测试那样频繁地运行。因此,低性能可能被那些人接受。无论如何,很高兴知道是否有人想出其他方法来改善可伸缩性。