2013-03-11 142 views
2

可以说我有一个像下面这样的类。如何写数据库集成测试

我不知道如何编写一个单元/集成测试。它需要重构吗?

它只是添加一个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(); 
     } 
    } 
} 
+0

我想指出你刚发布的另一个问题分钟前:http://stackoverflow.com/questions/15340569/tdd-100-coverage-for-methods-that-wrap-sql/15340652?noredirect=1 #comment21666041_15340652 – 2013-03-11 14:24:05

+0

作为存储库的集成测试,您对我的建议似乎也可以。添加,然后删除,然后检查它是否仍然在数据库中。但是,我更喜欢围绕用例进行集成测试,而不是类。 – 2013-03-11 14:26:30

回答

1

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

Add/Find是单独的Repository方法,它们需要自己进行测试。

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

然后采取行动:呼叫Repository.Deleteproduct(<product id created in setup>)

断言:在安装时创建的产品将被删除(再次查询数据库来检查)。

如果您使用的是ORM,那么此测试也会测试产品的映射。

2

黄金法则不是测试framewkrk的代码。除非这种方法没有定制逻辑,否则没有什么可测试的。 我认为你想要实现的是分开Repository以简化单元测试。做到这一点的最佳方式是为您的存储库创建界面并对其进行模拟。 如果你真的想创建一些集成测试,那么你必须创建一些测试数据库,在那里你可以做你的核炸弹实验。

0

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

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

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