如何集成测试对象与数据库查询

时间:2012-05-09 17:55:52

标签: unit-testing language-agnostic integration-testing

如何编写与数据库通信的单元集成测试。 e.g:

public int GetAppLockCount(DbConnection connection)
{
    string query := 
          "SELECT"+CRLF+
          "   tl.resource_type AS ResourceType,"+CRLF+
          "   tl.resource_description AS ResourceName,"+CRLF+
          "   tl.request_session_id AS spid"+CRLF+
          "FROM sys.dm_tran_locks tl"+CRLF+
          "WHERE tl.resource_type = 'APPLICATION'"+CRLF+
          "AND tl.resource_database_id = ("+CRLF+
          "    SELECT dbid"+CRLF+
          "    FROM master.dbo.sysprocesses"+CRLF+
          "    WHERE spid = @@spid)";

    IRecordset rdr = Connection.Execute(query);

    int nCount = 0;
    while not rdr.EOF do
    {
       nCount := nCount+1;
       rdr.Next;
    }

    return nCount;
 }

在这种情况下,我试图驱除这个错误代码(IRecordset返回空记录集)。

[UnitTest]
void TestGetLockCountShouldAlwaysSucceed();
{
   DbConnection conn = GetConnectionForUnit_IMean_IntegrationTest();
   GetAppLockCount(conn);
   CheckTrue(True, "We should reach here, whether there are app locks or not");
}

现在我需要的是在运行 unit 集成测试时连接到某些数据库的方法。

人们是否将连接字符串存储在某处以供测试运行者查找? .ini.xml.config文件?


注意:语言/框架无关。该代码有意包含以下元素:

  • C#
  • 的Delphi
  • ADO.net
  • ADO
  • NUnit的
  • DUNIT

为了把这一点带回家。

1 个答案:

答案 0 :(得分:1)

  

现在我需要的是在运行单元集成测试时连接到某个数据库的方法。

使用现有数据库或内存数据库。我已经尝试了当前使用的现有数据库,该数据库是使用ant文件中的Liquibase脚本进行拆分和重建的。 内存中的优点 - 不依赖于其他应用程序。 缺点 - 不太真实,需要时间才能启动。 真实数据库的优点 - 可以与现实世界相同 缺点 - 需要访问第三方机器。设置新用户的更多工作(即创建新数据库)

  

人们是否将连接字符串存储在某处以供测试运行者查找? .ini或.xml或.config文件?

叶氏。在C#中,我在java a .props文件中使用了.config文件。对于内存中,您可以将其放入版本控制中,因为对于每个人来说都是相同的,在某个地方运行真实数据库,每个用户都需要有不同的。

您还需要考虑种子数据。在Java中,我过去使用过dbUnit。不是最可读,但有效。现在我使用Ruby ActiveRecord任务。

你是如何开始的?首先,您可以重建数据库吗?你需要能够在走这条路之前实现自动化。

接下来,您应该为测试建立一个空白的本地数据库。我选择每个开发人员,其他一些团队分享,但不承诺。在.NET / MS SQL世界中,我认为在内存中很容易做到。