我有一个参数化
测试,例如使用文件提供的测试:
@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/