具有动态测试数的 JUnit 测试

在我们的项目中,我有几个JUnit测试,例如,从目录中获取每个文件并对其运行测试。如果我在中实现一个方法,则仅显示为一个可能失败或成功的测试。但我对每个文件的结果感兴趣。我如何编写一个/,以便每个文件都显示为单独的测试,例如在Eclipse的图形TestRunner中?(为每个文件编写显式测试方法不是一个选项。testEveryFileInDirectoryTestCaseTestCaseTestSuite

还要将问题 ParameterizedTest 与 Eclipse Testrunner 中的名称进行比较。


答案 1

看看 JUnit 4 中的参数化测试

实际上,我几天前就这样做了。我会试着解释...

首先正常构建测试类,因为您只使用一个输入文件进行测试。用以下方式装饰你的班级:

@RunWith(Parameterized.class)

构建一个构造函数,该构造函数接受将在每次测试调用中更改的输入(在本例中,它可能是文件本身)

然后,生成一个将返回数组的静态方法。集合中的每个数组将包含类构造函数(例如文件)的输入参数。用以下内容修饰此方法:Collection

@Parameters

下面是一个示例类。

@RunWith(Parameterized.class)
public class ParameterizedTest {

    private File file;

    public ParameterizedTest(File file) {
        this.file = file;
    }

    @Test
    public void test1() throws Exception {  }

    @Test
    public void test2() throws Exception {  }

    @Parameters
    public static Collection<Object[]> data() {
        // load the files as you want
        Object[] fileArg1 = new Object[] { new File("path1") };
        Object[] fileArg2 = new Object[] { new File("path2") };

        Collection<Object[]> data = new ArrayList<Object[]>();
        data.add(fileArg1);
        data.add(fileArg2);
        return data;
    }
}

请查看此示例


答案 2

JUnit 3

public class XTest extends TestCase {

    public File file;

    public XTest(File file) {
        super(file.toString());
        this.file = file;
    }

    public void testX() {
        fail("Failed: " + file);
    }

}

public class XTestSuite extends TestSuite {

    public static Test suite() {
        TestSuite suite = new TestSuite("XTestSuite");
        File[] files = new File(".").listFiles();
        for (File file : files) {
            suite.addTest(new XTest(file));
        }
        return suite;
    }

}

JUnit 4

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class TestY {

    @Parameters
    public static Collection<Object[]> getFiles() {
        Collection<Object[]> params = new ArrayList<Object[]>();
        for (File f : new File(".").listFiles()) {
            Object[] arr = new Object[] { f };
            params.add(arr);
        }
        return params;
    }

    private File file;

    public TestY(File file) {
        this.file = file;
    }

    @Test
    public void testY() {
        fail(file.toString());
    }

}

推荐