如何写完备的单元测试,写了这些测试给我们带来了什么?

最近在改一个其他公司几年前做的一个信用卡系统,因为年代久远,需求、代码的不全面,导致对同一个问题不断的修改。

[b]需求1:[/b]导入大机的打卡文件,文件是一个文本文件,每行是一条记录,根据其中的联名编号找卡种,联名编号只有两种,8位编号或者8个0。如果没有找到卡种则报错退出。(联名编号是信用卡联名组织的一个编号,比如中石油卡,联名组织是中石油)
对卡种表加一个字段保存联名编号,默认值是8个0,然后一条sql解决问题:select * from cardtype where jointlyno = ?
上线后出问题了:运通卡文件无法导入。
调试跟踪后发现,运通卡的打卡文件的联名编号是8个空格,和以前的需求描述不一样,只好修改代码。
得到的需求是--[b]需求2:[/b]如果是8个空格的肯定是运通卡
于是代码变成了先判断jointlyno是否是8个空格,如果是则直接返回全部的运通卡卡种,不是才是以前的那条sql
上线后又出问题了,有一个文件导入报错,没有说明什么卡等具体细节。
只好把那个文件拿过来调试跟踪,发现是有两个卡种比较怪异,他们的联名编号是10013xxx,3个x表示可以随意变化,因为这个是学生卡,3个x表示的是学校编号。问题就出现在这里,打卡文件里面的联名编号是确定的,比如是10013001,但是卡种表里面的却是10013xxx,所以按照那条sql 返回的记录是空。
看来只好继续改程序,变成了再加一个判断,如果联名编号前五位是10013的则不管后面3位是什么,判断前五位即可。即select * from cardtype where substr(jointlyno,1,5)= ? ,这个 ?是 jointlyNo.subString(0,5)。
这里出现一个 [b]需求3:[/b]如果联名编号前五位是10013的则不管后面3位是什么,判断前五位即可

这么一个简单的问题为什么需要反反复复的修改呢?能否避免反复修改?如果无法避免,如果有效快速地应对这些修改?
这个案例很显然地原因就是客户对需求理解的不全面,以致于他自己在不断完善自己的需求,而代码也跟着需求在修改,这个修改是无法避免的,如果无法反抗,按照敏捷的做法那就拥抱变化吧,问题是怎么拥抱?我觉得需要用完备的测试来细化对需求的理解。
对于需求1,需要测试三种情况,1) 00000000 2) 正确的联名编号 3)错误的联名编号
8个空格就是第三种情况,10013001也是第三种情况。 但是这种情况都是在需求1中被客户声明说不会出现的情况,恰恰变化就出在这边。需求的变化是把几个错误的编号变成了正确的编号,这种完全相反的变化完全无法预料的。
需求2出现后 需要增加 一个 8个空格的测试,非8个空格的测试落入刚才3个测试中。
需求3出现后 需要增加 1)10013001的测试,2)10013888(假设10013888这个联名编号存在,而且对应的卡种不是学生卡) 3)10013999(10013999是一个不存在的联名编号)
如果第2、3两个测试的情况发生,那现在的代码就有bug。但是现在需求是10013开头的联名编号肯定对应的学生卡,这两个杞人忧天的测试需要吗?
很简单的一个问题,但是要写这么多的测试,每个case要写完备的测试真不是一件简单的事情,不知道有什么成套的测试写法。而且这些测试带来的作用仅仅是对需求的细化理解,并不能对代码的修改产生多大的帮助。这些测试如果用图来表达其实也不错,为何一定需要这么完备的单元测试代码呢?
在项目中如何做好单元测试 什么是单测,如何做好单测 单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类。单元测试都是以自动化的方式执行,所以在大量回归测试的场景下更能带来高收益。 单元测试的对象是代码,以及代码的基本特征和产生错误的原因,然后你必须掌握单元测试的基本方法和主要技术手段,比如什么是驱动代码、桩代码和 Mock 代码等。 第一,代码的基本特征与产生错误的原因 要做到代码功能逻辑正确,必须做到分类正确并且完备无遗漏,同时每个分类的处理逻辑必须正确 阅读详情

相关推荐

