如何打破UnitTesting.Assert.AreEqual?

时间:2013-01-08 09:50:18

标签: c# visual-studio-2010 unit-testing

VS UnitTest项目中断言的标准行为是告诉我测试在特定行上失败。

但是,如果我在这样的断言失败时能够破解,那么它会很方便。因为只在该行上设置断点也会导致测试用例失败。如果我能断言断言失败,我可以立即看到哪个测试用例失败。

当断言失败时,如何暂时告诉VS中断?

E.g。我在单元测试中以下列方式有很多循环,并想知道哪个迭代失败了:

foreach(var testcase in testcases)
{
    Assert.AreEqual(testcase.ExpectedOutputData, FuncionUnderTest(testcase.InputData));
}

3 个答案:

答案 0 :(得分:5)

只需使用条件断点,并将其置于断言检查的逻辑否定之处。

就我个人而言,我认为断点严重未被充分利用,只不过是“此时突破”工具 - 它们非常通用,并且可以轻松地用于代替Console.WriteLine来显示调试输出而无需实际修改代码,以及仅在断言失败时才会中断。

如果过度使用这种方式,它们确实会导致一点性能损失,但这很少是运行单元测试的问题。

答案 1 :(得分:4)

在没有太多了解你如何构建单元测试的情况下,在我看来,如果你正在努力查看哪个断言导致你的单元测试失败,那么也许你在个别测试中测试太多了?单元测试应该尽可能原子化,以正确地否定这个问题。如果你可以打破你的测试,甚至在单个测试中只有一个断言,那么找出哪个测试失败就会容易得多。我肯定会提倡将特定于断点的代码写入单元测试中。

答案 2 :(得分:2)

如果你使用nUnit,你可以使用它来分别调试:

[TestCase(0)]
[TestCase(1)]
public void NunitTestCases(int expected)
{
    Assert.AreEqual(expected,0);
}

我想你总能做到这一点:

[Test]
public void BreakTest()
{
    for (int i = 0; i < 2; i++)
    {
        bool condition = i == 0;
        if(!condition)
            Debugger.Break();
        Assert.IsTrue(condition);
    }
}