一天一个关于测试知识点,5分钟内讲解你最关心的软件测试问题,今天就来谈谈关于软件测试中的“JAVA单元测试框架JUnit 4 ”。
“JUnit是一个Java语言的单元测试框架,由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit和xUnit家族中最成功的一个。JUnit有自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试工具。
JUnit是由Erich Gamma和Kent Beck编写的一个回归测试框架(Regression Testing Framework)。JUnit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。JUnit是一套框架,继承TestCase类,就可以用JUnit进行自动测试了。”
而JUnit 4是JUnit框架有史以来的最大改进,其主要目标是利用Java 5的Annotation特性简化测试用例的编写。
一、JUnit 4环境的配置
使用JUnit 4时不要使用转为Android提供开发的ADT配置的Eclipse,这个Eclipse在JUnit 4中存在一些问题。可以到Eclipse的官方网站(http://www.eclipse.org/)上下载J2SE版本。笔者目前使用的版本如图2-1所示。
图2-1 Eclipse
进行单元测试,首先需要有被测程序,这里以一个简易的计算器作为例子。
案例2-1:JAVA实现的简易的计算器测试。
这个计算器中主要包括加、减、乘、除、求平方以及开根号6个函数,其代码如下。
这里暂时先不写乘法函数的实现,并且故意写错减法函数的实现。
接下来建立JUnit 4测试程序。首先将JUnit 4单元测试包引入这个Project中,方法如下。
在被测程序的Class上单击鼠标右键,在弹出的菜单上选择【Properties】,然后在弹出的属性窗口中,首先在左边选择【Java Build Path】,然后到右上选择【Libraries】标签,之后在最右边点击【Add Library…】按钮,加入JUnit4,如图2-2所示。
图2-2 Java Build Patch
在Eclipse的被测程序上右键单击该弹出菜单,选择“New->JUnit Test Case”,在弹出的对话框中进行相应的选择,如图2-3所示。
图2-3 New JUnit Test Case
单击【Next>】按钮后,系统自动列出这个类中包含的方法,选择要进行测试的方法。此例中,仅对“加、减、乘、除”4个方法进行测试。之后系统会自动生成一个新类CalculatorTest,里面包含一些空的测试用例。只需对这些测试用例稍作修改,即可使用。
package com.jerry;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.junit.Ignore;
public class CalculatorTest {
private static Calculator calculator = new Calculator();
@Before
public void setUp() throws Exception {
calculator.clear();
}
@Test
public void testAdd() {
calculator.add(2,3);
assertEquals(5,calculator.getResult());
}
@Test
public void testSubstract() {
calculator.substract(10,2);
assertEquals(8,calculator.getResult());
}
@Test
public void testMultiply() {
fail("Not yet implemented");
}
@Test
public void testDivide() {
calculator.divide(8,2);
assertEquals(4,calculator.getResult());
}
}
这里暂时先不写乘法函数的测试代码。
二、JUnt4测试用例的运行和调试
写好产品代码和测试代码后,就可以运行测试程序了。只要在Eclipse的CalculatorTest类上单击鼠标右键,在弹出的菜单上选择“Run As a JUnit Test”运行测试用例,测试结果就显示出来了,如图2-4所示。
显然,减法没通过是由于代码中存在问题,而乘法没通过是由于乘法没有实现。首先来修改减法的函数实现。
public void substract(int m,int n) {
result =n-m; //Bug: 正确的应该是result =m-n
}
再进行一次运行,结果如图2-5所示。
图2-4 JUnit单元测试结果(一)
图2-5 JUnit单元测试结果(二)
最后完成乘法的产品代码与测试代码。产品代码如下。
public void multiply int m,int n) {
result=m*n
}
测试代码如下。
public void testMultiply() {
calculator.multiply (8,2);
assertEquals(16,calculator.getResult());
}
图2-6为最后的测试结果。最终产品代码如下。
package andycpp;
public class 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;
}
}
图2-6 JUnit单元测试结果(三)
而最终的测试代码如下。
package com.jerry;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.junit.Ignore;
public class CalculatorTest {
private static Calculator calculator = new Calculator();
@Before
public void setUp() throws Exception {
calculator.clear();
}
@Test
public void testAdd() {
calculator.add(2,3);
assertEquals(5,calculator.getResult());
}
@Test
public void testSubstract() {
calculator.substract(10,2);
assertEquals(8,calculator.getResult());
}
@Test
public void testMultiply() {
calculator.multiply (8,2);
assertEquals(16,calculator.getResult());
}@Test
public void testDivide() {
calculator.divide(8,2);
assertEquals(4,calculator.getResult());
}
}