ale*_*lex 4 c# unit-testing mstest
题:
我试图找出是否有办法在满足特定条件时失败所有C#单元测试.
背景:
我为一个对象设置了单元测试,该对象对其内部数据进行编码和解码.这是一个相当人为的例子:
[TestClass]
public class FooTests
{
private Foo TestFoo { get; set; }
[TestMethod]
public void DataEncodingIsWorking()
{
// TestFoo.EncodeData() ...
}
[TestMethod]
public void DataDecodingIsWorking()
{
// TestFoo.DecodeData() ...
}
public FooTests(dynamic[] data) {
TestFoo = new Foo(data);
}
}
public class Foo {
public void EncodeData() {
// encodes Foo's data
}
public void DecodeData() {
// decodes Foo's encoded data
}
public Foo(dynamic[] data) {
// feeds data to Foo
}
}
Run Code Online (Sandbox Code Playgroud)
而不是创建一个新的实例TestFoo在每一个[TestMethod](有点重复),我创建了一个全球性的TestFoo对象FooTests.如果TestFoo无法实例化,我希望失败所有FooTests单元测试(因为如果对象无法实例化,编码/解码将无法工作).
这不是最佳实践的问题,但我也很好奇这种方法是否可怕.我想另一种方法是设置一个额外的单元测试来查看是否TestFoo正确实例化.
如何故意失败所有C#单元测试
TL; DR:在您的ClassInit()实例化测试所需的任何对象并添加适当的Assert语句.如果任何条件失败,所有测试都将失败.
您可以添加一个在运行任何测试方法之前自动调用的方法,并使用该ClassInitialize属性对其进行修饰.
MSDN:
标识一种方法,该方法包含在测试类中的任何测试运行之前必须使用的代码,并分配要由测试类使用的资源.这个类不能被继承.
...和:
在负载测试中运行时,使用此属性标记的方法将运行一次,并且它执行的任何初始化操作都将应用于整个测试.如果需要对测试中的每个虚拟用户迭代执行一次初始化操作,请使用TestInitializeAttribute.
在下面的示例中,我们实例化一个新Foo对象,Assert而不是null.我们当然可以根据需要测试其他情况.
[ClassInitialize]
public void ClassInit(TestContext context)
{
TestFoo = new Foo(dynamicDataFromContext);
Assert.IsNotNull(TestFoo);
}
Run Code Online (Sandbox Code Playgroud)
如果您对数据驱动的测试感兴趣,那么您可能需要签出如何:创建数据驱动的单元测试
我认为CRice在这个页面上提出了一个很好的观点,Assert.Inconclusive()所以你也可以选择合并它.