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



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

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
  • 阿多
  • 尼特
  • 杜尼特

为了把这一点带回家。

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

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

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

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

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

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

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

最新更新