软件测试-测试的概念,单元测试的详细介绍,如何设计测试用例

软件测试

VAN 1319

单元测试的意义

本文系统介绍了软件单元测试的概念、价值、实施方法和工具选择。文章对比了传统与现代单元测试的定义差异,指出现代单元测试应具备一键式自动化、黑盒测试等特点。详细分析了C/C++主流测试框架(如Gtest、Mockcpp)的优劣,并提供了单元测试实施流程:环境搭建、用例编写、持续集成部署等。文章强调单元测试需注意测试覆盖率、断言完整性、代码设计质量等关键点,建议通过黑盒测试、代码解耦和TDD等方法降低维护成本。最后指出应将单元测试纳入整体测试策略,结合敏捷测试象限等理论进行全局规划。全文为开发团队实施高效单元测试

人无远虑,必有近忧 1726

软件单元测试

一旦发现错误,就知道错误的性质和位置,调试代价较低;若发现对某个函数进行测试时,需要做大量的桩代码来做输入的模拟,或者检查输出时需要检查的都是其他模块中的信息,则说明对应函数的耦合度太高,需要考虑将对应函数的功能和其他模块剥离,其他模块提供的数据作为函数的参数输入,函数参数或返回值输出结果,其他模块从函数外部获取对应的数据。单元测试的目的是对函数功能的测试,所以测试时并不是需要对所有函数进行测试,需要进行选择,如果对应的函数中有较为复杂的逻辑代码,则必须测试,如果函数中基本上没有什么逻辑,则没有必要测试。

MusicScore的博客 1408

软件测试学习DAY16

今天的内容就是对于这几天的悟空CRM项目的测试进行总结以及完成了测试报告的编写。 对于测试报告的编写要注意的点有: • 测试人员关注失效,客户才能关注成功 • 测试人员关注成功的角度不同——失效 • 最终目的还是为软件质量提供保障 • 什么是“完备”的测试 • 完备测试的概念是有各种不同涵义的 • 完备测试必须根据情况被恰当定义 • 事不关己、高高挂起? • 直觉? • 把直觉当做指南,但不能用做合理性证明。 • 关于规格说明书 • 显式和隐...

see_y的博客 233

相机光学(三十八)——VCM(Voice Coil Motor)音圈马达

VCM(Voice Coil Motor)音圈马达全称Voice Coil Montor,电子学里面的音圈电机,是马达的一种。因为原理和扬声器类似,所以叫音圈电机,具有高频响、高精度的特点。其主要原理是在一个永久磁场内,通过改变马达内线圈的直流电流大小,来控制弹簧片的拉伸位置,从而带动上下运动。手机摄像头广泛的使用VCM实现自动对焦功能,通过VCM可以调节镜头的位置,呈现清晰的图像。弹片式结构滚珠式结构摩擦式结构Open loop开马达Close loop闭环马达。

图像学习之旅 7224

别再用Excel画波特图了!用LTspice免费仿真软件,5分钟搞定电路传递函数分析

本文介绍了如何利用LTspice免费仿真软件高效绘制波特图,解决传统Excel绘图效率低、精度不足的问题。通过详细的操作步骤和实战案例,展示LTspice在电路传递函数分析中的自动化计算、专业级精度和完整特性展示等优势,帮助工程师快速完成频率响应分析。

weixin_42524226的博客 462

如何保证测试的完备性?

经验法则如下:1 测试人员参与需求评审,需求人员参与测试用例的评审不懂需求,不了解需求的测试人员是不可能设计出完备的测试用例的。测试人员参与需求评审一是可以评审需求的可测试性,二是了解需求。  需求人员评审测试用例可以检验用例的完备性,判断测试人员是否理解了需求。2 系统测试用例覆盖每一个场景场景是在需求中描述的用户使用系统的一条操作路径。覆盖每个场景是系统测试用例设计的基本要求。3 集成测试用例

麦哲思科技 4723

KEITHLEY 2182A + 6220/6221 系列测试系统软件

6221型与2182A型相结合,是业界最完整的差分电导测量解决方案

业余程序员小徐的博客 2990

如何保证测试的完备性

