在MS Unit测试框架中使用Assert.Inconclusive
和IgnoreAttribute
的正确方法是什么?
我们使用Assert.Inconclusive
主要用于以下测试:
我们这样做是因为:
我们的问题是Inconclusive
测试在TFS和Resharper中被标记为错误。如果我们使用IgnoreAttribute
而不是我们将在Resharper中看到这些测试,但MS Test runner和TFS将完全忽略它们。在TFS中使用IgnoreAttribute
和MS Test跑步者就像评论整个测试一样无用。
我想你是如何描述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" />
我通常从我的msbuild脚本中的<Exec>任务运行mstest可执行文件,然后查看TRX内部以确定它是否应该使构建失败。
我也看到当前实施中的两难选择。
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
的当前行为没有报告任何被忽略的测试作为应该修复的错误。
随意向上投票以下错误报告:
我一直在研究这个问题,并在家里尝试一下。最终结果是我相信MSTest的[Ignore]属性确实完全忽略了测试方法。我试着查看Visual Studio中的设置,看看是否有覆盖,但找不到任何东西。
对此感到羞耻,因为没有看到被忽略的测试是不好的,因为你可能最终认为你有一套100个MSTest测试运行得很好,但事实证明,结果中有50个你从未知道由于[Ignore]
属性! Urgh。
传统上,在测试时,单元测试应该非常具体,以便在功能和这些功能的测试之间存在(接近)一对一的对应关系。
为了测试某些特征,首先需要使被测系统(SUT)进入某种状态。达到该状态后,测试可以实际测试其所针对的功能。现在,如果已经设置部件失败,那么这种测试的状态应该是什么。它无法对被测功能的功能做出声明,因为测试从未达到要求运行该功能的状态。
在这种情况下,通常会分配一个不确定的结果,因为我们根本无法知道该功能是否正常工作,因此我们无法通过或失败。设置本身不能按预期工作的事实应该通过单独的测试来涵盖。
所以想象一下,我想测试一下''''''''''''''''''''''''''''''''''''''''''''''''这个测试不应该测试'foo'是否可以'bar',所以任何'bar'的失败将返回一个不确定的,而未能回应'qux'将是适当的失败。
截至MSDN文档:
我认为当你必须使用哪一个时,这些是真正明确的陈述。