对于我的验收测试,他们做的第一件事是在特定于测试的SQL Server数据库中创建一堆表,以便验证测试可以针对干净的数据库运行。每个测试完成后,所有新创建的表都将被删除。
然而,这开始变慢。每次测试大约需要15秒,而且我有很多测试(并且我希望这个数字能够持续上升)。大部分时间都是由数据库设置&拆掉。
我能以更快的方式做到这一点吗?如果我可以在内存中创建一个新的SQL Server数据库,那么它永远不会碰到磁盘,我可以在测试结束时扔掉 - 这将是很棒的。但看到这不是一个真正的选择,有没有办法让我接近它?
答案 0 :(得分:1)
我不确定您在SQL Server中使用的功能,但我相信SQL Server Compact Edition 4.0可能很有用 - 如果它支持您使用的所有功能。
我花了一些时间来寻找数据库单元测试的最佳方法并在几年前回来了,附加一个SQL Server是我提出的解决方案,但这很耗时且很笨重。
在最近的一个项目中,我开始使用SQlite进行一个项目,我正在使用ORM(nhibernate)但不得不放弃它,因为我需要存储过程。
This会告诉您是否可以使用SQL Server CE。
答案 1 :(得分:1)
您已经在完整数据库DDL的版本控制中管理脚本或脚本,以便您可以创建新数据库,对吧? :)如果没有,请先做。它的回报不仅仅是测试。
现在您已在版本控制中维护脚本,只需使用首选脚本环境动态创建数据库,并在实际运行测试套件之前使用所需的测试数据填充它。如果您使用的是.NET,则可以使用NANT或类似的东西。在Java世界中,使用Maven或Ant(或Maven AND Ant)。如果您使用的是Rails,请使用Capistrano或仅使用Ruby脚本。换句话说,它取决于。无论如何,最重要的是只创建数据库创建脚本,维护它们,并使用它们按需构建测试数据库,并在完成后(或重新运行脚本时)将其拆除。
答案 2 :(得分:0)
无论如何,我认为SQL服务器支持游标。如果您只是想要清空表格内容,最简单的方法就是drop table <name>
或truncate table <name>
。
答案 3 :(得分:0)
由于它们是验收测试,而不是单元测试,我可能会尝试构建它们,以便每个后续测试都是独立的(相对于数据)或基于先前测试的数据构建,测试在确定性序列。这样,您可以构建数据库一次,并在所有测试完成后进行清理。对于单元测试,我当然会考虑模拟数据库层,以便您的测试永远不会到达实际的数据库。