单元测试junit

这篇具有很好参考价值的文章主要介绍了单元测试junit。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、介绍

官网:https://junit.org/
JUnit是一个Java语言的单元测试框架,Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何完成功能和完成什么样的功能,Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了

1.1注意事项

  • 测试方法必须使用 @Test 修饰
  • 测试方法必须使用 public void 进行修饰,不能带参数
  • 一般使用单元测试会新建一个 test 目录存放测试代码,在生产部署的时候只需要将 test 目录下代码删除即可
  • 测试代码的包应该和被测试代码包结构保持一致
  • 测试单元中的每个方法必须可以独立测试,方法间不能有任何依赖
  • 测试类一般使用 Test 作为类名的后缀
  • 测试方法使一般用 test 作为方法名的前缀

1.2测试失败说明

  • Failure:一般是由于测试结果和预期结果不一致引发的,表示测试的这个点发现了问题
  • error:是由代码异常引起的,它可以产生于测试代码本身的错误,也可以是被测试代码中隐藏的 bug

1.3常用注解

  • @Test:将一个普通方法修饰成一个测试方法
    • @Test(excepted=xx.class): xx.class 表示异常类,表示测试的方法抛出此异常时,认为是正常的测试通过的
    • @Test(timeout = 毫秒数) :测试方法执行时间是否符合预期
  • @BeforeClass: 会在所有的方法执行前被执行,static 方法 ,全局只会执行一次,而且是第一个运行
  • @AfterClass:会在所有的方法执行之后进行执行,static 方法 ,全局只会执行一次,而且是最后一个运行
  • @Before:会在每一个测试方法被运行前执行一次
  • @After:会在每一个测试方法运行后被执行一次
  • @Ignore:所修饰的测试方法会被测试运行器忽略
  • @RunWith:可以更改测试运行器 org.junit.runner.Runner
  • @Parameters:参数化注解

1.4Assert类

  1. void assertEquals(boolean expected, boolean actual):检查预期值和实际值是否相等
  2. void assertTrue(boolean condition):检查条件为真
  3. void assertFalse(boolean condition):检查条件为假
  4. void assertNotNull(Object object):判断对象是否不为空
  5. void assertNull(Object object):判断对象是否不为空
  6. void assertSame(Object expected, Object actual):判断两个对象是否指向同一个对象
  7. void assertNotSame(Object expected, Object actual):判断两个对象是否不指向同一个对象
  8. void assertArrayEquals(expectedArray, resultArray):判断两个数组是否相等

二、junit4测试案例

2.1普通工程

2.1.1导入依赖

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
</dependency>

2.1.2创建一个作为要测试的类

public class Calculate {

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

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

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

    public int divide(int a , int b){
        return a / b;
    }
}

2.1.3创建测试类

在test目录下与要测试的类相同包路径下创建测试类,也可以选择要测试的类的类名点击右键—Go To—Test进行快捷创建
junit test,Java,junit,单元测试,java
这里的junit版本选择junit4
junit test,Java,junit,单元测试,java

public class CalculateTest {

    @BeforeClass
    public static void beforeClass(){
        System.out.println("beforeClass…………");
    }

    @Before
    public void before(){
        System.out.println("before^^^^^^^^");
    }

    @Test
    public void testAdd() {
        Calculate calculate = new Calculate();
        int add = calculate.add(1, 2);
        System.out.println(add);
    }

    @Test
    public void testSubtract() {
        Calculate calculate = new Calculate();
        int subtract = calculate.subtract(3, 1);
        System.out.println(subtract);
    }

    @Test
    public void testMultiply() {
        Calculate calculate = new Calculate();
        int multiply = calculate.multiply(1, 3);
        System.out.println(multiply);
    }

    @Test
    public void testDivide() {
        Calculate calculate = new Calculate();
        int divide = calculate.divide(10, 2);
        System.out.println(divide);
    }

    @AfterClass
    public static void afterClass(){
        System.out.println("afterClass…………");
    }

