如何去编写一个好的单元测试,通义灵码是如何快速生成单元测试?

news2024/11/18 11:28:50

本文首先讲述了什么是单元测试、单元测试的价值、一个好的单元测试所具备的原则,进而引入如何去编写一个好的单元测试,通义灵码是如何快速生成单元测试的。

通义灵码插件下载安装:通义灵码_智能编码助手_AI编程-阿里云

目录

什么是单元测试?

单元测试的价值

遵循的原则

如何编写单元测试?

拆分详细的测试用例

制定统一的单测规范

选择合适的单测框架

如何使用通义灵码快速生成单测

手工选中代码方式生成

使用快捷按钮方式生成

采纳单元测试

单测生成追问

结语


什么是单元测试?

单元测试是一种软件测试方法,通过编写代码来验证应用程序中最小的可测试单元(如单个函数、方法或类)的正确性。通常,单元测试由开发人员在功能实现过程中或完成后编写,其目的是确保每个最小可测试单元都能按照设计预期正常工作。

单元测试的价值

单元测试的价值主要体现在提高软件质量和可靠性,‌确保代码在修改或重构后仍然能够正常运行。‌单元测试的优势包括:

  • 提高代码质量:‌通过发现代码中的错误和漏洞,‌从而提高代码的质量和可靠性。‌

  • 提高开发效率:‌在开发过程中及时发现问题,‌减少开发周期和成本。‌

  • 便于重构和维护:‌确保代码在重构和维护过程中不会出现新的错误和漏洞。‌

  • 有助于团队协作:‌作为团队成员之间的沟通和协作工具,‌提高团队的协作效率和质量。‌

此外,‌单元测试还可以让软件故障尽早被发现,‌避免故障遗留到后期由于定位修复难度带来的更大损失。‌它的可回归性为软件提供了一层安全防护网,‌为软件后续的重构和修改提供了安全保障。‌单元测试还为软件单元如何被使用提供了天然的代码样例使用手册。

遵循的原则

好的单元测试就像空气(AIR)一样感觉不到,但在测试质量的保障上,却是非常关键的。好的单元测试宏观上来说,具有自动化(A)、独立性(I)、可重复执行(R)的特点。

  • A: Automatic(自动化):单元测试应能被自动化执行,以便在代码更改时快速确认新加入的代码没有破坏已有功能,通常情况下会将单测接入到持续集成中,每当代码有变更时都会通过持续集成自动触发单元测试。

  • I: Independent(独立性):每个单元测试应当是独立的,不能依赖于其他测试的执行顺序或结果。这也要求单测的测试颗粒度必须足够小,只有这样才能满足独立性。

  • R: Repeatable(可重复执行):好的单元测试在同样的条件下,每次运行应当给出相同的结果。它不应依赖于外部因素(如网络、数据库或文件系统),需要对这些外部的依赖进行正确的mock 。

除此之外,好的单测还必须要满足有明确的断言,执行速度快,边界测试充分,覆盖率高等特点。只有满足这些条件的单测才是好的单测,好的单元测试是对代码质量保障至关重要的一环。

如何编写单元测试?

下面以Java语言为例来介绍如何编写单元测试,总体遵循以下几个步骤:

拆分详细的测试用例

考虑分支条件

寻找边界条件

在编写单元测试时,需要考虑代码中的所有分支。分支包括if、else、switch语句等,每个分支都需要单独测试。例如:

public String classifyNumber(int number) {
    if (number < 0) {
        return "negative";
    } else if (number == 0) {
        return "zero";
    } else {
        return "positive";
    }
}

在上述代码中,有三个分支需要测试:

  • number<0。

  • number==0。

  • number>0。

针对每个分支,都需要编写一个测试用例。

制定统一的单测规范

命名规范

存放路径

单元测试类通常采用 类名Test的形式。例如,如果要测试一个Calculator类,则单元测试类可以命名为CalculatorTest。单元测试方法的命名应当描述具体要测试的内容。例如:

public class CalculatorTest {
    @Test
    public void testAddition() {
        // 测试内容
    }
    @Test
    public void testSubtraction() {
        // 测试内容
    }
}

选择合适的单测框架

Java 常用的单元测试框架有JUnit和Mockito,下面将围绕如何使用这两种框架编写基本的单元测试:

JUnit 测试框架

Mockito 测试框架

JUnit是Java语言中最著名的单元测试框架。它简洁易用,提供了丰富的注解和断言。

  1. 添加JUnit依赖(以Maven为例):

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>
  2. 编写单元测试:

    import org.junit.Test;
    import static org.junit.Assert.*;
    
    public class CalculatorTest {
        @Test
        public void testAddition() {
            Calculator calculator = new Calculator();
            assertEquals(5, calculator.add(2, 3));
        }
    }

如何使用通义灵码快速生成单测

在大多数开发者的编程习惯中,通常采用Test Later的方法进行单元测试,即首先编写好代码,然后再为代码编写相应的单元测试。在此背景下,利用通义灵码生成单元测试显得尤为便捷。以下列举几种使用通义灵码生成单元测试的方式。

手工选中代码方式生成