人工测试 如何保证测试的完备性?经验法则如下: 1、测试人员参与需求评审,需求人员参与测试用例的评审 不懂需求,不了解需求的测试人员是不可能设计出完备的测试用例的。测试人员参与需求评审一是可以评审需求的可测试性,二是了解需求。 需求人员评审测试用例可以检验用例的完备性,判断测试人员是否理解了需求。 2、系统测试用例覆盖每一个场景 场景是在需求中描述的用户使用系统的一条操作路径。覆盖每个场景是系统测...

Jonathan的博客 5826

基于PlatformIO与CMSIS的STM32库函数开发实战:从环境搭建到外设驱动

本文详细介绍了基于PlatformIO与CMSIS的STM32库函数开发实战,从环境搭建到外设驱动实现。通过对比传统IDE,PlatformIO结合CMSIS框架在跨平台开发、代码可移植性和调试体验上更具优势。文章包含PlatformIO.ini配置详解、GPIO/USART驱动开发实例及常见问题解决方案,帮助开发者高效完成STM32项目开发。

weixin_29190169的博客 424

LangGraph 实战教程:搭建一个智能办公多Agent协作平台

只存储必要的信息:不要把所有的原始数据都存储在状态中,比如销售数据可以存储在数据库或向量数据库中,状态中只存储数据的 ID 或摘要。使用类型提示:避免类型错误,提高代码的可维护性。支持增量更新:LangGraph 默认支持状态的增量更新(通过reduce函数),比如messages列表可以通过追加新消息的方式更新,而不是每次都重新创建整个列表。Normal Edge 的定义非常简单,只需要在StateGraph对象(稍后会详细讲解)上调用add_edge# 创建一个 StateGraph 对象。

SuperAGI2025 222

关于算法单元测试的思考

1 算法逻辑繁杂,很多时候单元测试的逻辑没有完全覆盖的时候就会感觉有些心慌,不踏实。 2 如果仅仅从总体入口进入数据,有些逻辑触发起来比较麻烦,如何快捷的覆盖关键点和达到整体覆盖?       我的想法是阻断上层的逻辑,分步的测,为了测试可以直接给中间计算过程中得出的变量赋值,来触发一些不容易覆盖到的逻辑。测试完后把这些打桩语句删除即可。回归和集成测试的时候就不用考虑这么多了,但

学而不思则罔 思而不学则殆 940

【Flink】FlinkSQL如何触发执行计算

Table (通过 StatementSet.addInsert() 输出给某个 Sink)和 INSERT 语句 (通过调用 StatementSet.addInsertSql())会先被缓存到 StatementSet 中,StatementSet.execute() 方法被调用时,所有的 sink 会被优化成一张有向无环图。该方法是用来将一个表的内容插入到目标表中,一旦该方法被调用, TABLE API 程序立即被翻译。该方法是用来执行一个 SQL 语句,一旦该方法被调用, SQL 语句立即被翻译。

一杯咖啡半杯糖的博客 1007

什么是单元测试?如何做好单元测试?

在正式开始今天的话题之前,我先给你分享一个工厂生产电视机的例子。 工厂首先会将各种电子元器件按照图纸组装在一起构成各个功能电路板,比如供电板、音视频解码板、射频接收板等,然后再将这些电路板组装起来构成一个完整的电视机。 如果一切顺利,接通电源后,你就可以开始观看电视节目了。但是很不幸,大多数情况下组装完成的电视机根本无法开机,这时你就需要把电视机拆开,然后逐个模块排查问题。 假设你发现是供电...

chen__an的博客 6974

第38节:cesium 风场效果(含源码+视频)

cesium 风场效果

qq_29384639的博客 2332

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

cmake应用:集成gtest进行单元测试

编写代码有bug是很正常的,通过编写完备的单元测试,可以及时发现问题,并且在后续的代码改进中持续观测是否引入了新的bug。对于追求质量的,为自己的代码编写全面的单元测试是必备的基础技能,在编写单元测试的时候也能复盘自己的代码设计,是提高代码质量极为有效的手段。本文主要介绍以下几个方面的内容:1、何为单元测试2、何为gtest3、怎么使用gtest4、怎么运行测试一 单元测试是什么?单元测试(Unit Testing),一般指对软件中的最小可测试单元进行检查和验证。

