How can I make my JUnit tests run in random order?

后端 未结 5 2152
我在风中等你
我在风中等你 2020-12-06 04:16

I have the classical structure for tests, I have a test suite of different suites like DatabaseTests, UnitTests etc. Sometimes those suites contains other suites like SlowDa

相关标签:
5条回答
  • 2020-12-06 04:46

    You do have a Sortable but I can't see how you would use it.

    You could extend BlockJUnit4ClassRunner and have computeTestMethods() return a randomized copy of super.computeTestMethods(). Then use the @RunWith to set that as the runner to use.

    e.g.

    package com.stackoverflow.mlk;
    
    import java.util.Collections;
    
    import org.junit.runners.BlockJUnit4ClassRunner;
    import org.junit.runners.model.InitializationError;
    
    public class RandomBlockJUnit4ClassRunner extends BlockJUnit4ClassRunner {
    
        public RandomBlockJUnit4ClassRunner(Class<?> klass)
                throws InitializationError {
            super(klass);
        }
    
        protected java.util.List<org.junit.runners.model.FrameworkMethod> computeTestMethods() {
            java.util.List<org.junit.runners.model.FrameworkMethod> methods = super.computeTestMethods();
            Collections.shuffle(methods);
            return methods;
        }
    
    }
    

    Then

    @RunWith(com.stackoverflow.mlk.RandomBlockJUnit4ClassRunner.class)
    public class RandomOrder {
        @Test
        public void one() {
        }
    
        @Test
        public void two() {
        }
    
        @Test
        public void three() {
        }
    }
    
    0 讨论(0)
  • 2020-12-06 04:47

    https://github.com/KentBeck/junit/pull/386 introduces some orders but not RANDOM. Probably you do not really want this; tests should run deterministically. If you need to verify that different permutations of tests still pass, either test all permutations; or, if this would be impractically slow, introduce a “random” seed for shuffling that is determined by an environment variable or the like, so that you can reproduce any failures. http://hg.netbeans.org/main/file/66d9fb12e98f/nbjunit/src/org/netbeans/junit/MethodOrder.java gives an example of doing this for JUnit 3.

    0 讨论(0)
  • 2020-12-06 04:48

    In general what you need to do is to write your own test runner and in the test runner class aggregate the methods and randomly run each test (make sure you don't run a test twice).

    Read more about the test framework and how to write your own test runner here: http://www.ddj.com/architect/184415674

    0 讨论(0)
  • 2020-12-06 05:04

    This issue is open on JUnit GitHub since 2 years, and point out 2 independent issues:
    - Tests depending on the execution order;
    - Non repeatable tests.

    Consider adressing the issue at the root, rather than trying to use the framework to do the job afterwards. Use setUp and tearDown method to guarantee isolation, and test at the smallest level.

    0 讨论(0)
  • 2020-12-06 05:09

    I will make sure they are not dependent to each other

    You should make sure that this is the case without relying on random execution order. What makes you fear that dependencies may exist?

    0 讨论(0)
提交回复
热议问题