单元测试DAL - 请批评

时间:2009-10-27 16:15:03

标签: unit-testing data-access-layer

在我的简单项目中,我已经准备好对DAL进行单元测试了。

我基本上有一个名为FooDataAccess的类,它有几个非常简单的函数,让我们说3个像这样:

int InsertFoo(string fooName)
void UpdateFoo(int fooID, string fooName)
void InsertFoosDepedency(int fooID, string someValue)

我做的是这个 - 在我的单元测试项目中放入4个SQL脚本,最后一个作为嵌入式资源。

1)创建(单元测试)数据库脚本,2)创建对象脚本,3)插入查找表值和4)删除所有但查找表值

这个想法是,任何第一次使用该项目的人都应该手动运行脚本1-3作为一次性设置。然后在启动每个单元测试时执行脚本#4 ...(在小型应用程序中,您甚至可以在测试级别运行所有这些)

好的,到目前为止一直很好......

所以我将单元测试数据库设置为空白。测试第一个函数InsertFoo()显然非常简单。我调用该函数,然后只是Assert(ExecuteSQL(“从foo中选择计数(*)”)> 1),断言(ExecuteSQL(“从t_foo中选择fooName”)=预期))等等。

我有点困难的是那些需要依赖的东西,比如我的例子中的第三个函数,甚至是更新。

暂时删除测试范围内的所有外键约束是否有意义?否则,为了单元测试InsertFoosDepedency(int fooID,string someValue)函数,我必须先执行一些任意的sql(手动将记录插入FOO表并返回FooID)...

或者,我应该做后者吗?

非常感谢任何和所有反馈。

更新:它使用内联SQL干净利落地创建依赖项。我想我只是在寻找评论&批评这种单元测试DAL的方法。再次感谢

2 个答案:

答案 0 :(得分:2)

这听起来和我的做法非常相似。我在start of each test销毁数据库中的所有数据,然后在测试设置阶段建立测试所需的内容。所以对UpdateFoo我会有

void update_existingKey_updatesValue() {
   String expected = "jeff";

   clearDatabase();
   // Note I would use dbUnit.
   executeSQL("insert into foo values (1, 'fred')");

   DAL subject = new DAL(...);
   subject.update(1, expected);  

   //Note I would use dbUnit.   
   String actual = executeSQL("select name from foo where id = 1"); 
   assert(expected, actual);
}

在Java中,我使用名为dbUnit的工具,您的方法名称建议使用C#,所以我会指向dbUnit.Net但是我从未使用过这个。这提供了一种更好的(IMO无论如何)填充数据库和验证数据库内容的方法。

答案 1 :(得分:1)

为了测试,我会说从不使用您的架构。如果你没有把它放回去,或者你的代码将它丢回,你就会很快发现自己陷入混乱。

您可以使用Mock Objects吗?

如果不是,我认为您所能做的就是为每个测试设置数据库预先请求。

您可以为每个测试考虑一个单独的类,并使用Setup和Teardown方法使数据库处于正确的测试条件。

或者你只需​​要在Test方法中进行特定于测试的设置(然后你就可以使用Teardown清空数据库了。)