【JavaSE】JUnit单元测试

记录Java的JUnit单元测试学习。

一.测试分类

1.黑盒测试:不需要写代码,只关注程序结果。给输入值,看程序是否能够输出期望的值。
在这里插入图片描述
2.白盒测试:需要写代码。关注程序具体的执行流程。
在这里插入图片描述

二.为什么需要单元测试

  在平时的开发当中,一个项目往往包含了大量的方法,可能有成千上万个。如何去保证这些方法产生的结果是我们想要的呢?当然了,最容易想到的一个方式,就是我们通过System.out来输出我们的结果,看看是不是满足我们的需求,但是项目中这些成千上万个方法,我们总不能在每一个方法中都去输出一遍嘛。这也太枯燥了。这时候用我们的单元测试框架junit就可以很好地解决这个问题。
  junit如何解决这个问题的呢?答案在于内部提供了一个断言机制,他能够将我们预期的结果和实际的结果进行比对,判断出是否满足我们的期望。

三.什么是单元测试

  java单元测试是最小的功能单元测试代码, 单元测试就是针对单个java方法的测试。java程序的最小功能单元是方法

四.JUnit单元测试

JUnit使用

  属于白盒测试,JUnit是一个开源的java语言的单元测试框架专门针对java语言设计, 使用最广泛, JUnit是标准的单元测试架构。

使用步骤:

1.需要导入JUnit依赖环境
maven依赖

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
</dependency>

这里提供一个JUnit4的依赖Jar包:
链接: https://pan.baidu.com/s/1rvlEFlys9N1RPU6s6Cdz2w . 提取码:1nz3


2. 定义一个测试类

规范建议:
* 测试类名:被测试的类名+Test 如:CalculatorTest
* 存放的包名:xxx.xxx.xx.test 如:cn.itcast.test

在这里插入图片描述

3.在测试类定义一个测试的方法:可以独立运行

规范建议:
1、每一个测试方法上使用@Test进行修饰
2、必须使用public void 进行修饰
3、不能携带参数,空参
4、测试代码和源代码在两个不同的项目路径下
5、测试类的包应该和被测试类保持一致
6、测试单元中的每个方法必须可以独立测试

被测试类例子程序:Calculator.java

package demo;

/**
 * 计算器类
 * @author Dong
 */
public class Calculator {
    /**
     * 加法
     * @param a
     * @param b
     * @return
     */
    public int add(int a, int b) {
        return a + b;
    }

    /**
     * 减法
     * @param a
     * @param b
     * @return
     */
    public int sub(int a, int b) {
        return a - b;
    }
}

测试类:CalculatorTest.java

package test;

import demo.Calculator;
import org.junit.*;

/**
 * Calculator的测试类
 */
public class CalculatorTest {

    /**
     * 单个@Test方法执行前会创建新的CalculatorTest实例
     * 执行测试类的构造函数:一般初始化非常耗时的资源, 例如创建数据库
     * @throws Exception
     */
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        System.out.println("BeforeClass()");
    }

    /**
     * 清理@BeforeClass创建的资源, 例如创建数据库
     * @throws Exception
     */
    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        System.out.println("AfterClass()");
    }

    /**
     * 初始化方法:
     * 用于资源申请,所有测试方法执行之前都会先执行该方法
     * 使用@Before注解
     */
    @Before
    public void init(){
        System.out.println("init...");
    }

    /**
     * 释放资源方法:一般用于释放一些资源
     * 在所有测试方法执行完后,都会自动执行该方法。被测试的方法出现异常仍会执行
     * 使用@After注解
     */
    @After
    public void close(){
        System.out.println("close...");
    }

    /**
     * 测试add方法
     */
    @Test
    public void testAdd(){
        //1.创建计算器对象
        Calculator c=new Calculator();
        //2调用被测试的add方法
        int results=c.add(1,2);

        System.out.println("testAdd...");

        //3.断言,我断言这个结果是3
        //绿色:与断言的结果相同
        //红色:与断言的结果不同
        Assert.assertEquals(3,results);
    }

    /**
     * 测试sub方法
     */
    @Test
    public void testSub(){
        //1.创建计算器对象
        Calculator c=new Calculator();
        //2调用被测试的add方法
        int results=c.sub(1,2);

        System.out.println("testSub...");

        //3.断言,我断言这个结果是3
        //绿色:与断言的结果相同
        //红色:与断言的结果不同
        Assert.assertEquals(-1,results);
    }
}

如果运行整个测试类, 运行结果如下:
在这里插入图片描述
如果运行单个@Test测试方法:
在这里插入图片描述

会用到的注解

对于@Test,里面有很多参数供我们去选择。我们来认识一下
1、@Test(expected=XX.class)
这个参数表示我们期望会出现什么异常,比如说在除法中,我们1/0会出现ArithmeticException异常,那这里@Test(expected=ArithmeticException.class)。在测试这个除法时候依然能够通过。

2、@Test(timeout=毫秒 )
这个参数表示如果测试方法在指定的timeout内没有完成,就会强制停止。

3、@Ignore
这个注解其实基本上不用,他的意思是所修饰的测试方法会被测试运行器忽略。

4、@RunWith
更改测试运行器。

欢迎点赞评论,指出不足,笔者由衷感谢!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值