Unit testing 在多个接口实现上运行同一组参数化测试

Unit testing 在多个接口实现上运行同一组参数化测试,unit-testing,junit,junit5,Unit Testing,Junit,Junit5,我正在用Java实现算法系列,并希望在每个算法实现上运行相同的一组算法系列测试。让我们看看排序算法案例 我有一些排序算法的实现。我希望在每个实现上运行相同的参数化测试套件,而不复制/粘贴每个接口实现的测试 关于“如何在多个类实现上运行同一组测试”,我已经见过几次了,答案是使用参数化测试,将要测试的实现类列表作为输入。但是,这些示例使用类作为唯一的参数。我想在被测试的类上运行参数化测试 我遇到的参数化测试的在线示例使用简单的参数(单个对象/原语或对象/原语列表)。在我的例子中,我希望提供要测试的类

我正在用Java实现算法系列,并希望在每个算法实现上运行相同的一组算法系列测试。让我们看看排序算法案例

我有一些排序算法的实现。我希望在每个实现上运行相同的参数化测试套件,而不复制/粘贴每个接口实现的测试

关于“如何在多个类实现上运行同一组测试”,我已经见过几次了,答案是使用参数化测试,将要测试的实现类列表作为输入。但是,这些示例使用类作为唯一的参数。我想在被测试的类上运行参数化测试

我遇到的参数化测试的在线示例使用简单的参数(单个对象/原语或对象/原语列表)。在我的例子中,我希望提供要测试的类和一个值数组。我认为这是可能的,但感觉很难看,我必须对每个类类型重复相同的测试用例,就像这样(不是实际的java语法):

理想情况下,可以通过某种方式设置一次排序实现,让所有参数化测试只关心要排序的值列表,而不关心要使用哪个排序类

我的直觉是使用包含参数化测试的父抽象SorterTest,并使用工厂方法允许每个子类(例如:mergesortest)决定使用哪个sorter实现。然而,在谷歌上快速搜索这一点似乎意味着使用继承来重用测试代码中的测试用例是不受欢迎的

对于这种情况,推荐的方法是什么?在这样的情况下,测试代码中的继承是允许的,还是总有更好的选择

我也在使用JUnit5

在我的例子中,我希望提供要测试的类和一个值数组

您可以将多个源组合在一起,例如
@MethodSource
。假设您有一个通用的
分拣机
界面:

class-SorterTest{
@参数化测试
@方法源(“args”)
无效测试(分拣机、分拣机、列表){
// ...
}
提供预期结果的静态流(即通过参考实现的排序列表),您还可以组合三个流:
sorter()
unsorted()
sorted()
。此外,如果您想创建测试中的类,可以使用
Supplier
s:

静态流分拣机(){
返回Stream.of(BubbleSorter::new,MergeSorter::new,InsertionSorter::new);
}
在我的例子中,我希望提供要测试的类和一个值数组

您可以在一个
@MethodSource
中组合多个源。假设您有一个类似于通用
分类器的接口:

class-SorterTest{
@参数化测试
@方法源(“args”)
无效测试(分拣机、分拣机、列表){
// ...
}
提供预期结果的静态流(即通过参考实现的排序列表),您还可以组合三个流:
sorter()
unsorted()
sorted()
。此外,如果您想创建测试中的类,可以使用
Supplier
s:

静态流分拣机(){
返回Stream.of(BubbleSorter::new,MergeSorter::new,InsertionSorter::new);
}
也许有帮助?也许有帮助?
BubbleSorter.class, [1,2,3]
BubbleSorter.class, [3,2,1]
BubbleSorter.class, [-1,2,0]
MergeSorter.class, [1,2,3]
MergeSorter.class, [3,2,1]
MergeSorter.class, [-1,2,0]
InsertionSorter.class, [1,2,3]
...