q—qun1150305204的博客 2079

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

单元测试优化的实践Generative Testing

首先为什么要写单元测试? “满足需求”是所有软件存在的必要条件,单元测试一定是为它服务的。从这一点出发,我们可以总结出写单元测试的两个动机:驱动(如:TDD)和验证功能实现。另外,软件需求“易变”的特征决定了修改代码成为必然,在这种情况下,单元测试能保护已有的功能不被破坏。 基于以上两点共识,我们看看传统的单元测试有什么特征? 基于用例的测试(By Example) 单元测试最常见的套...

拿Q 469

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

单元测试(一):基础

单元测试单元测试概述设计单元测试用例单元测试用例的“输入数据”类型单元测试用例的“预计输出”类型驱动代码,桩代码和 Mock 代码评估单元测试测试完备性评估代码覆盖率评估覆盖角度评估 单元测试概述 单元测试的定义 单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作。 单元测试的测试对象: 在结构化编程中,单元测试对象指:函数 在面向对象编程中,单元测试对象指:类。但以类作为测试对象,复杂性高,可操作性差,所以仍然主张以类中的方法作为测试对象,也可以用一个测试类来组织某

维维的博客 1437

重拾单元测试

对于研发同学来说,写单测的目的不在于应付差事,也不在于看那覆盖率一点点的上涨来蒙蔽自己的双眼,设置覆盖率卡点阻止提测,也不在于硬逼你完成单测的任务,核心目标只是为了让我们的项目生命周期更长,这些单测也就是项目组的财富。

software_test010的博客 1076

什么是单元测试

理解概念 1、单元测试的概念理解 单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类。 一个工厂生产电视机的例子。如果把电视机的生产、测试和软件的开发、测试进行类比,你可以发现: 电子元器件就像是软件中的单元,通常是函数或者类,对单个元器件的测试就像是软件测试中的单元测试; 组装完成的功能电路板就像是软件中的模块,...

本末实验室 5901

单元测试与Mock

​ 本期给大家带来的是单元测试的相关内容。单元测试是软件开发中非常重要的一个环节,执行一个完备的单元测试方案能够提高整个开发过程的时间效率。确保软件的实际功能与详细设计说明的一致,使软件开发的效率和软件产品的质量得到最好的保障。

爱学习的Mr 陈 1686

[译]优良单元测试的特点

单元测试类似一种强大的魔法,不恰当的使用则可能浪费大量的时间,给项目带来严重的损害。如果单元测试写得很差、且没有得到很好的应用的话,很容易让你花费大量的时间维护和调试这些测试代码,以至影响到生产代码和整个项目。 我们必须避免发生此类情况。记住,进行单元测试的首要原因是让一切更简单。还好,只要遵循几条简单的指引就能够在项目中避免这些麻烦。 优良的单元测试具有以下的特点:简称为 A-TRIP。 ...

博学、审问、慎思、明辨、笃行 543

单元测试

了解单元测试概念什么叫单元测试?单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。Java里可测试单元单元——>java类单元测试的意义软件质量最简单、最有效的保证;是目标代码最清晰、最有效的文档;可以优化目标代码的设计;是代码重构的保障;是回归测试和持续集成的基石。最后才修改一个 bug 的代价是在bug产生时修改它的代价的10倍!TDDTDD是测试驱动开...

weixin_43706468的博客 6856

高质量的单元测试 & Spock单元测试框架详讲

文章目录方法篇为什么需要单元测试单元测试的定义单元测试与其他测试的区别单元测试的作用关于单元测试的成本如何写好单元测试什么场景适合单元测试单元测试的粒度关于TDDTDD的三定律实操篇spock的介绍引入spock 2.x 版本spock 1.x 版本(推荐)Blocks用expect替换 when & thenwhereMOCKmock 对象的构造简单的返回值mock链式mock异常mock复杂逻辑mockmock & spy & stubmock static method (2.

Buynow_Zhao的博客 2851
上一篇: 代码在进步?
下一篇: 金猪?土猪?火猪?
eyejavaeye
博客等级 码龄20年 74粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值