c# - 测试时尝试将 C# 代码与底层数据库隔离可以得到什么好处?

标签 c# mysql entity-framework testing integration-testing

我正在重写数据库应用程序并使用 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/

相关文章:

c# - 如何从动态创建的类中获取对对象实例的引用

c# - sp_tablecollat​​ions_100 是做什么的?

c# - 在 Expression 中调用 Any 并传递委托(delegate)

php - 如何在不使用广度优先遍历的情况下找到二叉树第 k 层的节点数?

php - 根据外部来源插入、更新或删除记录的正确方法是什么?

linq - 如何检查 LINQ 中服务器端集合中的列表中是否缺少任何值? (给出 SQL)

c# - 在 ASP.NET MVC 4 C# Code First 中指定 ON DELETE NO ACTION

c# - 使用 C# 以编程方式从亚马逊购买商品

c# - 在 EF 4.1 预加载中,如何加载多个(同一级别)孙子关系?

php - 选中多个复选框时将值发送到数据库