当前位置: 首页 > news >正文

junit单元测试:使用@ParameterizedTest 和 @CsvSource注解简化单元测试方法

        在平常的开发工作中,我们经常需要写单元测试。比如,我们有一个校验接口,可能会返回多种错误信息。我们可以针对这个接口,写多个单元测试方法,然后将其场景覆盖全。那么,怎么才能写一个测试方法,就将其涉及到的场景测试全呢?

        1:例如:有一个校验身份证号的接口,涉及业务场景:身份证号为空校验,身份证号是否正确。那么在单元测试的时候,需要测试身份证号为空的数据、身份证号格式错误的数据和身份证号格式正确的数据。

        2:业务代码实现:

package test.boot.service.impl;import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import test.boot.dao.StudentDao;
import test.boot.service.StudentService;
import test.boot.vo.StuentVO;@Service
public class StudentServiceImpl implements StudentService {@Autowiredprivate StudentDao studentDao;public String checkIdNo(String idNo) {String regex = "^\\d{17}[0-9Xx]$";if (StringUtils.isBlank(idNo)) {return "身份证号为空";}if (idNo.matches(regex)) {return "身份证号格式正确";} else {return "身份证号格式错误";}}}

        3:涉及三种场景,单元测试怎么写呢?可能我们会写三个单元测试的方法,如下:

@Test
public void testCheckIdNoEmpty() {String result = new StudentServiceImpl().checkIdNo("");Assert.assertEquals("身份证号为空", result);
}
@Test
public void testCheckIdNoFormatSuc() {String result = new StudentServiceImpl().checkIdNo("666777199911112222");Assert.assertEquals("身份证号格式正确", result);
}
@Test
public void testCheckIdNoFormatError() {String result = new StudentServiceImpl().checkIdNo("345678889");Assert.assertEquals("身份证号格式错误", result);
}

        4:上述写法没有任何问题,如果我们需要测很多个接口,涉及到的业务场景有很多,那么看单元测试的时候,很难发现场景是否覆盖完全,那么我们是否可以优化为一个方法呢?如下:使用 @ParameterizedTest 和 @CsvSource 注解,@ParameterizedTest表示参数注册,也表示单元测试,@ParameterizedTest 和 @Test不能同时使用,@CsvSource 表示多参数注解,可以用分隔符分割数据。

        5:使用 @ParameterizedTest 和 @CsvSource 注解,可以用一个方法,即可测所有场景,我们可以传入两个参数,一个是身份证号,一个是预期结果。代码如下:

@ParameterizedTest
@CsvSource({"'', '身份证号为空'","'610222199911115511', '身份证号格式正确'","'61022219991111551X', '身份证号格式正确'","'6102221999111', '身份证号格式错误'"})
public void testCheckIdNo(String idNo, String expected) {StudentService studentService = new StudentServiceImpl();String result = studentService.checkIdNo(idNo);Assert.assertEquals(expected, result);
}

执行结果:

        不断的学习,才能让自己变得更好!美好的风景一直在路上,加油!

http://www.lryc.cn/news/277053.html

相关文章:

  • C# winform判断自身程序是否已运行,如果已运行则激活窗体
  • 超维空间M1无人机使用说明书——21、基于opencv的人脸识别
  • Redis 持久化——AOF
  • 华为云服务介绍(二)
  • mysql列题
  • cpu缓存一致性
  • Android Framework 常见解决方案(25-1)定制CPUSET解决方案-framework部分修改
  • PyTorch 参数化深度解析:自定义、管理和优化模型参数
  • 自承载 Self-Host ASP.NET Web API 1 (C#)
  • Vue2-子传父和父传子的基本用法
  • 使用numpy处理图片——镜像翻转和旋转
  • HTML5 article标签,<time>...</time>标签和pubdate属性的运用
  • Amazing OpenAI API:把非 OpenAI 模型都按 OpenAI API 调用
  • RK3568平台开发系列讲解(驱动篇)pinctrl 函数操作集结构体讲解
  • vue购物车案例,v-model 之 lazy、number、trim,与后端交互
  • 云原生Kubernetes: Kubeadm部署K8S 1.29版本 单Master架构
  • C++协程操作
  • 计算机配件杂谈-鼠标
  • 用Python来制作一个微信聊天机器人
  • 2024年第九届机器学习技术国际会议(ICMLT 2024) 即将召开
  • 算法训练day9Leetcode232用栈实现队列225用队列实现栈
  • linux驱动(四):platform
  • Guava:Cache强大的本地缓存框架
  • #{}和${}的区别?
  • string的模拟实现
  • 算法练习:查找二维数组中的目标值
  • 考研自命题资料、考题如何找
  • MySQL 存储引擎和索引类型介绍
  • element-ui table height 属性导致界面卡死
  • Vue2.v-指令