我用谷歌搜索了一下,并没有找到我需要的答案。
我正在使用SQL Server和LINQ为客户开发C#的网页。 我希望用户能够相互发送消息。所以我所做的就是用实际进入数据库的数据对其进行单元测试。
问题是我现在依赖至少有2个用户,我知道他的ID。此外,我必须自我清理。这导致了相当大的单元测试,在一次测试中进行了很多测试。
假设我想更新用户。这意味着我必须终止用户,更新它,然后删除它。这在一个单元测试中有很多断言,如果失败并且有更新,我必须手动删除它。
如果我以任何其他方式执行此操作,而不将数据保存到数据库,我肯定无法在更新等后知道数据存在于数据库中。
如果没有在一次测试中测试大量功能的测试,那么正确的方法是什么?
答案 0 :(得分:17)
在System.Transactions.TransactionScope块中进行所有测试,并且不要调用Scope.Complete()...当您退出时,所有更改都将回滚,其他用户将无法看到您在数据库中创建的临时数据,因此测试过程只会影响测试机器。
您可以在TransactionScope的块内输入新用户,读取数据库以验证输入是否正确,以及您需要检查的其他内容......
让单个单元测试方法模拟两个不同的用户,所有这些都在一个事务中......
e.g。代码
using (var scop = new System.Transactions.TransactionScope())
{
// all your test code and Asserts that access the database,
// writes and reads, from any class, ...
// to commit at the very end of this block,
// you would call
// scop.Complete(); // ..... but don't and all will be rolled back
}
答案 1 :(得分:4)
拥有一个fixtures文件(XML,SQL,YAML等),只需一个命令即可加载到本地测试数据库中。
E.g。需要互相发送消息的两个用户的fixtures文件可能看起来像(这是我的):
Member:
Member_WibWobble:
username: Wibble_Wobble
email_address: michael+dev_wibwob@[removed].com
password: pw
is_super_admin: true
last_login: "2010-01-06 12:12:57"
Country: country_AU
UploadImage:
type: <?php echo UploadImage::TYPE_MEMBER_AVATAR."\n"; ?>
upload: "http://localhost/[removed]/images/wibwobble.jpg"
Member_BunnyHugs:
username: BunnyHugs
email_address: michael+dev_bunny@[removed].com
password: pw
is_super_admin: true
last_login: "2009-12-01 14:11:11"
Country: country_UK
UploadImage:
type: <?php echo UploadImage::TYPE_MEMBER_AVATAR."\n"; ?>
upload: "http://localhost/[removed]/images/bunnyhugs.jpg"
PrivateMessage:
PrivateMessage_1:
subject: "Yo"
body: |
hi
<b>escape this html please</b>
bye
is_read: false
Sender: Member_WibWobble
Recipient: Member_BunnyHugs
答案 2 :(得分:4)
单元测试数据库可以是PITA,因为它们的本质(持久存储)。
要做到这一点,您应该始终使用空白架构。然后让您的测试代码加载填写必须存在的数据值。这可以像执行包含架构和默认数据的sql脚本一样简单。
完成后,开始运行测试。测试应包含您的应用通常会执行的所有操作。
如果发生任何失败,这并不是什么大不了的事,因为再次,你应该每次都重新开始。
此外,您希望在测试失败的情况下保留这些数据,以便您可以在发生故障时检查数据库状态。所以,这既是好事也是坏事。
沿着这些方向,db测试应该在它自己的测试数据库实例上运行。这样您就不必担心暂时性问题,例如在测试进行过程中有人在您下面更改数据库结构。
最终,数据库测试本身就是一个项目。