利用JUnit4进行单元测试

时间:2021-04-19 00:34:21

利用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就可以啦。
利用JUnit4进行单元测试

添加JUnit Test Case

在引入JUnit4包后,在主界面中选择file->new->JUnit Test Case。
利用JUnit4进行单元测试
这里选中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执行单元测试时,就会报错
利用JUnit4进行单元测试
原因很显然就是我们的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可以留空。
利用JUnit4进行单元测试

自定义第一个测试方法

第一步很顺利,这说明了JUnit成功的运行了,接下来我们来一些更复杂的测试,在测试程序中,添加如下方法,注意,这些方法的命名并没有特别要求,但是一定要注意的是,必须有@Test,返回值必须为空,方法不接受任何传入参数。

    @Test
public void testClear() {
calculator.clear();
assertEquals(calculator.getResult(), 0);
}

测试结果如下
利用JUnit4进行单元测试

利用assertEquals做异常处理

添加


@Test
public void testSubstract() {
calculator.add(10);
calculator.substract(2);
assertEquals(8,calculator.getResult());
}

测试结果如下
利用JUnit4进行单元测试
出错了,为什么呢,观察到我们的subtract方法,发现方法写错了,改成如下

    public void substract(int n)
{
result=result-n;
}

再次调用测试发现就通过测试了
利用JUnit4进行单元测试
当然,处理assertEquals以外还有很多其他的assert方法,这里小编不一一举出,需要的读者可以自行谷歌~

跳过某些测试方法

在编写程序前,我们可能会实现写好测试用例,然后我们边实现边测试,但是有些还没实现的方法就会到时测试方法报错,这时,我们只要在测试方法上方加个@Ignore就可以了,比如说我们的mutiply方法还未实现,我们就可以用

    @Ignore("Multiply() Not yet implemented")  
@Test
public void testMultiply() {

}

跳过该测试方法
利用JUnit4进行单元测试

设置timeout检查死循环

我们的squareRoot方法出现了个死循环,此时添加测试方法如下

    @Test(timeout=1000)
public void testSquareRoot()
{
calculator.squareRoot(4);
}

就可以限定该方法的执行时间,如果超时,就会报错
利用JUnit4进行单元测试
除了timeout参数以外,还有其他的参数,感兴趣的读者可以自行谷歌~

后记

JUnit4的单元测试就介绍到这里,相信读者应该有个直观的认识了,利用单元测试可以给我们的开发带来便捷以及安全保障,所以希望各位读者在之后的开发中,也能主动的把JUnit用起来:)