加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java单元测试JUnit框架原理与用法实例教程

发布时间:2020-05-23 14:54:29 所属栏目:Java 来源:互联网
导读:本文实例讲述了java单元测试JUnit框架原理与用法。分享给大家供大家参考,具体如下:

本文实例讲述了java单元测试JUnit框架原理与用法。分享给大家供大家参考,具体如下:

1 简介

JUnit是一个Java语言的单元测试框架,它由 Kent Beck 和 Erich Gamma 建立,逐渐成为 xUnit 家族中最为成功的一个。 JUnit有它自己的JUnit扩展生态圈,多数Java的开发环境都已经集成了JUnit作为单元测试的工具。在这里,一个单元可以是一个方法、类、包或者子系统。因此,单元测试是指对代码中的最小可测试单元进行检查和验证,以便确保它们正常工作。例如,我们可以给予一定的输入测试输出是否是所希望得到的结果。在本篇博客中,作者将着重介绍 JUnit 4.X 版本的特性,这也是我们在日常开发中使用最多的版本。

2 特点

JUnit提供了注释以及确定的测试方法;
JUnit提供了断言用于测试预期的结果;
JUnit测试优雅简洁不需要花费太多的时间;
JUnit测试让大家可以更快地编写代码并且提高质量;
JUnit测试可以组织成测试套件包含测试案例,甚至其他测试套件;
Junit显示测试进度,如果测试是没有问题条形是绿色的,测试失败则会变成红色;
JUnit测试可以自动运行,检查自己的结果,并提供即时反馈,没有必要通过测试结果报告来手动梳理。

3 内容

3.1 注解

@Test :该注释表示,用其附着的公共无效方法(即用public修饰的void类型的方法 )可以作为一个测试用例;
@Before :该注释表示,用其附着的方法必须在类中的每个测试之前执行,以便执行测试某些必要的先决条件;
@BeforeClass :该注释表示,用其附着的静态方法必须执行一次并在类的所有测试之前,发生这种情况时一般是测试计算共享配置方法,如连接到数据库;
@After :该注释表示,用其附着的方法在执行每项测试后执行,如执行每一个测试后重置某些变量,删除临时变量等;
@AfterClass :该注释表示,当需要执行所有的测试在JUnit测试用例类后执行,AfterClass注解可以使用以清理建立方法,如断开数据库连接,注意:附有此批注(类似于BeforeClass)的方法必须定义为静态;
@Ignore :该注释表示,当想暂时禁用特定的测试执行可以使用忽略注释,每个被注解为@Ignore的方法将不被执行。

/**
* JUnit 注解示例
*/
@Test
public void testYeepay(){
  Syetem.out.println("用@Test标示测试方法!");
}
@AfterClass
public static void paylus(){
  Syetem.out.println("用@AfterClass标示的方法在测试用例类执行完之后!");
}

3.2 断言

在这里,作者将介绍一些断言方法,所有这些方法都来自 org.junit.Assert 类,其扩展了 java.lang.Object 类并为它们提供编写测试,以便检测故障。简而言之,我们就是通过断言方法来判断实际结果与我们预期的结果是否相同,如果相同,则测试成功,反之,则测试失败。

void assertEquals([String message],expected value,actual value) :断言两个值相等,值的类型可以为int、short、long、byte、char 或者
java.lang.Object,其中第一个参数是一个可选的字符串消息;
void assertTrue([String message],boolean condition) :断言一个条件为真;
void assertFalse([String message],boolean condition) :断言一个条件为假;
void assertNotNull([String message],java.lang.Object object) :断言一个对象不为空(null);
void assertNull([String message],java.lang.Object object) :断言一个对象为空(null);
void assertSame([String message],java.lang.Object expected,java.lang.Object actual) :断言两个对象引用相同的对象;
void assertNotSame([String message],java.lang.Object unexpected,java.lang.Object actual) :断言两个对象不是引用同一个对象;
void assertArrayEquals([String message],expectedArray,resultArray) :断言预期数组和结果数组相等,数组的类型可以为int、long、short、char、byte 或者 java.lang.Object

4 JUnit 3.X 和 JUnit 4.X 的区别

4.1 JUnit 3.X

(1)使用 JUnit 3.X 版本进行单元测试时,测试类必须要继承于 TestCase 父类;
(2)测试方法需要遵循的原则:

① public的;
② void的;
③ 无方法参数;
④方法名称必须以 test 开头;

(3)不同的测试用例之间一定要保持完全的独立性,不能有任何的关联;
(4)要掌握好测试方法的顺序,不能依赖于测试方法自己的执行顺序。

