0

我如何编写与数据库对话的单元集成测试。例如:

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");
}

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

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


注意:语言/框架不可知。该代码有意包含以下元素:

  • C#
  • 德尔福
  • ADO.net
  • ADO
  • 单元
  • 单位

为了把那个点带回家。

4

1 回答 1

1

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

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

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

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

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

你如何开始这个?首先你能重建你的数据库吗?在走这条路很远之前,您需要能够自动执行此操作。

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

于 2012-05-11T11:35:10.827 回答