如果其他测试失败,我可以跳过Junit测试吗?

时间:2014-10-22 18:48:04

标签: java junit selenium-webdriver automated-tests

我正在使用 Junit 来使用 Seleniun WebDriver 运行测试。我正在尝试将我的测试分成功能区域,以便更好地报告错误。我已经创建了测试页面加载/移动文档到其他工作流程的测试。如果页面加载测试失败,或者工作流程移动失败,我想跳过后续页面/工作流程测试。

如果测试A失败,我如何跳过课程中的其余测试或在B类中运行测试?

注意: 我意识到我要问的是“ UNIT TESTS 的不良实践*。但是,我实际上是在使用Junit进行集成和/或自动化测试。(取决于您的定义。) 我已经找到了@Suite.SuiteClasses@FixMethodOrder来订购我的测试类和测试方法。我正在尝试命令它们以逻辑方式运行,测试页面加载,首先,然后将页面的每个功能作为单独的测试。一些功能,将信息移动到其他页面,意味着其他类。我的课程中有一个可能需要半个多小时才能完成。如果pre-req测试失败,我想简短地进行“Dependent”测试,以便更快地获得我的结果/报告。

3 个答案:

答案 0 :(得分:0)

我建议您切换到TestNG。检查this

顺便说一句:当我以前使用Java时 - 差不多一年前 - 我没有找到JUnit这样的解决方案。

答案 1 :(得分:0)

你可以尝试通过Rules接口来操作测试,他们在这里有一个例子: http://www.codeaffine.com/2013/11/18/a-junit-rule-to-conditionally-ignore-tests/

这可能是一个很好的起点。

答案 2 :(得分:0)

通过在@Before或@Test方法中使用Junit's Assume,可以使用

跳过当前测试
  1. Assume#assumeTrue(boolean)用于任何失败的依赖测试。您可以通过调用Assume.assumeTrue(false)
  2. 跳过当前测试
  3. Assume#assumeNoException(Throwable)用于可跳过的测试,并在跳过另一个测试时通过传递AssumptionVoilated异常来跳过当前测试。

这是一个例子:

public class Tests{
    @Test
    public void test1(){
        ...
    }

    @Test
    public void test2(){
        try{
            test1();
        }catch(AssertionError failExcep){
            //test1 failed, skip this test
            Assume.assumeTrue(false);
        }catch(AssumptionVoilationException skipExcep){
            //test1 was skipped, skip this test
            Assume.assumeNoException(skipExcep);
        }
        ...
    }
}

这个特定的示例将运行两次test1(),但是要添加@FixMethodOrder并捕获在test1期间抛出的任何错误,以在test2中进行引用;我们可以解决这个问题。

此外,此示例未涵盖test1()可能引发的任何其他异常类型,例如空指针异常。将AssumptionVoilationException catch子句编辑为Exception将允许在发生任何异常时跳过test2。如果您还想捕获Error或Throwable,只需添加一个catch子句并放入Assume.assumeTrue(false)即可,如AssertionError。或者,您可以只抛出AssumptionViolatedException

这是虚拟证明版本

@FixMethodOrder
public class Tests{

    private Optional<Throwable> testOneThrown;

    @Test
    public void test1(){
        try{
            ...
        }catch(Throwable t){
            // test1 throw something, catching it for test2() reference
            testOneThrown = Optional.of(t);
            /*
             * still throwing it for junit normal functions and
             * in case test2 ran independently
             */
            throw t;
        }
        //Ran successfully, making reference non-null but empty
        testOneThrown = Optional.empty();
    }

    @Test
    public void test2(){
        try{
            if(testOneThrown == null){
                // test1 did not run, thus needs to run
                test1();
            }else if(testOneThrown.isPresent()){
                // test1 ran and threw something
                throw testOneThrown.get();
            }
            //test1 ran and throw nothing
        }catch(Throwable thrown){
            /*
             * something was throw in test1, test1 could have
             * failed, could have been skipped, etc. thus skip 
             * this test.
             */
            throw new AssumptionViolatedException("Dependency on test1 failed.", thrown);
        }
        ...
    }
}