在 IDE 编辑区中,通过通义灵码选中某段代码来生成单测,选中代码后,在灵码的问答框内,通过 /generate unit test来生成与选中的代码对应的单元测试。

整屏示例@1x (5)

说明

使用/generate unit test这个命令时,可以在输入框追加更多的信息,来生成更符合开发者需要的测试用例,如需要支持JUnit5或采用Mockito进行Mock,就可以采用 /generate unit testJUnit5Mockito这样的方式,后面两个关键词被当作前面命令的参数,这样的使用方式,同样适用于其他命令。

使用快捷按钮方式生成

通义灵码插件在每个方法签名的上面都会有一个小图标,单击图标后会弹出相应的命令菜单,选择生成单元测试。

整屏示例@1x (7)

也可以选择要生成的代码块,然后单击右键来选择生成单元测试功能。

整屏示例@1x (9)

采纳单元测试

单测代码生成完毕后,在问答区的代码块右上角,会有三个选项,分别是插入代码,复制和新建文件:

  • 插入代码:会将当前生成的单测代码插入到当前打开的文件中。

  • 复制:即复制代码块的代码,由用户自行选择将代码复制到哪个文件中。

  • 新建文件:会按照Java单测的规范,新生成一个单测类文件,放到指定的目录中(对应单测方法文件所在的test目录下),如果已经存在同名的单测文件,需要用户自主确认是否覆盖原文件。

整屏示例@1x (10)

单测生成追问

如果您对当前生成的单测代码不满意(需要使用特定的单测框架或者生成更多的单测方法),只需在问答区中的输入框输入相应的文本进行追问即可,或者也可以单击预置的单测追问Tag,如示例中追问的Tag :RetryUse MockitoUse Spring TestExplain code,进行追问,直到生成您满意的单测代码为止。

整屏示例@1x (11)

说明

一般根据代码生成的单元测试,会枚举常用的测试用例,并不会遍历所有的用例。如果您觉得生成的用例不足,建议先采纳当前生成的几个用例,放到测试文件当中。然后,切换到测试文件中,采用代码续写的方式,通义灵码会帮助您续写新的测试用例。

结语

单元测试是重要的编程实践,为编码过程搭建质量围栏。同时,采用测试驱动开发实践中的Test First ,能够显著推动代码设计的演变。通义灵码,可以极大降低单元测试框架的搭建和测试用例编写的工作量。同时,使用通义灵码对单元测试用例保鲜,可以显著提升编码质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2178928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CS 工作笔记:SmartEdit 里创建的是 CMS Component

下图是在 SmartEdit 里创建的 cms Component&#xff0c;在 Back-Office 里的截图&#xff1a; SAP Commerce Cloud 的 CMS Component 是其内容管理系统 (CMS) 的核心组成部分&#xff0c;它提供了对在线商店或平台内容的灵活管理。通过这些组件&#xff0c;用户能够在不涉及复…

MinIO使用客户端进行桶和对象的管理

MinIO使用客户端进行桶和对象的管理 minio安装完成后&#xff0c;除了自带的webui管理界面&#xff0c;还可以使用官方配套的客户端mc进行管理。除此之外&#xff0c;还可以使用第三方客户端s3browser也可以完成对象和桶的生命周期管理。 1. 官方客户端mc MinIO客户端 mc 命…

【STM32】TCP/IP通信协议--LWIP内存管理

五、LWIP内存管理 1.什么是内存管理&#xff1f; &#xff08;1&#xff09;内存管理&#xff0c;是指软件运行时对计算机内存资源的分配的使用的技术&#xff0c;其主要目的是如何高效、快速的分配&#xff0c;并且在适当的时候释放和回收内存资源&#xff08;就比如C语言当…

只申请一块sizeofimage的内存能否实现PE文件的拉伸

