【问题标题】:Comparing two DataTables (Unit Testing, Integration Testing, C#, TestMethod)比较两个数据表(单元测试、集成测试、C#、TestMethod)
【发布时间】:2013-03-05 10:27:19
【问题描述】:

单元测试比较应该不同且多行的Datatables时应该进行什么样的测试。

    [TestMethod]
    public void ExecuteOutWithMultipleDataTables()
    {
        //Arrange
        int id1 = TestOrderBuilder.New().Build();
        DataTable dtDefault = CreateDefaultDataTable(id1, "OUT", "TableDesc", DateTime.Now);

        //Act
        object[] result = OracleDatabase.ExecuteOut(SqlStatements.Cursor, procedureParameters);
        DataTable dtResults = result[0] as DataTable;

        //Assert
        Assert.IsNotNull(dtDefault);
        Assert.IsNotNull(dtResults);
        Assert.AreNotEqual(dtDefault, dtResults);
        Assert.AreNotSame(dtDefault.Rows[0][0], dtResults.Rows[0][0]);
        Assert.AreNotSame(dtDefault.Rows[0][1], dtResults.Rows[0][1]);
    }

这是我已经写过的一些例子,但我不确定我是否走在正确的轨道上。

有人有什么建议吗?

苹果机

【问题讨论】:

  • 是单元测试吗?我怀疑,看起来像集成测试
  • 对不起,是的,我认为它在一定程度上是集成测试。 dtDefault 只是一个组成的默认数据表,这无关紧要,但 dtResults 是从数据库中提取的(但也是基本默认值,无关紧要)。

标签: c# unit-testing datatable integration-testing assert


【解决方案1】:

如果你需要验证每一行和每一列的值,你需要编写一个辅助方法。

此外,它看起来不像是单元测试,因为它看起来您是在调用真实数据库而不是模拟它。

可能如下所示

private bool IsTableSame(DataTable t1, DataTable t2)
    {
        if (t1 == null)
            return false;
        if (t2 == null)
            return false;
        if (t1.Rows.Count != t2.Rows.Count)
            return false;

        if (t1.Columns.Count != t2.Columns.Count)
            return false;

        if (t1.Columns.Cast<DataColumn>().Any(dc => !t2.Columns.Contains(dc.ColumnName)))
        {
            return false;
        }

        for (int i = 0; i <= t1.Rows.Count-1; i++)
        {
            if (t1.Columns.Cast<DataColumn>().Any(dc1 => t1.Rows[i][dc1.ColumnName].ToString() != t2.Rows[i][dc1.ColumnName].ToString()))
            {
                return false;
            } 
        }

        return true;
    }

【讨论】:

  • 辅助方法怎么写?是的,它是集成测试,而不是单元测试。
  • 这看起来很棒,但是这条线有什么作用? if (t1.Columns.Cast().Any(dc => !t2.Columns.Contains(dc.ColumnName))) 什么是 DC?
  • 感谢您分享此内容。此外,我建议在方法中使用断言,当它们失败时提供有意义的消息。这样可以更轻松地对失败的单元测试进行故障排除。
【解决方案2】:

我已经包装了上面相同的辅助方法来使用断言。它有助于调试单元测试。

private void AssertTableRecordsAreEqual(DataTable expectedTable, DataTable actualTable)
    {
        Assert.IsNotNull(actualTable, "Table is empty");
        Assert.AreEqual(expectedTable.Columns.Count, actualTable.Columns.Count, "Number of columns in actual and expected tables are different");
        Assert.AreEqual(expectedTable.Rows.Count, actualTable.Rows.Count, "Number of records in actual and expected tables are different");
        Assert.IsFalse(expectedTable.Columns.Cast<DataColumn>().Any(dc => !actualTable.Columns.Contains(dc.ColumnName)), "Table column names are different");

        for (int i = 0; i <= expectedTable.Rows.Count - 1; i++)
        {
            Assert.IsFalse(expectedTable.Columns.Cast<DataColumn>().Any(dc1 => expectedTable.Rows[i][dc1.ColumnName].ToString() != actualTable.Rows[i][dc1.ColumnName].ToString()), "Table row value is different");
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多