junitjava单元测试框架|学习笔记(代码片段)

Fxtack Fxtack     2022-12-13     178

关键词:

Java 单元测试框架 | 学习笔记


文章目录


一. 单元测试

1. 何为单元测试

  • 单元测试是针对最小功能单元编写测试代码
  • Java 程序最小功能单元是方法
  • 单元测试针对单个 Java 方法的测试

2. 单元测试的优点

  • 确保单个方法运行正常
  • 如果修改了方法代码只需要确保其对应的单元测试通过
  • 测试代码本身可以作为示例代码
  • 可以自动化运行所有的测试并或得报告

二. 测试驱动开发 TDD(Test-Driven Development)

测试驱动开发流程

运行异常 运行正常 编写接口 编写测试 编写实现 运行测试 任务完成

三. JUnit 介绍

1. Junit 是一个开源的 Java 语言的单元测试框架

  • 针对 Java 语言设计,使用最广泛
  • JUnit 是事实上的标准单元测试框架

2. JUnit 的特点

  • 使用断言(Assertion)测试期望结果
  • 可以方便地组织和运行测试
  • 可以方便的查看测试结果
  • 常用的 IDE 都集成了 JUnit
  • 可以方便的集成到 Maven 中

四. JUnit 中的概念

  • TestCase:一个 TestCase 表示一个测试
  • TestSuite:一个 TestSuite 包含一组 TestCase ,表示一组测试
  • TestFixture:一个 TestFixture 表示一个测试环境
  • TestResult:用于收集测试结果
  • TestRunner:用于运行测试
  • TestListener:用于监听测试过程,并收集数据
  • Assert:用于断言测试结果是否正确

五. 断言测试

断言总览(未录的一些断言方法可以参见 JUnit API 的 Assert 类了解学习)

断言方法测试效果备注
assertEquals(int a, int b)测试值 a 与b是否相等该方法与多种数据类型重载,详细参见 JUnit API 的 Assert 类
assertNotEquals(int a, int b)测试值 a 与 b 是否不相等同上
assertArrayEquals(int[] a, int[] b)测试数组 a 与数组 b 是否相等。两数组必须顺、大小、值完全相同才能通过测试该方法与多种数据类型的数组重载,详细参见JUnit API 的Assert 类
assertNull(Object x)测试值 x 是否为空
assertNotNull(Object x)测试 x 是否不为空
assertTrue(boolean x) /assertFalse(boolean x)测试 x 是否为真/测试 x 为假可以书写逻辑运算表达式
assertSame(Object a, Object b)测试 a 和 b 的引用是否指向同一个对象

简单使用

  • 断言相等与不相等

    assertEquals(100, x);
    测试 x 是否值为 100

    assertNotEquals(100, x);
    测试 x 是否值不为 100

  • 断言数组相等
    assertArrayEquals(y, x);

    测试 x 是否与 y 数组相等

  • 浮点数断言相等

    assertEquals(3.1416, x, 0.0001);
    测试 x 是否在精度为 0.0001 的情况下与 3.1416 相等

  • 断言为null或不为 null
    assertNull(x);

    测试x是否为空

    assertNotNull(x);
    测试x不为空

  • 布尔值断言

    assertTrue(x>0);
    assertFalse(x<0);
    测试值为true / false

Assert测试案例

注意:JUnit以方法为测试单元,因此作为测试的方法需要加上 @Test 注解

package org.example.test

import org.junit.Test;
import static org.junit.Assert.*;

public class Test 
    //测试方法需要加上@Test注解
    @Test
    public void test1() 
        assertEquals(5,2+3);
    
    
    @Test
    pubic void test2() 
        assertEquals(3.1415926,3.1415927,0.00000001);
    

//若测试通过,控制台上将不会显示任何信息

运行以上测试方法 test2 时,测试失败,控制台将会显示以下信息:

(运行环境为 Java8,IDEA 2020。只截取了部分关键运行结果信息如下)


java.lang.AssertionError: 
Expected :3.1415926
Actual   :3.1415927
<Click to see difference>

...

六. JUnit Fixture

  • @Before@After

    每个 @Test 方法执行前都会执行 @Before 方法。主要用于创建 @Test 方法需要的一些资源。若有多个 @Test 方法,每次执行 @Test 方法前都会单独执行 @Before 方法,使得资源互不影响。@After 同理,用于关闭一些资源,在 @Test 方法完成后执行。

    package org.example.test
        
    import static org.junit.Assert.*;
    import static org.junit.Before;
    import static org.junit.After;
    
    public class Test 
        
        Main m;
        
        @Before
        public void setUp() 
            m = new Main();
        
        
        @After
        public void setDown() 
            System.out.println("A test method is finish");
        
       
        @Test
        public void testMain() 
            assertEquals(5,m.add(2,3));
        
        
    
    
  • @BeforeClass@AfterClass

    @BeforeClass 在所有测试方法执行前执行的方法,一般用于创建非常耗时的资源。

    @AfterClass 在所有测试方法执行之后执行的方法,一般用于清理资源。

