嘴对嘴告诉你怎么用Junit进行测试之Junit3.8使用教程


目前的互联网公司,尤其是小型的互联网公司,对测试极其不重视,而如今快餐式的学习,往往也使开发者们忽略掉测试这一点。很多人都认为测试不重要,浪费时间,也有更多的人虽然知道测试的重要性,因却为懒而不去写测试。这些都是错误的认识,一个项目,我们可能花了20%的时间去写业务代码,就可能会花80%的时间去写测试代码去进行测试,但是如果不去测试的话,往往我们在后期在修改bug的时间不止这80%的时间,而且随着项目需求的增多,业务逻辑会越来越复杂,可能导致修改一个bug得花费更长的时间,并且可能牵一发而动全身(当然一个资深的程序员可能没有头发),一个bug未落一个bug又起,最终与明月为伴。


嘴对嘴告诉你怎么用Junit进行测试之Junit3.8使用教程_第1张图片

闲言少叙,我们今天使用的是Junit的3.8,可能有人会说了:“现在都Junit5了啊兄dei!”,“谁还用Junit3.8,太low了吧!”,“垃圾文章,白看了!”,“PHP是世界上最好的编程语言!”等等。我们首先介绍Junit3.8主要是为了为后面学习Junit4.x, Junit5.x, 以及后面在分析Junit源码的文章中做铺垫, Junit使用了大量的设计模式, 如果像学习设计模式的话, 分析Junit的源码无疑是一个不错的选择。

我使用的IDE是IntelliJ IDEA.

  1. 首先我们创建一个普通的maven项目 (当然我们也可以创建一个gradle项目, 也可以直接下载junit的jar包进行导入, 后面这两种方式我就不在此介绍), 然后在pom.xml文件中加入Junit3.8的包:
        
            junit
            junit
            3.8.2
        
  1. 创建一个package, 比如 com.test.junit, 然后下package下创建一个类 Calculator.java 用于计算加减乘除:
package com.test.junit;

public class Calculator {

    public int add(int a, int b) {
        return a + b;
    }

    public int minus(int a, int b) {
        return a - b;
    }

    public int multiply(int a, int b) {
        return a * b;
    }

    public int divide(int a, int b) throws Exception {
        if (0 == b) {
            throw new Exception("除数不能为0!");
        }
        return a / b;
    }

}
  1. 下面我们开始编写测试用例, test/java 下创建包com.test.junit, 我们的测试用例的package最好与你所要测试的类的package是相同的结构, 这样做他们编译后的class文件就会在同一级目录中, 这不需要额外进行import待测试的类, 测试用例代码如下:
package com.test.junit;

import junit.framework.Assert;
import junit.framework.TestCase;

public class CalculatorTest extends TestCase {

    private Calculator cal;

    @Override
    public void setUp() throws Exception {
        cal = new Calculator();
        System.out.println("setUp");
    }

    @Override
    public void tearDown() throws Exception {
         System.out.println("tearDown");
    }

    public void testAdd() {
        int result = cal.add(1, 2);
        Assert.assertEquals(3, result);
    }

    public void testMinus() {
        int result = cal.minus(1, 2);
        Assert.assertEquals(-1, result);
    }

    public void testMultiply() {
        int result = cal.multiply(2, 3);
        Assert.assertEquals(6, result);
    }

    public void testDivide() {
        int result = 0;
        try {
            result = cal.divide(6, 4);
        } catch (Exception e) {
            e.printStackTrace();
            Assert.fail();
        }
        Assert.assertEquals(1, result);
    }

    public void testDivide2() {
        Throwable tx = null;
        try {
            cal.divide(4, 0);
            Assert.fail();
        } catch (Exception e) {
            tx = e;
        }
        Assert.assertNotNull(tx);
        Assert.assertEquals(Exception.class, tx.getClass());
        Assert.assertEquals("除数不能为0!", tx.getMessage());
    }
}
  1. 执行测试用例, 结果如下, 全绿的说明测试都通过了, 当然测试通过不代表你的代码没有bug, 可能会有其他的一些情况使我们没有想到的


    嘴对嘴告诉你怎么用Junit进行测试之Junit3.8使用教程_第2张图片

这里对测试用例简单的进行一些说明:

  • Junit3.8中我们的测试用例类必须继承TestCase 类
  • 测试方法必须是公有的(public), 无返回参数的(void), 无方法参数的方法, 并且必须以test开头, test后面名字可以随便取, 当然最好使用你要测试的方法名, 便于阅读
  • setUp方法会再每个测试方法前都执行一次, tearDown方法会再每个测试方法执行完后执行一次, 注意是每个测试测试方法执行前后都会执行(在Junit4中提供了可以在所有测试方法之前和之后只执行一次的注解, 我们可以用它来做一些数据库初始化的操作, 这部分内容后面文章再进行介绍), 我们可以在setUp中进行一些初始化操作, 如上我们会再执行每个测试方法前都会生成一个Calculator的对象.
  • 在测试方法中我们调用要测试的方法, 将结果与你期望的结果进行比较, 使用Assert.assertEquals(期望值, 实际值)
  • 在测试异常情况时, 例如上面的例子的testDivide()方法, 我们期望输入的值得到结果不会抛出异常, 如果进入catch就说明有意外的错误, 需要加上Assert.fail()让junit抛出错误; 再看testDivide2(), 我们输入的除数为0, 我们期望它抛出异常, 所以当执行到cal.divide(4, 0)下一行的时候不是我们期望的, 我们期望的是进入catch中去, 所以我们需要在cal.divide(4, 0)后加上Assert.fail(); testDivede()如果抛出异常了, 可能我们同样也把它捕获到了, 所以即使抛出异常了, 测试也会通过, 所以我们需要在testDivide()的catch代码块中加入Assert.fail()让测试不能通过, 因为进入catch不是我们期望的; 这里可能比较绕, 需要结合代码多理解理解.

Junit3相对来说比较简单, 下篇文章将直接进入Junit4, Junit4中增加了一些新特性, 例如:

  • 使用注解进行配置
  • 进行参数化测试, 解决同一个方法输入参数相同, 但是在junit3.8中需要每一种情况都需要写一个测试方法, Junit4中可以提前预备好数据
  • 可以在所有测试方法执行前进行初始化操作
  • 等等

大家加油!

嘴对嘴告诉你怎么用Junit进行测试之Junit3.8使用教程_第3张图片

你可能感兴趣的:(嘴对嘴告诉你怎么用Junit进行测试之Junit3.8使用教程)