    @After
    public void after(){
        System.out.println("after^^^^^^^");
    }
}

2.2junit4集成SpringBoot工程

2.2.1导入依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.3</version>
</parent>
  
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
</dependency>

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
</dependency>

2.2.2 创建springboot启动类,并创建要测试的类

@SpringBootApplication
public class SpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootApplication.class,args);
    }
}
public class Calculate {

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

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

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

    public int divide(int a , int b){
        return a / b;
    }
}

2.2.3 创建测试类

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest()
public class SpringBootJunit4 {
    @Test
    public void add(){
        Calculate calculate = new Calculate();
        int add = calculate.add(1, 2);
        System.out.println(add);
    }
}

三、junit5

3.1组成结构

  • JUnit Platform: 是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入
  • JUnit Jupiter: 提供了JUnit5的新的编程模型,是JUnit5新特性的核心。内部包含了一个测试引擎,用于在Junit Platform上运行
  • JUnit Vintage: 由于JUint已经发展多年,为了照顾老的项目,其提供了兼容JUnit4.x,Junit3.x的测试引擎

3.2引入的依赖

<!--maven工程-->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.7.1</version>
    <scope>test</scope>
</dependency>

<!--springboot项目,test依赖包含junit-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

3.3常用注解

  • @Test:被注解的方法是一个测试方法,与junit4相同
  • @BeforeAll:static 方法,会在所有的方法执行前被执行 ,全局只会执行一次而且是第一个运行,与junit4中的BeforeClass一样
  • @AfterAll:static 方法,会在所有的方法执行后被执行 ,全局只会执行一次而且是最后一个运行,与junit4中的AfterClass一样
  • @BeforeEach:被注解的方法将在当前类的每个@Test方法前执行,与junit4中的Before一样
  • @@AfterEach:被注解的方法将在当前类的每个@Test方法后执行,与junit4中的After一样
  • @Disable:被注解的方法不会执行,与junit4中的Ignore一样
  • @DisplayName:测试类或方法的显示名称
  • @Tag: 为测试类或方法加标签
  • @RepeatedTest:额外重复执行,根据参数额外执行指定次数
  • @Nested:嵌套测试
  • @Timeout:表示测试方法超过了指定时间将返回错误,可以有两个参数,一个为时间,一个为时间单位,默认为秒

3.4断言 static org.junit.jupiter.api.Assertions.*

  • assertEquals:判断两个对象是否相等
  • assertNotEquals:判断两个对象是否不相等
  • assertSame:判断两个对象是否指向通个对象
  • assertNotSame:判断两个对象是否不指向通个对象
  • assertTrue:判断是否为true
  • assertFalse:判断是否为false
  • assertNull:判断是否为空
  • assertNotNull:判断是否不为空

3.5前置条件 org.junit.jupiter.api

类似于断言,只不过不满足的断言会使得测试方法失败,而不满足的前置条件只会使得测试方法的执行终止,可以看成是测试方法执行的前提,当该前提不满足时,就没有继续执行的必要

3.6代码案例

import org.junit.jupiter.api.*;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.concurrent.TimeUnit;
import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
public class SpringBootJunit5 {

    @BeforeAll
    public static void before(){
        System.out.println("before^^^^^^^");
    }

    @RepeatedTest(2)
    @DisplayName("测试一下")
    @Test
    public void add(){
        Calculate calculate = new Calculate();
        int add = calculate.add(1, 2);
        System.out.println(add);
    }

