单元测试工具(连载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