如何基于以前的@Test测试结果在TestNG中启用@Test方法

时间:2019-09-24 06:07:20

标签: testng

我在这里有一个条件,就像下面的类及其@Test方法一样:

class myClass{

    @Test
    public void test1(){..}

    @Test
    public void test2(){..}

    @Test
    public void test3(enabled=false){..}
}

当上面的@Tests(test1或test2)中的任何一个失败时,我想在这里执行@Test test3。

问题是测试结果,我的意思是结果(通过或失败)。不是他们返回的值。

2 个答案:

答案 0 :(得分:1)

您需要在此处使用dependsOnMethods。因此,当测试1和测试2都通过时,仅测试3将被执行。
您可以像这样使用它:

@Test(dependsOnMethods={"test1", "test2"})
public void test3{...}

如果您想在前两个失败时运行第三个测试用例,那么当您不希望运行测试用例时,可以将SkipException放在beforeMethod中。
您可以采用全局布尔值,然后根据测试用例的通过/失败条件进行设置。

boolean condition = true;

// Execute before each test is run
@BeforeMethod
public void before(Method methodName){
    // check condition, note once you condition is met the rest of the tests will be skipped as well
    if(condition){
        throw new SkipException();
    }
}

答案 1 :(得分:1)

可以通过布尔变量并抛出SkipException来完成,这将制止所有后续测试的执行:

class myClass{
    // skip variable
    boolean skipCondition;

    // Execute before each test is run
    @BeforeMethod
    public void before(Method methodName){
        // condition befor execute
        if(skipCondition)
            throw new SkipException();
    }

    @Test(priority = 1)
    public void test1(){..}

    @Test(priority = 2)
    public void test2(){..}

    @Test(priority = 3)
    public void test3(){..}
}

另一件事是实现IAnnotationTransformer,更加复杂。

public class ConditionalTransformer implements IAnnotationTransformer {
    // calls before EVERY test
    public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod){
        // add skip ckeck
        if (skipCkeck){
            annotation.setEnabled(false);
        }
    }
}