清单 英镑 Pound 乘法的两个测试用例
@Test
public void multiplyPoundsByInteger () {
assertEquals( new Pound()times()getAmount() );
assertEquals( new Pound()times()getAmount() );
}
但是此时您可能又会发现这两个测试用例还是很有限您所希望的是测试所有的整数而不只是 和 这些只是您所想要的测试的数据的子集两个测试用例并不能完全与您所想要测试的代码的行为相等价您需要更多的测试用例此时就会发现需要很多的额外工作来编写这些测试用例更可怕的是您会发现您需要测试用例的并不只是简单的几个可能是成千上万个甚至无穷个测试用例才能满足等价您的代码行为的目的
很自然的您会想到用清单 所示的代码来表达您的测试思想
清单 使用变量辅助编写测试用例
//利用变量来代替具体数据表达测试思想
public void multiplyAnyAmountByInteger(int amount int multiplier) {
assertEquals( amount * multiplier
new Pound( amount )times( multiplier )getAmount() );
}
利用清单 的 multiplyAnyAmountByInteger 方法可以轻松将测试用例改写成如清单 所示
清单 改写的英镑 Pound 乘法的测试用例
@Test
public void multiplyPoundsByInteger () {
multiplyAnyAmountByInteger( );
multiplyAnyAmountByInteger( );
}
如清单 所示以后若想增加测试用例只要不停调用 multiplyAnyAmountByInteger 方法并赋予参数值即可
方法 multiplyAnyAmountByInteger 就是一个理论的简单例子理论就是一个带有参数的方法其行为就是对任何参数都是正常的返回不会抛出断言错误和其它异常理论就是对一组数据进行概括性的陈述就像一个科学理论一样如果没有对所有可能出现的情况都进行实验是不能证明该理论是正确的但是只要有一种错误情况出现该理论就不成立相反地一个测试就是对一个单独数据的单独陈述就像是一个科学理论的实验一样
如何使用理论机制
在 JUnit 的理论机制中每个测试方法不再是由注释 @Test 指定的无参测试函数而是由注释 @Theory 指定的带参数的测试函数这些参数来自一个数据集(data sets)数据集通过注释 @DataPoint 指定
JUnit 会自动将数据集中定义的数据类型和理论测试方法定义的参数类型进行比较如果类型相同会将数据集中的数据通过参数一一传入到测试方法中数据集中的每一个数据都会被传入到每个相同类型的参数中这时有人会问了如果参数有多个而且类型都和数据集中定义的数据相同怎么办?答案是JUnit 会将这些数据集中的数据进行一一配对组合(所有的组合情况都会被考虑到)然后将这些数据组合统统通过参数一一传入到理论的测试方法中但是用户可以通过假设机制(assumption)在断言函数(assertion)执行这些参数之前对这些通过参数传进来的数据集中的数据进行限制和过滤达到有目的地部分地将自己想要的参数传给断言函数(assertion)来测试只有满足所有假设的数据才会执行接下来的测试用例任何一个假设不满足的数据都会自动跳过该理论测试函数(假设 assumption 不满足的数据会被忽略不再执行接下来的断言测试)如果所有的假设都满足测试用例断言函数不通过才代表着该理论测试不通过
[] [] [] [] [] [] [] []