2

我刚刚开始了解单元测试在 ac# 环境中的重要性。现在,我想知道如何实现一个黑盒单元测试,它在数据库上执行插入、删除和更新,然后在成功测试后清理数据。

您实际上如何执行回滚插入/更新/删除数据的过程?您是否只是重置索引并删除插入的行?还是通过创建脚本来恢复表的原始状态?

请指导我,我很感激。谢谢!

4

5 回答 5

5

我们在开发周期中所做的工作。当我们开发应用程序时,我们总是会想到单元测试和负载测试。因此,我们在每个 datadase 的表中使用 userId 或其他方式创建一列。然后,当我们运行负载测试或单元测试时,我们在每一列中插入UserId -1,指出它是负载测试数据,如果是单元测试数据,则插入-2。然后我们在数据库端预定义作业,一段时间后将清理该数据。

于 2010-12-08T05:51:10.120 回答
3

只要您的测试简洁,并且我认为它必须是 - 为了测试您的 DAL,为什么不在测试完成后回滚的事务中执行插入/更新/删除。

另一种选择是在您的测试清理方法中使用特定的更新/删除脚本来回滚您更新/插入到其测试前值的确切更改。

于 2010-12-08T05:56:24.757 回答
1

我认为删除 CleanUp 方法中的行应该是不错的选择。

这样,您将始终测试您的删除行代码。

于 2010-12-08T05:42:53.830 回答
0

一种选择是使用模拟数据库代替真实数据库。这是一个描述它的链接

于 2010-12-08T05:41:13.110 回答
0

我最近在做一项研究,也发现了这个线程。以下是我的发现,可能对未来的读者有所帮助:

  • 让测试负责恢复他们更改的数据。就像撤消命令一样。测试通常知道预期的数据更改,因此能够在理论上还原这些更改。这肯定会涉及额外的工作,并且可能会引入一些噪音,除非它是自动化的,例如,您可能会尝试以某种方式跟踪测试中创建/更新的数据;
  • 将每个测试包装在事务中,然后将其还原。和上面的差不多,但是用 TransactionScope 之类的东西更容易实现。如果应用程序创建自己的事务,因为事务通常不可组合,并且应用程序不能与 TransactionScope 一起使用(例如,实体框架存在问题),则可能不适合;
  • 以某种聪明的方式断言仅与测试相关的数据。然后你不需要清理任何东西,除非有太多数据。例如,您可以让您的应用程序了解测试并将特定值设置为添加到每个表的仅测试列。我从来没有在实践中尝试过。
  • 为每次测试从头开始创建和初始化新数据库;
  • 使用数据库备份将数据库恢复到您需要的位置;
  • 使用数据库快照进行还原;
  • 执行脚本删除所有数据并重新插入。

我个人使用后者,甚至最终实现了一个Reseed库,它为我完成了所有工作。

测试框架通常允许在每次测试/测试夹具运行之前和之后执行一些逻辑,这很可能是上述想法所需要的。例如,对于 NUnit,这是使用OneTimeSetUpOneTimeTearDownFixtureSetUpFixtureTearDownSetUpTearDown属性实现的。

于 2021-11-09T20:19:28.417 回答