首页 专题 文章 代码 归档
Java 单元测试
2020.03.15 13:31 2020.03.15 13:31

1. 单元测试

单元测试的目的?

单元测试是编写测试代码,用以检测特定的、明确的、细颗粒的功能! 严格来说,单元测试只针对功能点进行测试,不包括对业务流程正确性的测试。

目前开发所用的单元是Junit框架,在大多数java的开发环境中已经集成,可以方便开发自己调用!

单元测试做什么?

一般来说,一份单元测试主要包括以下几个方面:

接口功能性测试

接口功能的正确性,即保证接口能够被正常调用,并输出有效数据!

  • 是否被顺利调用
  • 参数是否符合预期

局部数据结构测试

保证数据结构的正确性

  • 变量是否有初始值或在某场景下是否有默认值
  • 变量是否溢出

边界条件测试

  • 变量无赋值(null)
  • 变量是数值或字符
  • 主要边界:最大值,最小值,无穷大
  • 溢出边界:在边界外面取值+/-1
  • 临近边界:在边界值之内取值+/-1
  • 字符串的边界,引用 "变量字符"的边界
  • 字符串的设置,空字符串
  • 字符串的应用长度测试
  • 空白集合
  • 目标集合的类型和应用边界
  • 集合的次序
  • 变量是规律的,测试无穷大的极限,无穷小的极限

所有独立代码测试

保证每一句代码,所有分支都测试完成,主要包括代码覆盖率,异常处理通路测试

  • 语句覆盖率:每个语句都执行到了
  • 判定覆盖率:每个分支都执行到了
  • 条件覆盖率:每个条件都返回布尔
  • 路径覆盖率:每个路径都覆盖到了

异常模块测试

后续处理模块测试:是否包闭当前异常或者对异常形成消化,是否影响结果!

2. Junit4

现在一般都是用Junit4来进行java的单元测试;

Junit4是支持注解的方法,让开发人员可以方便的进行测试;

2.1. 导入jar包

使用Junit4进行单元测试,是需要导入jar包的

jar包可去maven仓库下载,也可去官方网站下载;

Maven:https://mvnrepository.com/artifact/junit/junit

当然,更好的是,新建一个Maven工程,使用Maven管理依赖;


我们这里采用手动导入Jar包方式(IDEA为例):

在Java工程文件夹中,新建一个lib文件夹,将.jar文件放进去:

截图-1584241213

然后右键lib文件夹,选择“Add as Library”

截图-1584241235

2.2. 代码测试

有如下注解:

@BeforeClass 全局只会执行一次,而且是第一个运行
@Before 在测试方法运行之前运行
@Test 测试方法
@After 在测试方法运行之后允许
@AfterClass 全局只会执行一次,而且是最后一个运行
@Ignore 忽略此方法

测试代码:

package test;

import org.junit.*;

public class HelloJunit4 {

    @BeforeClass
    public static void beforeClass() {
        System.out.println("这是要在所有方法前面执行的!");
    }

    @Before
    public void before() {
        System.out.println("在测试方法运行之前运行");
    }

    @Test
    public void test() {
        System.out.println("这是真正的测试方法!!!");
    }

    @After
    public void after() {
        System.out.println("在测试方法运行之后允许");
    }

    @AfterClass
    public static void afterClass() {
        System.out.println("全局只会执行一次,而且是最后一个运行");
    }
}

结果:

截图-1584241574

Tips:建议使用Junit4.10版本,其他版本可能会出一些错误!

2.3. 断言测试与及常用断言

上面的@Test注解,只是执行某个测试逻辑代码而已,常用的,我们还需要“断言”!

断言的意思是我们需要知道,某些方法的返回值、某些变量是否有值、值又是否满足我们的期望!

这一切都需要断言来做!

assertEquals

@Test
public void test() {
    int result = 12;
    Assert.assertEquals("提示语", 11, result);
}

说明:“提示语”即出错后的提示;“11”代表期望值;“result”代表程序执行后的真实值;

如果11不等于result,那么此单元测试不同过,报错:

截图-1584242253

当然,断言还有很多其它方法:

  • assertTrue(String message, boolean condition) 要求condition == true
  • assertFalse(String message, boolean condition) 要求condition == false
  • assertEquals(String message, XXX expected,XXX actual) 要求expected期望的值能够等于actual
  • assertArrayEquals(String message, XXX[] expecteds,XXX [] actuals) 要求expected.equalsArray(actual)
  • assertNotNull(String message, Object object) 要求object!=null
  • assertNull(String message, Object object) 要求object==null
  • assertSame(String message, Object expected, Object actual) 要求expected == actual
  • assertNotSame(String message, Object unexpected,Object actual) 要求expected != actual
  • assertThat(String reason, T actual, Matcher matcher) 要求matcher.matches(actual) == true
  • fail(String message) 要求执行的目标结构必然失败,同样要求代码不可达,即是这个方法在程序运行后不会成功返回,如果成功返回了则报错

运行器指定

单元测试中,每个类都是由于JUNIT4框架中的Runner运行器来执行的。

一般情况下,在没有指定运行器的时候,是由系统默认选择(TestClassRunner)的运行器执行。包括类中的所有方法都是由该运行器负责调用和执行。

当我们需要指定的时候,则通过类级别注解@RunWirth(xxxxxx)进行选择,一般是根据不同类型选择不同执行器,可以提高效率也可以应用于某种特殊场景!

本节阅读完毕! (分享
二维码图片 扫描关注我们哟