Assert.Inconclusive和IgnoreAttribute

时间:2011-01-19 09:29:07

标签: .net unit-testing resharper mstest team-build

在MS Unit测试框架中使用Assert.InconclusiveIgnoreAttribute的正确方法是什么?

我们主要使用Assert.Inconclusive进行以下测试:

  • 尚未实施
  • 某种方式破碎或不完整=需要进一步关注
  • 当测试体因任何原因被注释掉时

我们这样做是因为:

  • 不确定的测试可以有消息
  • 我们希望在TFS
  • 的测试结果中看到这样的测试

我们的问题是Inconclusive测试在TFS和Resharper中都被标记为错误。如果我们使用IgnoreAttribute代替我们将在Resharper中看到这些测试,但MS Test runner和TFS将完全忽略它们。在TFS中使用IgnoreAttribute和MS Test跑步者就像评论整个测试一样无用。

5 个答案:

答案 0 :(得分:13)

我也看到当前实施中的两难选择。

  • Inconclusive断言包含在TRX报告中,但mstest.exe(以及vstest.console.exe)将在执行后返回1(表示错误)。
  • 具有Ignore属性的TestMethods不会被报告为错误,但它们在TRX报告中完全隐藏

我的个人理解如下:

使用[Ignore]属性(暂时)禁用/跳过该方法:

[TestMethod]
[Ignore] // <== disabled through "Ignore" attribute
public void Test001()
{
   //execute some stuff ...
   Assert.IsTrue(...);

   //execute some stuff ...
   Assert.AreEqual(...);
}

为此目的滥用Inconclusive断言:

[TestMethod]
public void Test002()
{
    Assert.Inconclusive(); // <== misuse of "Inconclusive" to skip this test

    //execute some stuff ...
}

相反,Inconclusive应该有条件地使用:只有当我们无法判断要测试的组件是否按预期工作时才会使用。
例如,如果我们依赖的外部资源在测试执行时不可用:

[TestMethod]
public void Test003()
{
    //check if the server is running,
    //otherwise can can't test our local client component!
    if (!WebServiceAvailable())
    {
        Assert.Inconclusive(); // <== skip remaining code because the resource is not available
    }

    //execute some stuff ...
    Assert.AreEqual(...);

    //execute some stuff ...
    Assert.AreEqual(...);
}

_ _

<强>结论
要禁用/跳过测试,逻辑方式是使用[Ignore]属性 我清楚地看到mstest.exe的当前行为没有报告任何被忽略的测试作为应该修复的错误

随意对以下错误报告进行投票:

答案 1 :(得分:7)

我喜欢思考你是如何描述Inconclusive是正确的用法。

虽然根据我的经验,Inconclusive被视为警告而不是错误。实际上,它们在TRX中与错误分开报告:

<TestRun>
   <ResultSummary outcome="Inconclusive">
      <Counters total="1" 
          executed="0" error="0" failed="0" 
          timeout="0" aborted="0" inconclusive="1" 
          passedButRunAborted="0" notRunnable="0" 
          notExecuted="0" disconnected="0" 
          warning="0" passed="0" completed="0" 
          inProgress="0" pending="0" />

我通常从&lt; Exec&gt;运行mstest可执行文件。在我的msbuild脚本中执行任务,然后在TRX中查看是否应该使构建失败。

答案 2 :(得分:3)

我一直在研究这个问题,并在家里尝试一下。最终结果是我相信MSTest的[Ignore]属性确实完全忽略了测试方法。我尝试在Visual Studio中查看设置是否有覆盖,但找不到任何内容。

对此感到羞耻,因为没有看到被忽略的测试是不好的,因为你可能最终认为你有一套100个MSTest测试运行得很好,但事实证明结果中有50个你从未知道由于[Ignore]属性! Urgh。

答案 3 :(得分:3)

经典地,在测试时,单元测试应该非常具体,以便在功能和测试这些功能之间存在(接近)一对一的对应关系。

要测试某些功能,首先需要将被测系统(SUT)置于某种状态。达到该状态后,测试可以实际测试其所针对的功能。现在,如果已经设置部件失败,那么这种测试的状态应该是什么。它无法对被测功能的功能做出声明,因为测试从未达到要求运行该功能的状态。

在这种情况下,通常会指定一个不确定的结果,因为我们根本无法知道该功能是否正常工作,因此我们无法通过或失败。设置本身不能按预期工作的事实应该通过单独的测试来涵盖。

想象一下,我想测试一下''''''''''''''''''''''''''''''''''''''''''''''''这个测试不应该测试'foo'是否可以'bar',所以任何'bar'的失败将返回一个不确定的,而未能回应'qux'将是适当的失败。

答案 4 :(得分:3)

从MSDN文档开始:

  1. <强> IgnoreAttribute (自VS 2005开始)意味着&#34; 不应该运行此测试&#34; 见https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.ignoreattribute(v=vs.80).aspx

  2. Assert.Inconclusive (自VS 2005开始)意味着&#34; 表示无法证明断言是真还是假。也用于表示尚未实现的断言。&#34;见https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.assert.inconclusive(v=vs.80).aspx

  3. 我认为当你必须使用哪一个时,这些都是明确的陈述。