参数化测试 junit
参数化的单元测试用于在不同条件下测试相同的代码。 借助参数化的单元测试,我们可以建立一种测试方法,该方法从某个数据源中检索数据。 该数据源可以是测试数据对象,外部文件甚至数据库的集合。 一般的想法是使使用相同的单元测试方法测试不同的条件变得容易,这将限制我们需要编写的源代码并使测试代码更健壮。 我们可以将这些测试称为数据驱动的单元测试。
在JUnit中实现数据驱动的单元测试的最佳方法是使用JUnit的自定义运行程序- Parameterized
或JUnitParams的 JUnitParamsRunner
。 使用JUnit的方法可能在许多情况下都可以使用,但后者似乎更易于使用且功能更强大。
基本例子
在我们的例子中,一个扑克骰子,我们需要计算满屋的分数。 就像纸牌扑克一样,“满座”是一副掷骰子,您同时拥有3个和一对。 为了简单起见,分数是一卷中所有骰子的总和。 因此,让我们看一下代码:
class FullHouse implements Scoreable {
@Override
public Score getScore(Collection dice) {
Score pairScore = Scorables.pair().getScore(dice);
Score threeOfAKindScore = Scorables.threeOfAKind().getScore(pairScore.getReminder());
if (bothAreGreaterThanZero(pairScore.getValue(), threeOfAKindScore.getValue())) {
return new Score(pairScore.getValue() + threeOfAKindScore.getValue()); // no reminder
}
return new Score(0, dice);
}
private boolean bothAreGreaterThanZero(int value1, int value2) {
return value1 > 0 && value2 > 0;
}
}
我想确保该掷骰正确得分(当然我已经对Pair和ThreeOfAKind进行了单元测试)。 因此,我想测试以下条件:
- 分数是11:1、1、3、3、3
- 2、2、2、1、1的得分是8
- 分数是0代表:2、3、4、1、1
- 分数是25,表示:5、5、5、5、5
让我们研究为该方法编写数据驱动的测试的两种可能方法。 首先, JUnit的参数化 :
@RunWith