unit testing插入/更新/删除

我用谷歌搜索了一下,并没有找到我需要的答案。

我正在使用SQL Server和LINQ为客户开发C#的网页。 我希望用户能够相互发送消息。 所以我所做的就是用实际进入数据库的数据对其进行unit testing。

问题是我现在依赖至少有2个用户,我知道他的ID。 此外,我必须自我清理。 这导致了相当大的unit testing,在一次测试中进行了很多测试。

让我们说我想更新一个用户。 这意味着我必须停止用户,更新它,然后删除它。 这在一个unit testing中有很多断言,如果失败并且更新,我必须手动删除它。

如果我以任何其他方式执行此操作,而不将数据保存到DB,我肯定无法知道更新后数据是否存在于数据库中等。

如果没有在一次测试中测试大量function的测试,那么正确的方法是什么?

在System.Transactions.TransactionScope块中进行所有测试,并且不要调用Scope.Complete()…当您退出时,所有更改都将回滚,而其他用户将无法看到您的临时数据在数据库中创建,因此测试过程只会影响测试机器。

您可以在TransactionScope的块内输入新用户,读取数据库以validation输入是否正确,以及您需要检查的其他内容…

让单个unit testing方法模拟两个不同的用户,所有这些都在一个事务中……

例如代码

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 } 

拥有一个fixtures文件(XML,SQL,YAML等),只需一个命令即可加载到本地测试数据库中。

例如,两个需要互相发送消息的用户的灯具文件可能看起来像(这是我的):

 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:  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:  upload: "http://localhost/[removed]/images/bunnyhugs.jpg" PrivateMessage: PrivateMessage_1: subject: "Yo" body: | hi escape this html please bye is_read: false Sender: Member_WibWobble Recipient: Member_BunnyHugs 

由于它们的本质(持久存储),unit testing数据库可以是PITA。

要做到这一点,您应该始终使用空白架构。 然后让您的测试代码加载填写必须存在的数据值。 这可以像执行包含架构和默认数据的sql脚本一样简单。

完成后,开始运行测试。 测试应包含您的应用通常会执行的所有操作。

如果发生任何失败,那不是什么大不了的事,因为再次,你应该每次都重新开始。

此外,您希望在测试失败的情况下保留数据,以便在发生故障时检查数据库状态。 所以,这既是好事也是坏事。

沿着这些方向,db测试应该在它自己的测试数据库实例上运行。 这样您就不必担心暂时性问题,比如有人在测试进行过程中更改了您下面的数据库结构。

最终,数据库测试本身就是一个项目。