none
请教单元测试中断言的写法 RRS feed

  • 问题

  • TDD中说编写产品代码前先编写测试, 请问像这样的方法单元测试里应该怎么写断言
     public static DataTable Search(string keyword, int typeId, int startRow, int maximum)
    如何知道返回的DataTable是期望的内容呢
    2009年8月10日 8:02

答案

  • 你好 你将光标放置到这个函数处,然后单击右键,在弹出的ContextMenu中选择创建单元测试
    设置好后,系统会自动生成单元测试的项目和这个方法的测试的单元测试代码
    你可以在具体的测试代码中对key等参数赋值

    对于DataTable这种非基元的数据类型,一般你可以比较期望的和实际的列数、列名、行数、每列每行的值是否相等等,期望值可能需要自己手动添加


    这里给个简单的例子

     /// <summary>
          ///GetNewDataTable () 的测试
          ///</summary>
          [TestMethod()]
          public void GetNewDataTableTest()
          {
             DataTable source = this.TestDataTable(); // TODO: 初始化为适当的值

             string teleNum = "电话号码"; // TODO: 初始化为适当的值

             //LatestConnectRecordsProcessor target = new LatestConnectRecordsProcessor(source, teleNum);

             DataTable expected = this.ExpectedDataTable();//这里手动或者其他方式获得期望的DataTable
             DataTable actual;

             actual = this.TestDataTable(); //通过需要测试的方法获得
             Assert.AreEqual(actual.Rows.Count, expected.Rows.Count);
             //Assert.AreEqual(actual.Columns.Count, expected.Columns.Count, "列数不一致");

             foreach (DataRow row in expected.Rows)
             {
                foreach (DataColumn c in expected.Columns)
                {
                   if (c.ColumnName == "Oper" || c.ColumnName == "OperDateTime")
                   {
                      Assert.AreEqual("1", "0", row[c].ToString());
                    
                   }
                }
             }

             //actual = target.GetNewDataTable();
             //Assert.AreEqual(expected,actual);

             //Assert.AreEqual(expected, actual, "Inphase.Project.Bops.IntegrativeQuery.DataProcessing.LatestConnectRecordsProcesso" +"r.GetNewDataTable 未返回所需的值。");
             //Assert.Inconclusive("验证此测试方法的正确性。");
          }

         


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年8月10日 8:17
    版主

全部回复

  • 你好 你将光标放置到这个函数处,然后单击右键,在弹出的ContextMenu中选择创建单元测试
    设置好后,系统会自动生成单元测试的项目和这个方法的测试的单元测试代码
    你可以在具体的测试代码中对key等参数赋值

    对于DataTable这种非基元的数据类型,一般你可以比较期望的和实际的列数、列名、行数、每列每行的值是否相等等,期望值可能需要自己手动添加


    这里给个简单的例子

     /// <summary>
          ///GetNewDataTable () 的测试
          ///</summary>
          [TestMethod()]
          public void GetNewDataTableTest()
          {
             DataTable source = this.TestDataTable(); // TODO: 初始化为适当的值

             string teleNum = "电话号码"; // TODO: 初始化为适当的值

             //LatestConnectRecordsProcessor target = new LatestConnectRecordsProcessor(source, teleNum);

             DataTable expected = this.ExpectedDataTable();//这里手动或者其他方式获得期望的DataTable
             DataTable actual;

             actual = this.TestDataTable(); //通过需要测试的方法获得
             Assert.AreEqual(actual.Rows.Count, expected.Rows.Count);
             //Assert.AreEqual(actual.Columns.Count, expected.Columns.Count, "列数不一致");

             foreach (DataRow row in expected.Rows)
             {
                foreach (DataColumn c in expected.Columns)
                {
                   if (c.ColumnName == "Oper" || c.ColumnName == "OperDateTime")
                   {
                      Assert.AreEqual("1", "0", row[c].ToString());
                    
                   }
                }
             }

             //actual = target.GetNewDataTable();
             //Assert.AreEqual(expected,actual);

             //Assert.AreEqual(expected, actual, "Inphase.Project.Bops.IntegrativeQuery.DataProcessing.LatestConnectRecordsProcesso" +"r.GetNewDataTable 未返回所需的值。");
             //Assert.Inconclusive("验证此测试方法的正确性。");
          }

         


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年8月10日 8:17
    版主
  • 谢谢回复,很详细,不过我这里还有点问题还望指教一下

    public void GetNewDataTableTest()
    {
     ....
     DataTable expected = this.ExpectedDataTable();//这里手动或者其他方式获得期望的DataTable
     DataTable actual;
     actual = this.TestDataTable(); //通过需要测试的方法获得
     Assert.AreEqual(actual.Rows.Count, expected.Rows.Count);
     .....
    }


    1 上面那个单元测试是测试this.TestDataTable() 的正确性的 ,但是这里又调用了 this.ExpectedDataTable() 他们的行为都是一样的那我还需要对这个方法写单元测试吗?

    2 另外这2个方法是不是调用的同一个数据源?如果不是的话,那么如果我增加或删除数据库中数据的话原本正确的单元测试不是就出问题了吗?
    • 已编辑 Microsoft.NET 2009年8月10日 9:01 没有表述清除
    2009年8月10日 8:43
  • 你好,你问得很好 this.TestDataTable();  这个方法其实就是调用的GetNewDataTable这个方法
    只是由于在我们这个项目中的具体限制,比如读取数据库连接等不适通过一般的方法,我直接没法读取的 而需要更改一下那个方法中连接数据库的部分代码 否则无论如何都会出错的,这个是我们项目部署和本身程序的问题,因为我指负责一部分工作 整体部署不是由我自己来弄,所以我很难去更改的,只有自己重新弄个大致一致的方法,除了数据库连接那部分代码不一样其他都一样的
    从理论上做 我这样做是错误的,只不过我这里为了稍微检查下正确性而这样做的

    在实际中 自动生成的代码 会是MyClass a=new myClass();  actual = a.GetNewDataTable();
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年8月10日 8:50
    版主