不能,别试了,浪费时间. 从最后一个节复制,也会被覆盖 BOOL StrechFileBuffer(__in char* m_fileName, __inout char** LPImageBuffer) {FILE* file (fopen(m_fileName, "rb"));if (file NULL){printf("error :%d", GetLastError());return FALSE;}// 从文…

【HyperWorks入门教程】HyperWorks的shrink warp meshing

在HyperWorks中&#xff0c;针对某些具有复杂几何特征的零部件的网格剖分&#xff0c;Altair HyperMesh 向用户提供了一种名为 Shrink Warp Meshing 的技术&#xff0c;快捷高效地完成有限元模型前处理工作。例如在车辆碰撞分析研究中&#xff0c;用户可以使用 Shrink Warp Mes…

3GPP链路级仿真-Link-Level Simulator for 5G Localization

文章目录 II. SYSTEM ARCHITECTURE AND CAPABILITIESA. System Architecture III. KEY COMPONENTSA. Transmission Models of the Positioning SignalsB. Dedicated Wireless Channel Model IV. APPLICATION CASESA. Two-Dimensional Mobile Terminal Localization仿真工作流程…

Spring+Mybatis IOC + AOP + 开启事务 模板

萌新小白刚入行Java 框架的可以试着自己拿着这个代码改一改,看看能不能运行成功 第一步:创建maven项目,在pom.xml文件中引入以下需要用到的jar包 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&…

matlab2019b-2024b knnclassify无法识别的问题(亲测,已解决)

matlab2019a-2024b 已经移除了knnclassify分类&#xff0c;修改了名称和功能&#xff0c;如果你还想使用它&#xff0c;就必须在2018版本以前的旧版本中找相关的工具箱&#xff08;这是免费的哦&#xff0c;如果官网下载 需要付费&#xff09;。 这里本人从2014a中分离出的工具…

Docker启动 Redis提示:Can‘t initialize Background Jobg

问题说明: 在使用docker启动redis失败&#xff0c;但是查看容器日志&#xff0c;除了提示 Fatal:Cant initialize Background Jobg&#xff0c;没有其他错误信息。经过长时间查找资料及试错&#xff0c;现记录下可能的产生原因及解决方案&#xff0c;以便以后参考。 产生原因&…

【数据结构与算法】Z算法(扩展KMP)(C++和Python写法)

Z算法&#xff08;扩展KMP&#xff09; 文章目录 Z算法&#xff08;扩展KMP&#xff09;朴素求法线性求法力扣类型题变种题&#xff1a;[3303. 第一个几乎相等子字符串的下标](https://leetcode.cn/problems/find-the-occurrence-of-first-almost-equal-substring/) 所谓Z算法&…

[题解] Codeforces Round 976 (Div. 2) A ~ E

A. Find Minimum Operations 签到. void solve() {int n, k;cin >> n >> k;if (k 1) {cout << n << endl;return;}int ans 0;while (n) {ans n % k;n / k;}cout << ans << endl; }B. Brightness Begins 打表发现, 翻转完后的序列为: 0…

基于SSM+小程序的流浪动物领养管理系统(救助1)(源码+sql脚本+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 本系统功能为信息发布管理、领养记录管理、动物小圈管理、求助日报管理等。本系统的使用角色为管理员和用户&#xff0c;用户可以发布自己捡到的流浪动物、求领养信息、申请领养&#xff…

从零开发操作系统

没有操作系统 要考虑放到什么位置 org 07c00h 我用nasm&#xff08;汇编编译&#xff09; 放到7c00处 ibm兼容机 AX发生变化 -寄存器 不可能做存储 内存- 代码段数据段 if else --指令 代码 int a -数据段 必须告诉计算机代码段从哪里开始 改变cs寄存器里面的值可以改变推进寄…

【MYSQL】MYSQL约束

约束是在创建表的时候用的 1、概念 约束英文&#xff1a;constraint 约束实际上就是表中数据的限制条件 2、作用 表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性&#xff0c;比如&#xff1a;用户表有些列的值&#xff08;手机号&#xff09;不能为空…

STM32自动下载电路分享及注意事项

文章目录 简介ISP下载启动配置 USB转串口芯片CH340C手动isp下载自动isp下载RTS、DTR电平变化分析注意事项 简介 在嵌入式开发中&#xff0c;使用STM32下载程序&#xff0c;可以通过仿真器下载&#xff0c;也可以通过串口下载。在stm32串口下载时&#xff0c;我们需要手动配置启…

gradle的入门及kotlin的了解

gradle项目创建方式 1.idea springboot initalizer 2.命令行 gradle目录结构 gradle命令 gradle wrapper 一个解决不同项目需要不同版本gradle的问题 比如&#xff0c;对方电脑没用安装gradle 对方电脑安装了gradle&#xff0c;但是版本太旧了 于是&#xff0c;在项目根目…

Qt 学习第十一天:QTableWidget 的使用

一、创建QTableWidget对象&#xff0c;设置大小&#xff0c;在窗口的位置 //创建tablewidgetQTableWidget *table new QTableWidget(this);table->resize(550, 300);table->move(100, 100); //移动 二、设置表头 //设置表头QStringList headerList; //定义headerList…

Webpack 特性探讨:CDN、分包、Tree Shaking 与热更新

文章目录 前言包准备CDN 集成代码分包Tree Shaking原理实现条件&#xff1a;解决 treeShaking 无效方案&#xff1a;示例代码&#xff1a; 热更新&#xff08;HMR&#xff09; 前言 Webpack 作为现代前端开发中的核心构建工具&#xff0c;提供了丰富的特性来帮助开发者优化和打…

63.5 注意力提示_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录注意力提示生物学中的注意力提示查询、键和值注意力的可视化使用 show_heatmaps 显示注意力权重代码示例 代码解析结果 小结练习 注意力提示 &#x1f3f7;sec_attention-cues 感谢读者对本书的关注&#xff0c;因为读者的注意力是一种稀缺…

Python 读取与处理出入库 Excel 数据实战案例(HTML 网页展示)

有如下数据&#xff0c;需要对数据合并处理&#xff0c;输出到数据库。 数据样例&#xff1a;&#x1f447; excel内容&#xff1a; 出入库统计表河北库.xlsx: 出入库统计表天津库.xlsx: 01实现过程 1、创建test.py文件&#xff0c;然后将下面代码复制到里面&#xff0c;最后…