如何故意失败所有C#单元测试

时间:2016-08-31 22:55:15

标签: c# unit-testing mstest

问题:

我正在试图弄清楚是否有办法在满足特定条件时失败所有C#单元测试。

背景

我为一个对象设置单元测试,该对象对其内部数据进行编码和解码。这是一个相当人为的例子:

//A local Object with one element/item for each branch 
  var tree_branches_object = [
        { "branch_level": branchLevel, "BirdsOnBranch": moderate },
        { "branch_level": branchLevel, "BirdsOnBranch": low },
        { "branch_level": branchLevel, "BirdsOnBranch": low },
   ]

//recursive Function 
function TreeFunction() {



//some test variable: Branch Level is set to 1
branchLevel = 1;

// obtain branch-info data from a server via AJAX-ish call 


var childFunction = function () {



    //Check for other branches 
    if (there_are_other_branches_in_the_tree) {

        // ?!? increase the branch level ?!?
        branchLevel++;

        // store the current branchLevel into the tree_branches_object object 
       tree_branches_object.push({ "branch_level": branchLevel, "BirdsOnBranch": low });

        // call TreeFunction again and obtain information for the next branch, until all branches in the three have been vizited.     

    }

}

我没有在每个[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 } } 中创建TestFoo的新实例(有点重复),而是在[TestMethod]中创建了一个全局TestFoo对象。如果FooTests无法实例化,我希望失败所有TestFoo单元测试(因为如果对象无法实例化,编码/解码将无法工作)。

这不是最佳实践的问题,但我也很好奇这种方法是否可怕。我想另一种方法是设置一个额外的单元测试,以查看FooTests是否正确实例化。

2 个答案:

答案 0 :(得分:7)

  

如何故意使所有C#单元测试失败

TL; DR:ClassInit()中,实例化测试所需的任何对象并添加适当的Assert语句。如果任何条件失败,所有测试都将失败。

您可以添加一个在运行任何测试方法之前自动调用的方法,并使用ClassInitialize属性对其进行修饰。

MSDN:

  

标识一种方法,该方法包含在测试类中的任何测试运行之前必须使用的代码,并分配要由测试类使用的资源。这个类不能被继承。

...和

  

在负载测试中运行时,标有此属性的方法将运行一次,并且它执行的所有初始化操作都将应用于整个测试。如果需要对测试中的每个虚拟用户迭代执行一次初始化操作,请使用TestInitializeAttribute。

在下面的示例中,我们实例化了一个新的Foo对象,Assert它不是null。我们当然可以根据需要测试其他情况。

[ClassInitialize]
public void ClassInit(TestContext context)
{
    TestFoo = new Foo(dynamicDataFromContext);
    Assert.IsNotNull(TestFoo);
}

如果您对数据驱动的测试感兴趣,那么您可能需要签出 How To: Create a Data-Driven Unit Test

我认为CRice在此页面上Assert.Inconclusive()提出了mylog({phone_number, name, address}); ,因此您也可以选择合并mylog({phone_number: phone_number, name: name, address: address});

答案 1 :(得分:2)

抛出异常将导致测试失败。或者你可以调用Assert.Fail()。

在测试前置条件失败的情况下,最好使用Assert.Inconclusive()。这样你的测试就会停止(橙色)但不会失败(红色) - 没有结果的状态代表了测试前提条件未达到的情况,你永远不会断言你要测试的是什么。