Can I Skip Junit Tests if other tests fail?

我的梦境 提交于 2019-12-20 04:26:06

问题


I'm using Junit to run tests with Seleniun WebDriver. I'm trying to split up my tests into function area for better error reporting. I've created tests to test Page load/moving documents to other workflows. If a page load test fails, or a workflow move fails I want to skip the subsequent page/workflow tests.

if a Test A fails how can I skip either the rest of the tests in the class or running tests in Class B?

NOTE: I realize what I'm asking is "bad Practice* for UNIT TESTS. However, I'm actually using Junit for Integration and/or Automation Testing. (Depending on your definition.) I've already found @Suite.SuiteClasses, and @FixMethodOrder to order my test classes and test methods. I'm trying to order them to run logically, testing the page load, first, then each feature of the page as a seperate test. Some of the features, move the information to other pages, meanining other classes. 1 of my classes can take over 1/2 hour to finish. If the pre-req tests fail, I'd like to short circuite the "Dependent" tests, in order to get my results/report sooner.


回答1:


I suggest you switching to TestNG. Check this out.

Btw:When I used to work with Java - almost one year ago - I didn't find such a solution for JUnit.




回答2:


You could try manipulating the tests via the Rules interface, they have an example here: http://www.codeaffine.com/2013/11/18/a-junit-rule-to-conditionally-ignore-tests/

That might be a good starting point.




回答3:


By using Junit's Assumewithin the @Before or @Test methods, you can skip the current test by using either

  1. Assume#assumeTrue(boolean) for any depended tests that failed. You can skip the current test by calling Assume.assumeTrue(false)
  2. Assume#assumeNoException(Throwable) for skippable tests and skip the current test by passing the AssumptionVoilated exception when the other test was skipped.

Here's an example:

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);
        }
        ...
    }
}

This particular example would run test1() twice, but by adding @FixMethodOrder and catching the any error thrown during test1 to be referenced in test2; we could circumvent that issue.

Also this example does not cover any other exception type that test1() could throw, e.g. NullPointerException. Editing the AssumptionVoilationException catch clause to Exception will allow test2 to be skipped on any exception. If you also want to catch Error or Throwable just add a catch clause and put in Assume.assumeTrue(false) like AssertionError. Or you could just throw AssumptionViolatedException

Here's the dummy proof version

@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);
        }
        ...
    }
}


来源:https://stackoverflow.com/questions/26514862/can-i-skip-junit-tests-if-other-tests-fail

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!