我正在重写数据库应用程序并使用 Entity Framework 来访问数据库。目前,我正在使用 MSTest 和底层数据库的副本作为这些测试的一部分。我的 MSTest 包含以下代码作为每个测试的一部分:
[TestInitialize()]
public void MyTestInitialize()
{
transScope = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions { Timeout = new TimeSpan(0, 10, 0) });
}
[TestCleanup()]
public void MyTestCleanup()
{
Transaction.Current.Rollback();
transScope.Dispose();
}
现在,这似乎非常适合测试并在测试之间重置数据库。我的测试使用数据库上下文对测试数据库执行 CRUD 操作,然后回滚它们。
我读过一些关于将 C# 库与底层数据库隔离以进行测试的内容,但我想知道这实际上给我带来了什么。作为此重写的一部分,存储过程中的大部分(但不是全部)代码已移至 C# 层,但仍有一些代码通过表上的触发器进行调用。通过模拟数据库层的练习我可以获得什么?坦率地说,当我考虑这样做时,似乎需要做很多额外的工作,没有任何明显的值(value),但也许我没有捕获要点。
想法?
最佳答案
这取决于您正在编写的测试类型。当您想要测试一个代码单元(通常是一个类)编写单元测试时,通常最好满足以下两点:
- 测试应尽可能快地运行。这意味着每秒进行 100 次测试。
- 您正在测试的代码应与其他代码隔离,以便您可以控制依赖项的工作方式并轻松测试不同类型的输入和输出。
如果您使用真实的数据库进行所有测试,这两件事都很难做到。第一个是因为与数据库的往返通常比仅仅运行一些代码花费更多的时间。第二个原因是您需要使用大量不同类型的数据设置数据库,包括负面案例和极端案例,有时甚至会使数据库失败。模拟类的依赖项并传递所需的任何输入通常会更容易。
话虽这么说,我已经编写了许多测试,它们使用与您描述的模式类似的模式,并且它们运行良好并且运行相对较快。就我个人而言,我会结合使用没有数据库的真实单元测试和类似于组件功能测试的测试。最后,做对你有用的事情。
关于c# - 测试时尝试将 C# 代码与底层数据库隔离可以得到什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9652109/