总测试

package org.example.test


import static org.junit.Assert.*;
import static org.junit.*;

public class Test 
    
    @BeforeClass
    public void setUpBeforClass() 
        System.out.println("BeforeClass method is running");
    
    
    @AfterClass
    public void setDownAfterClass() 
        System.out.println("AfterClass method is running");
    
    
    @Before
    public void setUp() 
        System.out.println("	Before method is runing");
    
    
    @After
    public void setDown() 
        System.out.println("	After method is running");
    
    
    @Test
    public void TestA() 
        System.out.println("		TestA method is running");
    
    
    @Test
    public void TestB() 
        System.out.println("		TestB method is running");
    
    
    @Test
    public void TestC() 
        System.out.println("		TestC method is running");
    

测试结果

BeforeClass method is running

​ Before method is runing

​ TestA method is running

​ After method is running

​ Before method is runing

​ TestB method is running

​ After method is running

​ Before method is runing

​ TestC method is running

​ After method is running

AfterClass method is running

运行结果,方法执行顺序,图解

七. 测试异常

@Test 注释中加入参数例如:

@Test(expected = NumberFormatException.class)

表示该测试方法预期发生 NumberFormatException,若发生该异常则测试成功

八. 参数化测试

如果待测试的输入是一组数据则可以使用参数化测试,这使得测试可以用一组数据来进行多项测试

  • 可以把测试数据组织起来
  • 用不同的则是数据调用相同的测试方法
package org.example.test

import static org.junit.Assert.*;
import static org.junit.*;

@RunWith(Parameterized.class)
public class Test 
    
    private int input;
    private int expected;
    
    @Parameters
    public static Collection data() 
        //这里定义了一组测试数据
        return Arrays.asList(new Object[][] 0,0,1,1,-1,1);
    
    
    public Test(int input,int expected) 
        this.input = input;
        this.expected = expected;
    
    
    @Test
    public void testAbs() 
        //此时使用测试类的全局变量
        //将会使用 data 方法中的数据组进行逐对测试
        assertEquals(this.expected,Math.abs(this.input));
    

进行参数化测试要求:

  • 参数必须由静态方法 data() 返回
  • 返回类型为 Collection<Object[]>
  • 静态方法必须注释为 @Parameters
  • 测试类必须注释为@RunWith(Parameterized.class)
  • 构造方法参数必须和测试参数对应

九. 超时测试

在 @Test 注释中加以参数以实现执行超时测试。例如:

@Test(timeout = 500)

该方法若超过 500ms 还未完成则测试结果为超时


JUnit 4.13 API文档: https://junit.org/junit4/javadoc/latest/


文章内容来自个人学习总结
欢迎指出本笔记中存在的问题
未经本人同意禁止转载,不得用于商业用途

junit单元测试学习笔记(代码片段)

   软件开发的过程中,测试环节是少不了的,如果没有测试,软件的质量难以保证。但是如果用main函数手写log的方式进行测试显得过于繁琐,也不方便一次性测试多个模块,效率低。因此需要我们有一个非常好的工... 查看详情

学习笔记单元测试之mockito学习笔记(代码片段)

Mockito库能够Mock对象、验证结果以及打桩(stubbing)。比如在测试时,可以用mockito模拟查询数据库的操作,即将查询数据库的方法拦截,并人工设置其返回值,这样就不用真正去数据库中拿取数据了。此外还可以对某... 查看详情

学习笔记单元测试之mockito学习笔记(代码片段)

Mockito库能够Mock对象、验证结果以及打桩(stubbing)。比如在测试时,可以用mockito模拟查询数据库的操作,即将查询数据库的方法拦截,并人工设置其返回值,这样就不用真正去数据库中拿取数据了。此外还可以对某... 查看详情

selenium2学习:单元测试框架(代码片段)

1      单元测试框架1.1    认识单元测试Unittest提供了全局的main()方法,使用他可以方便地将一个单元测试模块变成可以直接运行的测试脚本。Main()方法使用testloader类来搜索所有包含在该... 查看详情

实验单元测试(代码片段)

