junit单元测试

单元测试

单元测试

用main方法测试,如果一个方法报错,其他全部都不能进行测试了

引用junit

主程序代码

复制代码
package com.itheima;

import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;

public class UserService {

    /**
     * 给定一个身份证号, 计算出该用户的年龄
     * @param idCard 身份证号
     */
    public Integer getAge(String idCard){
        if (idCard == null || idCard.length() != 18) {
            throw new IllegalArgumentException("无效的身份证号码");
        }
        String birthday = idCard.substring(6, 14);
        LocalDate parse = LocalDate.parse(birthday, DateTimeFormatter.ofPattern("yyyyMMdd"));
        return Period.between(parse, LocalDate.now()).getYears();
    }

    /**
     * 给定一个身份证号, 计算出该用户的性别
     * @param idCard 身份证号
     */
    public String getGender(String idCard){
        if (idCard == null || idCard.length() != 18) {
            throw new IllegalArgumentException("无效的身份证号码");
        }
        return Integer.parseInt(idCard.substring(16,17)) % 2 == 1 ? "男" : "女";
    }

}

测试代码

复制代码
package com.itheima;

import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

/**
 * 测试类
 */
@DisplayName("用户信息测试类")
public class UserServiceTest {

    /*@BeforeAll //在所有的单元测试方法运行之前, 运行一次
    public static void beforeAll(){
        System.out.println("before All");
    }
    @AfterAll //在所有的单元测试方法运行之后, 运行一次
    public static void afterAll(){
        System.out.println("after All");
    }
    @BeforeEach //在每一个单元测试方法运行之前, 都会运行一次
    public void beforeEach(){
        System.out.println("before Each");
    }
    @AfterEach //在每一个单元测试方法运行之后, 都会运行一次
    public void afterEach(){
        System.out.println("after Each");
    }*/


    @Test
    public void testGetAge(){
        UserService userService = new UserService();
        Integer age = userService.getAge("100000200010011011");
        System.out.println(age);
    }

    @Test
    public void testGetGender(){
        UserService userService = new UserService();
        String gender = userService.getGender("100000200010011011");
        System.out.println(gender);
    }

    /**
     * 断言
     */
    @Test
    public void testGenderWithAssert(){
        UserService userService = new UserService();
        String gender = userService.getGender("100000200010011011");
        //断言
        //Assertions.assertEquals("男", gender);
        Assertions.assertEquals("男", gender, "性别获取错误有问题");
    }

    /**
     * 断言
     */
    @Test
    public void testGenderWithAssert2(){
        UserService userService = new UserService();
        //断言
        Assertions.assertThrows(IllegalArgumentException.class, () -> {
            userService.getGender(null);
        });
    }

    /**
     * 参数化测试
     */
    @DisplayName("测试用户性别")
    @ParameterizedTest
    @ValueSource(strings = {"100000200010011011","100000200010011031","100000200010011051"})
    public void testGetGender2(String idCard){
        UserService userService = new UserService();
        String gender = userService.getGender(idCard);
        //断言
        Assertions.assertEquals("男", gender);
    }
}

规定必须执行,规范不是

身份证倒数第二位为奇数:男性 偶数:女性

注意:并不是说运行到是绿色就说明代码没错。想要判断逻辑有没有错误需要用到断言

断言

用了断言后,运行是绿色才说明是正确的代码

复制代码
    /**
     * 断言
     */
    @Test
    public void testGenderWithAssert(){
        UserService userService = new UserService();
        String gender = userService.getGender("100000200010011011");
        //断言
        //Assertions.assertEquals("男", gender);
        Assertions.assertEquals("男", gender, "性别获取错误有问题");
    }

加上msg提示信息前后区别

复制代码
        //断言
        //Assertions.assertThrows(你期望抛出的异常类型.class,() ->{
        //   类名.方法名(你抛出的异常结果)
        // })

常见注解

参数化注解:只定义一个测试方法就可以完成一批数据的测试

复制代码
    /**
     * 参数化测试
     */
    @DisplayName("测试用户性别")
    @ParameterizedTest
    @ValueSource(strings = {"100000200010011011","100000200010011031","100000200010011051"})
    public void testGetGender2(String idCard){
        UserService userService = new UserService();
        String gender = userService.getGender(idCard);
        //断言
        Assertions.assertEquals("男", gender);
    }

junit企业开发规范

通过覆盖率,可以知道自己考虑的测试情况到底全面不全面

点击左边的红绿条可以从hits知道单元命中率次数(即你针对这个单元方法测试的次数)

想要只统计某个测试类的覆盖率而不是某个包的覆盖率

搜索你想统计的测试类名------ok------apply------ok

借助ai使用junit

相关推荐
努力努力再努力wz2 天前
【Lua 入门系列】从顺序执行到分支与循环:一文理解 Lua 控制结构、作用域与跳转规则
junit·单元测试·lua
七夜zippoe2 天前
Agent 网关设计:统一入口、智能路由与负载均衡
运维·ai·log4j·负载均衡·agent·网关设计
努力努力再努力wz3 天前
【Lua入门系列】从动态类型到变量作用域:彻底理解 local、全局变量与跨文件访问
开发语言·junit·lua
aloha_7894 天前
Java 基础、集合、异常与 JUnit 5 速查
java·junit·sqlserver
汤姆宝库7 天前
推理时计算深拆:思维链、验证搜索与测试时Scaling
log4j
神一样的老师14 天前
WS63 嵌入式 SSD1306 OLED 驱动单元测试实战
单元测试·log4j
极小狐16 天前
MR 里测试摘要空白、覆盖率不显示?JUnit 与覆盖率配置 9 步排查
数据库·ci/cd·junit·单元测试·mr·devops·代码覆盖率
silvamux_16 天前
大模型 API 单元测试怎么 mock 不误伤
单元测试·log4j·php
system_error_x17 天前
自动化常规代码辅助系统
运维·自动化·log4j
看浪的路人17 天前
第10讲:大模型应用测试——从单元测试到 E2E 评测的完整体系
log4j