【问题标题】:How to write integration test against database如何编写针对数据库的集成测试
【发布时间】:2013-03-11 14:20:03
【问题描述】:

假设我有一个像下面这样的课程。

我不确定如何针对它编写单元/集成测试。需要重构吗?

会不会只是添加一个 Add/Find 方法(实际上它应该有),在测试中调用 Add,然后调用 Delete,然后调用 Find?

public class Repository
{
    public void DeleteProduct(int id)
    {
        var connstring = ""; //Get from web.config
        using(SqlConnection conn = new SqlConnection(connstring))
        {
            conn.Open();
            SqlCommand command = new SqlCommand("DELETE FROM PRODUCTS WHERE ID = @ID")
            command.Paramaters.Add("@ID", id)
            command.ExecuteNonQuery();
        }
    }
}

【问题讨论】:

  • 我想向您指出几分钟前发布的另一个问题:stackoverflow.com/questions/15340569/…
  • 您的提议对我来说似乎也可以,作为存储库的集成测试。添加,然后删除,然后检查它是否仍在数据库中。但是,我更喜欢围绕用例而不是类进行集成测试。

标签: c# .net unit-testing integration-testing


【解决方案1】:

黄金法则是不要测试framewkrk 的代码。除非此方法没有自定义逻辑,否则无需测试。 我认为您想要实现的是分离存储库以简化单元测试。最好的方法是为您的存储库创建接口并模拟它。 如果您真的想创建一些集成测试,那么您必须创建一些测试数据库,您可以在其中进行核弹实验。

【讨论】:

    【解决方案2】:

    我的建议 - 为存储库编写集成测试(因为您使用的是数据访问框架),除非您在存储库中执行的不仅仅是 CRUD。

    Add/Find都是单独的Repository方法,需要自己测试。

    我建议使用Setup 设置种子数据,你知道你可以采取行动。在这种情况下,将记录插入到Products 表中。

    然后行动:致电Repository.Deleteproduct(<product id created in setup>)

    断言:setup中创建的产品已删除(再次查询数据库检查)。

    如果您使用的是 ORM,此测试还将测试您的 Product 映射。

    【讨论】:

      【解决方案3】:

      我从未为数据库调用添加单元测试。这绝对是一个集成测试。没有什么可观察到的供您检查。

      我知道 Java 有一些适合 JUnit 的工具。 IT 要求您编写模仿前后的 XML 文件,然后将表的内容与 XML 文件进行比较。我确信.Net 会有类似的东西。但是我不确定这是否值得。我发现这些测试非常脆弱并且提供的价值很小。

      我建议采取务实的方法,不要为数据库对象编写测试。而是测试那些与您的数据库对象交互的对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-15
        • 2011-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-28
        • 1970-01-01
        相关资源
        最近更新 更多