实验五、单元测试一、实验目的1、掌握单元测试的方法;2、学习XUnit测试原理及框架;3、学习使用测试框架进行单元测试的方法和过程。 二、实验内容与要求1、了解单元测试的原理与框架1.1单元测试原理  单元测试(uni... 查看详情

实验五单元测试(代码片段)

一、实验目的1、掌握单元测试的方法;2、学习XUnit测试原理及框架;3、学习使用测试框架进行单元测试的方法和过程。 二、实验内容与要求了解单元测试的原理与框架1.1单元测试原理     单元测试(unittes... 查看详情

实验单元测试(代码片段)

一、实验目的1、掌握单元测试的方法2、学习XUnit测试原理及框架3、学习使用测试框架进行单元测试的方法和过程二、实验内容与要求1、了解单元测试的原理与框架1.1单元测试原理 单元测试,是指对软件中的最小可测试单元... 查看详情

实验五单元测试(代码片段)

一、实验目的1、掌握单元测试的方法2、学习XUnit测试原理及框架3、学习使用测试框架进行单元测试的方法和过程二、实验内容与要求1、了解单元测试的原理与框架1.1单元测试原理单元测试,是指对软件中的最小可测试单元进行... 查看详情

selenium2学习:单元测试框架(代码片段)

1.4    Discover更多测试用例discover(start_dir,pattern=‘test*.py‘,top_level_dir=None)找到指定目录下所有测试模块,并可递归查到子目录下的测试木块,只有匹配到的文件名才会被加载。如果启动的不是顶层目录,那么顶层目... 查看详情

实验五单元测试(代码片段)

一、实验目的1)掌握单元测试的方法2)学习XUnit测试原理及框架;3)掌握使用测试框架进行单元测试的方法和过程。 二、实验内容与要求1、了解单元测试的原理与框架     1.1单元测试原理  单元测... 查看详情

实验五单元测试(代码片段)

实验五 单元测试一、实验目的1)掌握单元测试的方法2)学习XUnit测试原理及框架;3)掌握使用测试框架进行单元测试的方法和过程。二、实验内容与要求1、了解单元测试的原理与框架 1.1单元测试原理  单元测试(unitt... 查看详情

实验五单元测试(代码片段)

实验五、单元测试一、实验目的1)掌握单元测试的方法学习XUnit测试原理及框架;3)掌握使用测试框架进行单元测试的方法和过程。二、实验内容与要求1、了解单元测试的原理与框架1.1单元测试原理单元测试(unittesting),是... 查看详情

实验五单元测试(代码片段)

一、实验目的(1)掌握单元测试的方法(2)学习XUnit测试原理及框架;(3)掌握使用测试框架进行单元测试的方法和过程。二、实验内容与要求1、了解单元测试的原理与框架1.1单元测试原理单元测试(unittesting),是指对软件中的最... 查看详情

android单元测试学习总结(代码片段)

文章目录一、本地单元测试1.创建测试类2.Assert类中的常用断言方法3.运行测试类4.运行单个测试方法或多个测试类二、Mockito测试框架的使用1.Mock概念的理解2.Mockito中几种Mock对象的方式3.验证行为verify(Tmock)函数的使用使用`when(Tmeth... 查看详情

单元测试基础知识(代码片段)

9.单测工具简介JUnitJava用的最多的单测框架,使用非常简单,主流IDE基本都集成了JUnit,具体用法就不介绍了,可以花十分钟看看官方文档http://junit.org/junit4/TestNg是一款基于junit框架上的加强版单元测试框架,具备更多更强大的... 查看详情

单元测试及框架简介--junitjmockmockitopowermock的简单使用(代码片段)

转单元测试及框架简介--junit、jmock、mockito、powermock的简单使用2013年08月28日14:33:06luvinahlc阅读数:6413标签:测试工具单元测试Junit实例Mockito更多个人分类:单元测试推荐一个新手学习Junit4的博客地址:http://www.cnblogs.com/eggbucket/arc... 查看详情

实验测试单元(代码片段)

一、实验目的1)掌握单元测试的方法2)学习XUnit测试原理及框架;3)掌握使用测试框架进行单元测试的方法和过程。二、实验内容与要求1)源码#include"stdio.h"#include"string.h"#include"windows.h"#include"time.h"#defineN49//1表示棋子,只有黑色... 查看详情

mybatisjava持久层框架入门与实践|学习笔记(代码片段)

...简述MyBatis。之后将手把手的搭建一个简单的MyBatis框架的测试,先跑起来。随后将基于该测试讲解MyBatis框架中重要的几个配置文件。然后对于数据库常用的增、删、查、改操作在MyBatis中的进行实现,并讨论一些Java中集合... 查看详情