单元测试工具(连载2)
- 2019 年 12 月 12 日
- 筆記
1.2 JUnt4测试用例的运行和调试
写好产品代码和测试代码后,就可以运行测试程序了。只要在Eclipse的CalculatorTest类上单击鼠标右键,在弹出的菜单上选择“Run As a JUnit Test”运行测试用例,测试结果就显示出来了,如图4所示。
显然,减法没通过是由于代码中存在问题,而乘法没通过是由于乘法没有实现。首先来修改减法的函数实现:
publicvoid substract(int m,int n) {
result =n-m; //Bug: 正确的应该是result =m-n
}
再进行一次运行,结果如图5所示。

图4 JUnit单元测试结果(一) 图5 JUnit单元测试结果(二)
最后完成乘法的产品代码与测试代码。产品代码如下:
publicvoid multiply int m,int n) {
result=m*n
}
测试代码如下:
publicvoid testMultiply() {
calculator.multiply(8,2);
assertEquals(16,calculator.getResult());
}
图6为最后的测试结果。最终产品代码如下:
packageandycpp;
publicclass Calculator {
private static int result; // 静态变量,用于存储运行结果
public void add(int m,int n) {
result = m + n;
}
public void substract(int m,int n) {
result = m-n;
}
public void multiply int m,int n) {
result = m*n;
}
public void divide(int m,int n) {
result = m / n;
}
public void square(int n) {
result = n * n;
}
public void squareRoot(int n) {
for (; 😉 ; //Bug : 死循环,为了后面介绍
}
public void clear() { // 将结果清零
result = 0;
}
public int getResult() {
return result;
}
}

图6 JUnit单元测试结果(三)
而最终的测试代码如下:
packagecom.jerry;
importstatic org.junit.Assert.*;
importorg.junit.Before;
importorg.junit.Test;
importorg.junit.Ignore;
publicclass CalculatorTest {
privatestatic Calculator calculator = new Calculator();
@Before
publicvoid setUp() throws Exception {
calculator.clear();
}
@Test
publicvoid testAdd() {
calculator.add(2,3);
assertEquals(5,calculator.getResult());
}
@Test
publicvoid testSubstract() {
calculator.substract(10,2);
assertEquals(8,calculator.getResult());
}
@Test
publicvoid testMultiply() {
calculator.multiply (8,2);
assertEquals(16,calculator.getResult());
}@Test
publicvoid testDivide() {
calculator.divide(8,2);
assertEquals(4,calculator.getResult());
}
}
1.3 对基本代码的详细介绍
一个单元测试代码主要分为以下几个部分。
(1)设置环境。
(2)运行测试。
(3)结果判断。
(4)清理环境。
这里,设置环境和清理环境是有区别的。
设置环境:比如,建立数据库连接。
清理环境:比如,断开数据库连接。
1.包含必要的Package
importstatic org.junit.Assert.*;
assertEquals是Assert类中的一系列的静态方法,一般的使用方式是Assert. assertEquals(),但是使用了静态包后,前面的类名就可以省略了,使用起来更加方便。比如:
assertEquals(8,calculator.getResult());
显而易见,assertEquals函数的主要功能是实现“结果判断”。
2.测试类的声明
测试类是一个独立的类,没有任何父类。测试类的名字也可以任意命名,没有任何局限性。所以,不能通过类的声明来判断它是不是一个测试类。测试类与普通类的区别在于它内部方法的声明。
3.创建一个待测试的对象
要测试哪个类,要创建一个该类的对象。比如第1.1节和第1.2节中,为了测试Calculator类,必须创建一个Calculator对象。
privatestatic Calculator calculator = new Calculator();
4.测试方法的声明
在测试类中,并不是每个方法都用于测试,必须使用“标注”来明确表明哪些是测试方法。“标注”也是JDK5的一个新特性,用在此处非常恰当。可以看到,某些方法的前面有@Before、@Test、@Ignore、@After等字样,这些就是标注,以一个“@”作为开头。第1.3节开始的描述的@Before、@Test、@After对应于。
(1)标记@Before:设置环境。
(2)标记@Test:运行测试。
(3)标记@After:清理环境。
这个方法的前面使用@Test标注,表明这是一个测试方法。对方法的声明,也有如下要求:名字可以随便取,没有任何限制,但是返回的值必须为void,而且不能有任何参数。如果违反这些规定,会在运行时抛出一个异常。
@Test
publicvoid testSubstract() {
calculator.substract(10,2);
assertEquals(8,calculator.getResult());
}
在测试方法中调用substract函数,将10减去2,期待的结果应该是8。如果最终的实际结果也是8,则说明substract函数是正确的,反之说明它是错的。
assertEquals(8,calculator.getResult()):用来判断期待结果和实际结果是否相等,第一个参数填写期待结果,第二个参数填写实际结果,也就是通过计算得到的结果。这样写好后,JUnit会自动进行测试,并把测试结果反馈给用户。
星云测试
http://www.teststars.cc
奇林软件
http://www.kylinpet.com
联合通测
http://www.quicktesting.net