利用JUnit4进行单元测试
单元测试是测试里面非常重要的一块,而且单元测试通常都是由编程人员自行测试的,因此,不是说只有从事测试的人员才需要学习单元测试,而是每个人都要学。试想一下,如果读者编了一个复杂的程序,里面包含了很多方法,但是,却不想对每个类都编写一个main函数去测试,而且有时也无法修改main去测试(如果main之前就已经有复杂的实现,并且可能还跟环境有关时)。利用JUnit单元测试,就可以很好地解决我们一切头疼事,加快开发效率。因此,小编今天上网学习了下,把心得分享给大家~
待测试代码
下面给出我们的待测试代码,里面包含了多个待测试的方法。其实就是个计算器的简易类(是参考网上的)。
package mJUnitStu;
public class Calculator {
private static int result;
public void add(int n)
{
result=result+n;
}
public void substract(int n)
{
result=n; //Bug:正确的应该是result=result-n;
}
public void multiply(int n)
{
result *= n;
}
public void divide(int n)
{
result=result/n;
}
public void square(int n)
{
result=n*n;
}
public void squareRoot(int n)
{
for(;;); //Bug:Dead Loop
}
public void clear()
{
result=0;
}
public int getResult()
{
return result;
}
}
引入JUnit4包
在Eclipse里,在package explorer中,我们右键点击我们的项目,然后选中properties,在Java Build Path选项卡,选择Libraries, 然后点击Add Library,找到JUnit,选择Finish就可以啦。
添加JUnit Test Case
在引入JUnit4包后,在主界面中选择file->new->JUnit Test Case。
这里选中setUp() 和 tearDown()两项,这两项将会为测试用例添加两个方法,并且setUp()会在每个测试方法执行的之前执行一遍,同理tearDown()会在每个测试方法执行之后执行一遍。然后我们可以得到如下的测试用例。
package mJUnitStu;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
public class CalculatorTest {
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void test() {
fail("Not yet implemented");
}
}
这时,我们按F11执行单元测试时,就会报错
原因很显然就是我们的fail语句造成的。
开始单元测试
初始化测试实例以及setUp、tearDown方法
我们把测试类内部的内容改成如下
private static Calculator calculator= new Calculator();
@Before
public void setUp() throws Exception {
calculator.clear();
}
@After
public void tearDown() throws Exception {
}
@Test
public void test() {
System.out.println("The first test");
}
然后执行单元测试,发现这次测试就通过了。这里我们新建了一个测试的实例calcalator,并且给setUp编写了初始化的内容,那么这之后,在每个标记有@Test的方法调用前,都会先调用setUp,之后会调用tearDown,由于我们这里不需要进行什么后续的操作,因此tearDown可以留空。
自定义第一个测试方法
第一步很顺利,这说明了JUnit成功的运行了,接下来我们来一些更复杂的测试,在测试程序中,添加如下方法,注意,这些方法的命名并没有特别要求,但是一定要注意的是,必须有@Test,返回值必须为空,方法不接受任何传入参数。
@Test
public void testClear() {
calculator.clear();
assertEquals(calculator.getResult(), 0);
}
测试结果如下
利用assertEquals做异常处理
添加
@Test
public void testSubstract() {
calculator.add(10);
calculator.substract(2);
assertEquals(8,calculator.getResult());
}
测试结果如下
出错了,为什么呢,观察到我们的subtract方法,发现方法写错了,改成如下
public void substract(int n)
{
result=result-n;
}
再次调用测试发现就通过测试了
当然,处理assertEquals以外还有很多其他的assert方法,这里小编不一一举出,需要的读者可以自行谷歌~
跳过某些测试方法
在编写程序前,我们可能会实现写好测试用例,然后我们边实现边测试,但是有些还没实现的方法就会到时测试方法报错,这时,我们只要在测试方法上方加个@Ignore就可以了,比如说我们的mutiply方法还未实现,我们就可以用
@Ignore("Multiply() Not yet implemented")
@Test
public void testMultiply() {
}
跳过该测试方法
设置timeout检查死循环
我们的squareRoot方法出现了个死循环,此时添加测试方法如下
@Test(timeout=1000)
public void testSquareRoot()
{
calculator.squareRoot(4);
}
就可以限定该方法的执行时间,如果超时,就会报错
除了timeout参数以外,还有其他的参数,感兴趣的读者可以自行谷歌~
后记
JUnit4的单元测试就介绍到这里,相信读者应该有个直观的认识了,利用单元测试可以给我们的开发带来便捷以及安全保障,所以希望各位读者在之后的开发中,也能主动的把JUnit用起来:)