首页 > 编程语言 >Java单元测试

Java单元测试

时间:2024-12-18 15:43:58浏览次数:11  
标签:Java 单元测试 api jupiter Test org junit

一、单元测试概述

  1. 定义
    • 单元测试是对软件中的最小可测试单元进行检查和验证。在Java中,最小可测试单元通常是一个方法。它的目的是隔离各个部分的代码,确保它们能够正确地独立运行,便于早期发现代码中的错误。
  2. 重要性
    • 提高代码质量:能够快速定位代码中的问题,比如逻辑错误、边界条件处理不当等。例如,在一个简单的数学计算方法add(int a, int b)中,单元测试可以验证各种输入情况下(如正数、负数、零)的计算结果是否正确。
    • 便于代码重构:当对代码进行重构时,单元测试可以帮助确保功能没有被破坏。比如,将一个复杂的算法从一种实现方式改为另一种更高效的实现方式,只要单元测试通过,就可以很大程度上保证功能的完整性。
    • 促进团队协作:不同的开发人员可以根据单元测试来理解代码的功能和预期行为,特别是在代码交接或者多人协作开发的项目中。

二、常用的单元测试框架 - JUnit

  1. 添加依赖

    • 如果使用Maven构建项目,需要在pom.xml文件中添加JUnit依赖。例如,对于JUnit 5,添加以下依赖:
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.8.2</version>
        <scope>test</scope>
    </dependency>
    
    • 如果是Gradle构建的项目,在build.gradle文件中添加类似如下内容:
    testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2'
    
  2. 编写简单的测试用例

    • 假设我们有一个简单的Java类Calculator,其中有一个加法方法add
    class Calculator {
        public int add(int a, int b) {
            return a + b;
        }
    }
    
    • 我们可以编写JUnit测试用例来测试这个方法:
    import org.junit.jupiter.api.Test;
    import static org.junit.jupiter.api.Assertions.*;
    
    class CalculatorTest {
        @Test
        public void testAdd() {
            Calculator calculator = new Calculator();
            int result = calculator.add(2, 3);
            assertEquals(5, result);
        }
    }
    
    • 在这个测试用例中,@Test注解标记了testAdd方法是一个测试方法。assertEquals是JUnit提供的断言方法,用于验证实际结果(result)是否等于预期结果(5)。
  3. 测试方法的执行顺序和生命周期(JUnit 5)

    • 方法执行顺序:默认情况下,JUnit 5测试方法的执行顺序是不确定的。但是可以使用@TestMethodOrder注解来指定顺序。例如,使用MethodOrderer.OrderAnnotation可以按照方法上的@Order注解指定的顺序执行:
    import org.junit.jupiter.api.MethodOrderer;
    import org.junit.jupiter.api.Order;
    import org.junit.jupiter.api.Test;
    import org.junit.jupiter.api.TestMethodOrder;
    
    @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
    class MyTestClass {
        @Test
        @Order(1)
        public void firstTest() {
            //...
        }
    
        @Test
        @Order(2)
        public void secondTest() {
            //...
        }
    }
    
    • 生命周期:JUnit 5引入了@BeforeEach@AfterEach@BeforeAll@AfterAll注解来管理测试方法的生命周期。
    • @BeforeEach:在每个测试方法执行之前执行。例如,可以用于初始化测试对象或设置测试环境。
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;
    
    class MyTestClass {
        private MyObject myObject;
    
        @BeforeEach
        public void setup() {
            myObject = new MyObject();
        }
    
        @Test
        public void testMethod() {
            // 使用myObject进行测试
        }
    }
    
    • @AfterEach:在每个测试方法执行之后执行,可用于清理资源等操作。
    • @BeforeAll:在所有测试方法执行之前执行一次,通常用于初始化一些共享的资源,并且这个方法必须是静态的。
    • @AfterAll:在所有测试方法执行之后执行一次,也必须是静态的,用于释放共享资源。

三、单元测试中的断言

  1. 基本断言方法(JUnit)
    • assertEquals:用于比较两个值是否相等。它有多种重载形式,可以比较基本数据类型、对象等。例如:
    assertEquals(10, myMethodReturningIntValue());
    assertEquals("expectedString", myMethodReturningStringValue());
    
    • assertTrueassertFalse:用于验证一个布尔表达式的结果。例如:
    assertTrue(myBooleanMethod());
    assertFalse(myFalseBooleanMethod());
    
    • assertNullassertNotNull:用于检查对象是否为null。例如:
    assertNull(myMethodReturningNull());
    assertNotNull(myObject);
    
  2. 断言异常抛出
    • 在单元测试中,有时需要验证方法是否正确地抛出了异常。例如,对于一个可能抛出IllegalArgumentException的方法divide
    import org.junit.jupiter.api.Test;
    import static org.junit.jupiter.api.Assertions.*;
    
    class MyMathTest {
        @Test
        public void testDivideByZero() {
            MyMath math = new MyMath();
            assertThrows(IllegalArgumentException.class, () -> {
                math.divide(5, 0);
            });
        }
    }
    
    • 这里assertThrows方法用于验证代码块(lambda表达式部分)是否抛出了指定类型(IllegalArgumentException)的异常。