    @Test
    @Timeout(value = 500 , unit = TimeUnit.MILLISECONDS)
    public void divide(){
        Calculate calculate = new Calculate();
        int divide = calculate.divide(8, 2);
        System.out.println(divide);
        try {
            Thread.sleep(501);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 如果预期值与实际值一致,正常执行
     * 如果预期值与实际值不一样,打印错误信息和预期值、实际值
     */
    @Test
    public void multiply(){
        Calculate calculate = new Calculate();
        int multiply = calculate.multiply(1, 2);
        System.out.println(multiply);
        assertEquals(multiply ,2 , "两个对象一样");
    }

    @Test
    public void subtract(){
        Assumptions.assumeTrue(false,"不满足就不执行");
        Calculate calculate = new Calculate();
        int subtract = calculate.subtract(5, 1);
        System.out.println(subtract);
    }

    @AfterAll
    public static void after(){
        System.out.println("after^^^^^^^");
    }
}

注解@DisplayName和@RepeatedTest执行效果,使用@RepeatedTest注解会另加执行指定次数所标注的方法
junit test,Java,junit,单元测试,java
注解@Timeout执行效果,超过指定时间会失败
junit test,Java,junit,单元测试,java
断言不一致的执行效果,程序会失败,并指出预期值与实际值
junit test,Java,junit,单元测试,java
前置条件不一致的执行效果,方法不执行,打印指定的消息
junit test,Java,junit,单元测试,java

3.7 嵌套测试

  • JUnit 5 通过 Java 中的内部类和@Nested 注解实现嵌套测试,将相关的测试方法组织在一起,在内部类中可以使用@BeforeEach 和@AfterEach 注解,而且嵌套的层次没有限制
  • 外层测试方法的执行不会驱动内层方法,当内层方法有 before 或 after 等注解调用外层测试方法,并不会驱动其提前或最后执行
  • 内层方法的执行,可以驱动外层方法,当外层方法定义了某一数据结果时,内层测试方法可以直接调用该结构
import org.junit.jupiter.api.*;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
@DisplayName("嵌套测试")
public class TestNested {

    @BeforeAll
    public static void before(){
        System.out.println("beforeAll^^^^^^");
    }

    @Test
    @DisplayName("外层测试方法1")
    void outer1() {
        System.out.println("在嵌套测试情况下,外层的test不能驱动内层的beforeAll等方法,内层的test可以驱动外层");
    }

    @Test
    @DisplayName("外层测试方法2")
    String outer2(){
        return "外层测试方法2";
    }

    @Nested
    @DisplayName("内部类1")
    class InnerClass1{

        @BeforeEach
        void innerClass1BeforeEach() {
            System.out.println("InnerClass1BeforeEach1^^^^^^^");
        }

        @Test
        @DisplayName("内部类1内部方法1")
        void InnerClass1Method1() {
            String s = outer2();
            System.out.println("内部类1内部方法1 " +s);
        }

        @Nested
        @DisplayName("内部类2")
        class InnerClass2 {

            @BeforeEach
            void innerClass2BeforeEach() {
                System.out.println("InnerClass2BeforeEach1^^^^^^^^^^");
            }

            @Test
            @DisplayName("内部类2内部方法2")
            void InnerClass2Method2() {
                System.out.println("内部类2内部方法2");
            }
        }
    }
}

执行整个类效果
junit test,Java,junit,单元测试,java

3.8参数化测试

可以指定测试方法的输入参数

  • @ValueSource:为参数化测试指定入参来源,支持八大基础类以及String类型、Class类型
  • @NullSource:表示为参数化测试提供一个null的入参
  • @EnumSource:表示为参数化测试提供一个枚举入参
  • @CsvFileSource:表示读取指定CSV文件内容作为参数化测试入参
  • @MethodSource:表示读取指定方法的返回值作为参数化测试入参,方法的返回值为流
package com.haomu;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.stream.Stream;

@SpringBootTest
public class ParametricTest {

    @ParameterizedTest
    @DisplayName("参数化测试1")
    @ValueSource(ints = {1, 2, 3, 4, 5})
    void testParameterized(int i) {
        System.out.println(i);
    }

    static Stream<String> stringProvider() {
        return Stream.of("apple", "banana");
    }

    @ParameterizedTest
    @DisplayName("参数化测试2")
    @MethodSource("stringProvider")
    void testParameterized2(String s) {
        System.out.println(s);
    }
}

执行整个类效果
junit test,Java,junit,单元测试,java

这些就是关于junit的介绍,如有问题请指出,谢谢阅读!文章来源地址https://www.toymoban.com/news/detail-693162.html

到了这里,关于单元测试junit的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java学习笔记——单元测试(JUnit框架)

    public class mathDemo { int area = 0; public int getArea(int a,int b){ area = a*b; return area; } } mathDemoTest类的代码 package UnitDemo; import UnitDemo.mathDemo; import org.junit.*; import static org.junit.Assert.*; public class mathDemoTest { mathDemo m = new mathDemo(); @BeforeClass public static void setUpClass(){ System.out.println(“在当前类的

    2024年04月26日
    浏览(41)
  • Java单元测试浅析(JUnit+Mockito)

    Java测试我们应该都遇到过,一般我们会被要求做单元测试,来验证我们代码的功能以及效率。 这里来和大家一起探讨下有关单于测试。 是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单

    2024年02月06日
    浏览(60)
  • Java中的JUnit是什么?如何使用JUnit进行单元测试

    JUnit是Java中最流行的单元测试框架之一。它可以帮助开发人员在代码编写过程中检测出错误和异常,从而提高代码的质量和可靠性。 JUnit是一个由Kent Beck和Erich Gamma创建的开源Java单元测试框架,它已经成为Java开发中最常用的测试框架之一。这个框架的主要目的是为了简化单元

    2024年02月12日
    浏览(66)
  • 单元测试-spring-boot-starter-test+junit5

    开发过程中经常需要写单元测试,记录一下单元测试spring-boot-starter-test+junit5的使用 引用jar包 可以对局部函数、方法进行调用测试 可以对API调用进行模拟测试

    2024年01月19日
    浏览(48)
  • Maven 项目中为什么Junit之@Test 单元测试无法使用

    由于框架项目的使用,会有很多模块,所以Junit中的@Test注解是我们比较常用的注解,但是有些小问题我们需要注意 在创建完Maven项目后,我们通常呢会导入以下这样的依赖包: 但是我们这时候去代码中使用@Test,会出现报红,这是为什么呢?🤨 这里先说明下,org.junit是导入

    2024年02月02日
    浏览(52)
  • JUnit5单元测试提示“Not tests were found”错误

    JUnit5单元测试提示“Not tests were found”错误,如下图所示: 或者 问题解析: 1)使用@Test注解时,不能有返回值; 2)使用@Test注解时,不能使用private; 存在以上情况时执行单元测试,都会提示“Not tests were found”错误,如下图所示: 正确的示例是使用public void定

    2024年01月16日
    浏览(50)
  • Java中的JUnit单元测试方法的使用

    选中当前工程 - 右键选择:build path - add libraries - JUnit 4 - 下一步 创建Java类,进行单元测试。 此时的Java类要求:① 此类是public的 ②此类提供公共的无参的构造器 此类中声明单元测试方法。 此时的单元测试方法:方法的权限是public,没有返回值,没有形参。 此单元测试方法上

    2024年02月14日
    浏览(39)
  • Java Junit单元测试(入门必看篇)

    Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍单元测试工具Junit使用以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言   JUnit 是一个 Java 编程语言的单元测试框架。JUnit 在测试驱动的

    2024年02月05日
    浏览(48)
  • JAVA:利用JUnit进行高效的单元测试

    1、简述 在软件开发中,单元测试是确保代码质量和可维护性的关键步骤。JUnit作为Java领域最流行的单元测试框架之一,提供了简单而强大的测试工具,可以帮助开发者在项目开发过程中及时发现和修复代码中的问题。本文将介绍JUnit的基本用法以及一些高效的单元测试技巧,

    2024年02月03日
    浏览(66)
  • 浅谈java单元测试框架junit4/5

    junit是一个开源的Java语言的单元测试框架。目前junit主要有版本junit3,junit4和junit5。因在junit3中,是通过对测试类和测试方法的命名来确定是否是测试,且所有的测试类必须继承junit的测试基类TestCase,所以本文不再讨论junit3,只讨论使用比较多的junit4和junit5。 提供注解标识测

    2024年02月03日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包