java - 参数化测试: selectively run for only one data point

标签 java junit junit4

我有一个参数化测试,例如使用文件提供的测试:

@RunWith(Parameterized.class)
public class FileTest {
...
public static Collection<Object[]> data() {
     return IteratorUtils.toList( FileUtils.iterateFiles(testFilesDir
                                                        , TrueFileFilter.INSTANCE
                                                        , (IOFileFilter) null) );
 }

无论是文件系统上的文件、表中的行还是 URL,实际上都没有区别。只是一个参数化测试,需要输入大量数据点并需要很长时间才能得出结论。

现在我正在运行测试,假设有 10,000 个文件,我检测到文件 #9,203 存在问题。我修复了这个错误并 验证修复 我想重新运行测试,但仅限于这个特定文件(因为我不能等 2 小时)。随后的重新运行(在验证修复后)当然应该包含整个数据集。

有什么办法可以做到这一点,例如通过在 JUnit 的控制台调用中提供一些运行时参数以便仅使用一个特定的数据点?

最佳答案

好吧,最后我找到了一种方法来完成这个任务。为参数化测试类使用构造函数,该构造函数还采用可以轻松从命令行传递的友好名称。例如。像这样:

private final File   testFile;
private final String friendlyTestName;

public FileTest(File testFile, String friendlyTestName) {
    this.testFile = testFile;
    this.friendlyTestName = friendlyTestName;
}

当然,您必须在提供数据点的方法中生成适当的元组。例如。在下面的示例中,友好名称只是测试文件的文件名(不带路径;我们假设它们是唯一的):

@Parameters(name= "{index}: {1}")
public static Collection<Object[]> data() {
    Collection<File> _rv = IteratorUtils.toList( FileUtils.iterateFiles(testFilesDir, TrueFileFilter.INSTANCE, (IOFileFilter) null) );
    Collection<Object[]> rv = new ArrayList<>();
    for (File f : _rv)
        rv.add(new Object[]{f, f.getName()});
    return rv;
}

然后,当从命令行调用 Ant 时,传递一个 target-friend-name 参数:

ant -Dtarget-friendly-name=a-005 test

...并确保它一直传送到 junit Ant 任务。例如。在您的 build.xml 文件中,您应该有类似以下内容:

<junit printsummary="${junit.summary}" showoutput="${junit.output}">
    <sysproperty key="target-friendly-name" value="${target-friendly-name}"/>
    ...
</junit>            

最后,在测试方法本身中使用 assumeTrue 要求数据点的友好名称等于目标友好名称(如果存在;否则运行所有测试)。

@Test
public void testFile() {
    assumeTrue( (targetFriendlyName==null)||(targetFriendlyName.equals(friendlyTestName)) );
    ...
}

我正在寻找一种直接使用 Parameters{index} 属性的方法。注释,这将消除定义单独的 FriendlyName 的需要,但还没有找到一种方法来做到这一点;因此,此解决方案需要在测试类中不自然地添加友好名称字段。

关于java - 参数化测试: selectively run for only one data point,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27332524/

相关文章:

java - 当 JUnit 4 使用参数化运行程序超时时添加更多信息

java - JOOQ 元模型 : why is there no Table. 重命名(字符串)?

java - GXT 3 多排序网格

java - quartz.properties无法访问mysql : Could not load driverClass com. mysql.jdbc.Driver

java - 如何为 Resttemplate postForObject 方法编写 mockito junit

java - Autowiring 在 junit spring mvc 5 中不起作用

java - PowerMockRunner 不应用 JUnit ClassRules

java - 在 IntelliJ IDEA 中运行单个 Junit 测试

java - RxJava file.createNewFile() 总是返回 TRUE

java - 如何在Java中提取多个引用的子字符串