Java中的可逆资源修改

时间:2018-05-08 14:20:45

标签: java testing junit testng

因此,有一个巨大的java测试框架项目与各种硬件组件一起工作。问题是:@After方法在@Before方法中,如果出现异常/ hw故障等,则无法决定将哪些资源设置回相应的原始状态/值。这可能会危及后续依赖于相同hw元素状态的测试用例(大多数是假阴性)。

我想分别在遇到错误之前撤消@BeforeMethod中发生的所有对象修改。这样我就可以使其他测试更容易出错(获得漏报的可能性更小)。

为每个套件定义一个原子状态不是一个选项(在我看来) - 太麻烦,需要大量的代码修改,因此为每个对象设置原子状态可能需要比它应该花费更多的时间。 / p>

有什么建议吗?你知道这类问题有什么好的测试指南/模式吗?

编辑:

TestClass1{

@BeforeMethod
method(){
    resource1.setfoo("foo");
    resource1.setbar("bar"); 
    ...
    resource7.setfoo("bar"); // -> hw error occurs, testmethod1 is not run
    ...
}

testmethod1(){
    foo.bar();
}

}


TestClass2{

testmethod2(){
    assertTrue(resource1.doSomething()); /*fails because some combination of 
    the resource modifications that happened in the previous @Beforemethod 
    in TestClass1 changed the hardware operation in some way. */
}

}

1 个答案:

答案 0 :(得分:0)

只要有明确的方法来反转资源状态,就没有必要处理原子状态。例如,在@BeforeMethod中添加计数器和try / catch块可能就足够了:

@BeforeMethod
void method(){
    int setupStep = 0;
    try {
        resource1.setfoo("foo");
        setupStep++; //1
        resource1.setbar("bar");
        setupStep++; //2
        ...
        resource7.setfoo("bar"); // -> hw error occurs, testmethod1 is not run
        setupStep++; //99
        ...
    } catch (Exception e) {
        switch (setupStep) {
            case 99:
                resource7.setfoo("bar_orig");
            ...
            case 2:
                resource1.setbar("bar_orig");
            case 1:
                resource1.setfoo("foo_orig");
            default:
                // Failed on first step
        }
        throw e; //Make sure the set-up method fails
    }
}

请注意使用switch块的降低功能。