/**
* 用 JUnit 3.X 进行测试
*/
import junit.framework.Assert;
import junit.framework.TestCase;
public class TestOperation extends TestCase {
  private Operation operation;
  public TestOperation(String name) { // 构造函数
    super(name);
  }
  @Override
  public void setUp() throws Exception { // 在每个测试方法执行 [之前] 都会被调用,多用于初始化
    System.out.println("欢迎使用Junit进行单元测试...");
    operation = new Operation();
  }
  @Override
  public void tearDown() throws Exception { // 在每个测试方法执行 [之后] 都会被调用,多用于释放资源
    System.out.println("Junit单元测试结束...");
  }
  public void testDivideByZero() {
    Throwable te = null;
    try {
      operation.divide(6,0);
      Assert.fail("测试失败"); //断言失败
    } catch (Exception e) {
      e.printStackTrace();
      te = e;
    }
    Assert.assertEquals(Exception.class,te.getClass());
    Assert.assertEquals("除数不能为 0 ",te.getMessage());
  }
}

4.2 JUnit 4.X

(1)使用 JUnit 4.X 版本进行单元测试时,不用测试类继承TestCase父类;
(2)JUnit 4.X 版本,引用了注解的方式进行单元测试;
(3)JUnit 4.X 版本我们常用的注解包括:

@Before 注解:与JUnit 3.X 中的 setUp() 方法功能一样,在每个测试方法之前执行,多用于初始化;
@After 注解:与 JUnit 3.X 中的 tearDown() 方法功能一样,在每个测试方法之后执行,多用于释放资源;
@Test(timeout = xxx) 注解:设置当前测试方法在一定时间内运行完,否则返回错误;
@Test(expected = Exception.class) 注解:设置被测试的方法是否有异常抛出。抛出异常类型为:Exception.class;

此外,我们可以通过阅读上面的第二部分“2 注解”了解更多的注解。

/**
* 用 JUnit 4.X 进行测试
*/
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class TestOperation {
  private Operation operation;
  @BeforeClass
  public static void globalInit() { // 在所有方法执行之前执行
    System.out.println("@BeforeClass标注的方法,在所有方法执行之前执行...");
  }
  @AfterClass
  public static void globalDestory() { // 在所有方法执行之后执行
    System.out.println("@AfterClass标注的方法,在所有方法执行之后执行...");
  }
  @Before
  public void setUp() { // 在每个测试方法之前执行
    System.out.println("@Before标注的方法,在每个测试方法之前执行...");
    operation = new Operation();
  }
  @After
  public void tearDown() { // 在每个测试方法之后执行
    System.out.println("@After标注的方法,在每个测试方法之后执行...");
  }
  @Test(timeout=600)
  public void testAdd() { // 设置限定测试方法的运行时间 如果超出则返回错误
    System.out.println("测试 add 方法...");
    int result = operation.add(2,3);
    assertEquals(5,result);
  }
  @Test
  public void testSubtract() {
    System.out.println("测试 subtract 方法...");
    int result = operation.subtract(1,2);
    assertEquals(-1,result);
  }
  @Test
  public void testMultiply() {
    System.out.println("测试 multiply 方法...");
    int result = operation.multiply(2,3);
    assertEquals(6,result);
  }
  @Test
  public void testDivide() {
    System.out.println("测试 divide 方法...");
    int result = 0;
    try {
      result = operation.divide(6,2);
    } catch (Exception e) {
      fail();
    }
    assertEquals(3,result);
  }
  @Test(expected = Exception.class)
  public void testDivideAgain() throws Exception {
    System.out.println("测试 divide 方法,除数为 0 的情况...");
    operation.divide(6,0);
    fail("test Error");
  }
  public static void main(String[] args) {
  }
}

4.3 特别提醒

通过以上两个例子,我们已经可以大致知道 JUnit 3.X 和 JUnit 4.X 两个版本的区别啦!首先,如果我们使用 JUnit 3.X,那么在我们写的测试类的时候,一定要继承 TestCase 类,但是如果我们使用 JUnit 4.X,则不需继承 TestCase 类,直接使用注解就可以啦!在 JUnit 3.X 中,还强制要求测试方法的命名为“ testXxxx ”这种格式;在 JUnit 4.X 中,则不要求测试方法的命名格式,但作者还是建议测试方法统一命名为“ testXxxx ”这种格式,简洁明了。

此外,在上面的两个示例中,我们只给出了测试类,但是在这之前,还应该有一个被测试类,也就是我们真正要实现功能的类。现在,作者将给出上面示例中被测试的类,即 Operation 类:

/**
* 定义了加减乘除的法则
*/
public class Operation {
  public static void main(String[] args) {
    System.out.println("a + b = " + add(1,2));
    System.out.println("a - b = " + subtract(1,2));
    System.out.println("a * b = " + multiply(1,2));
    System.out.println("a / b = " + divide(4,2));
    System.out.println("a / b = " + divide(1,0));
  }
  public static int add(int a,int b) {
    return a + b;
  }
  public static int subtract(int a,int b) {
    return a - b;
  }
  public static int multiply(int a,int b) {
    return a * b;
  }
  public static int divide(int a,int b) {
    return a / b;
  }
}

5 测试示例

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读