四、测试覆盖率

  1. 定义和重要性
    • 测试覆盖率是指测试用例覆盖了被测试代码的程度。它是衡量单元测试质量的一个重要指标。高测试覆盖率意味着更多的代码被测试到,减少了未被发现的错误的可能性。
  2. 工具介绍 - JaCoCo(Java Code Coverage)
    • 添加依赖:在Maven项目中,添加如下依赖:
    <dependency>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco - maven - plugin</artifactId>
        <version>0.8.8</version>
    </dependency>
    
    • 配置和使用:在pom.xml文件的build部分配置插件:
    <build>
        <plugins>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco - maven - plugin</artifactId>
                <version>0.8.8</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>prepare - agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>report</id>
                        <phase>test</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    
    • 运行mvn test后,会在target/site/jacoco目录下生成测试覆盖率报告,可以通过浏览器打开index.html文件查看详细的覆盖率信息,包括语句覆盖、分支覆盖等情况。

标签:Java,单元测试,api,jupiter,Test,org,junit
From: https://www.cnblogs.com/java-note/p/18615096

相关文章

  • 单元测试中设计测试用例的依据
    一、需求规格说明书功能需求描述需求规格说明书详细地阐述了软件系统应该具备的功能。例如,对于一个计算器软件的加法功能,说明书会明确指出用户输入两个数字后,系统能够正确计算它们的和并输出结果。测试人员就可以根据这个描述设计测试用例,如输入整数相加(如2+3)、小数相加(如2.......
  • 4、无所不在的JAVA——JAVA8实战
    用Optional取代nullnull引用引发的问题,以及为什么要避免null引用从null到Optional:以null安全的方式重写你的域模型让Optional发光发热:去除代码中对null的检查读取Optional中可能值的几种方法对可能缺失值的再思考null带来的种种问题是错误之源NullPointerException是......
  • 【毕业设计】A076-基于Java的个人云盘管理系统设计与实现
    ......
  • Java 格式化BigDecimal返回前端 显示小数点后的0
    前端需要保留2位小数,即使小数点后是0也需要显示;1、使用@JsonSerialize输出数据保留两位小数,创建一个BigDecimal格式化工具importcom.fasterxml.jackson.core.JsonGenerator;importcom.fasterxml.jackson.databind.JsonSerializer;importcom.fasterxml.jackson.databind.......
  • 发送邮件(Java)
     注册一个新浪的邮箱开启一下配置(其他邮箱也行,这里用新浪邮箱举例子):配置yml# Email配置 mail:  #配置SMTP服务器地址  host:smtp.sina.com  #发送者邮箱  username:2437xxxxx@sina.com  #配置密码,注意不是真正的密码,而是刚刚申请到......
  • 微信Native支付(Java)
    微信开放平台链接:Native下单_Native支付|微信支付商户文档中心导入依赖:<dependency><groupId>com.github.wechatpay-apiv3</groupId><artifactId>wechatpay-java</artifactId><version>0.2.15</version></dependency> 配置ymlwx......
  • 前端必知必会-JavaScript HTML DOM 导航
    文章目录JavaScriptHTMLDOM导航DOM节点DOMHTML树节点关系节点树在节点之间导航子节点和节点值InnerHTMLDOM根节点document.body-文档的正文nodeName属性nodeName是只读的nodeValue属性nodeType属性总结JavaScriptHTMLDOM导航使用HTMLDOM,您可以使......
  • 前端必知必会-JavaScript HTML DOM 元素(节点)
    文章目录JavaScriptHTMLDOM元素(节点)添加和删除节点(HTML元素)创建新的HTML元素(节点)创建新的HTML元素-insertBefore()删除现有HTML元素删除子节点替换HTML元素总结JavaScriptHTMLDOM元素(节点)添加和删除节点(HTML元素)创建新的HTML元素(节点)要向HT......
  • 前端必知必会-JavaScript HTML DOM 集合
    文章目录JavaScriptHTMLDOM集合HTMLCollection对象HTMLHTMLCollection长度总结JavaScriptHTMLDOM集合HTMLCollection对象getElementsByTagName()方法返回HTMLCollection对象。HTMLCollection对象是HTML元素的数组式列表(集合)。以下代码选择文档......
  • JAVA实现大文件上传实例解析
    技术:分片,断点续传,加密传输,加密存储要求:开源,免费,技术支持需求:大文件上传,批量上传,断点续传,文件夹上传,大文件下载,批量下载,断点下载,文件夹下载文件夹:上传下载需要支持层级结构,采用非压缩方式文件大小:100G前端:vue2,vue3,vue-cli,jquery,html,webuploader后端:java,JSP,sprin......