混合参数化和程序化单元测试

blend parameterized and programmatic unit tests

使用 JUnit,您可以使用 @RunWith(Parameterized.class) 提供一组参数以传递给测试构造函数,然后 运行 对每个对象进行测试。

我试图将尽可能多的测试逻辑移动到数据中,但有些测试不容易转换为数据驱动测试。有没有办法使用 JUnit 的 Parameterized 运行ner 来 运行 一些带参数的测试,然后还添加非数据驱动的测试,这些测试不是 运行 重复的每个测试对象构建?

我的解决方法是创建一个 class 并将程序化和数据驱动测试放在两个单独的子 class 中。子 class 必须是静态的,JUnit 才能 运行 它的测试。这是骨架:

@RunWith(Enclosed.class) // needed for working well with Ant
public class MyClassTests {
    public static class Programmatic {
        @Test
        public void myTest(){
            // test something here
        }
    }

    @RunWith(Parameterized.class)
    public static class DataDriven {
        @Parameters
        public static Collection<Object[]> getParams() {
            return Collections.emptyList();
        }

        private String data;
        public DataDriven(String testName, String data){
            this.data = data;
        }
        @Test
        public void test() throws AnalyzeExceptionEN{
            // test data string here
        }
    }
}

一种方法是使用 Junit 的 Enclosed 运行程序。它非常冗长但也非常强大。它允许您在一个文件中组合多个不同的跑步者。

其他选项是使用自定义 junit 运行程序。当然 zohhak 支持 tests with parameters and without。小摘录:

@RunWith(ZohhakRunner.class)
public class CoercingTest {

    @TestWith("ONE_OF_ENUM_VALUES")
    public void should_coerce_enum(SampleEnum param) {
        assertThat(param).isEqualTo(SampleEnum.ONE_OF_ENUM_VALUES);     
    }

    @Test
    public void should_run_standard_junit_test() {
        //this will also work
    }
}

如果这对您来说还不够,您肯定可以找到其他支持这两种测试的跑步者。