如何设计单元测试用例?

🍅点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快

最近一些大公司在进行去测试化的操作,这一切的根源大概可以从几年前微软一刀切砍掉所有内部正式的测试人员开始说起,当时微软内部的测试工程师有一部分转职成了开发工程师,他们的职能中有很大一部分的职责是教会普通开发人员如何进行测试。我们都知道开发人员进行的测试一般以单元测试为主,假如有一天你所在的组织需要你转变成一名测试方面的教练,除了自动化测试之外还需要去推广单元测试,那么你该如何去定义单元测试用例的设计方法论呢?这里给大家一些思路,看看简单的单元测试用例究竟该如何设计。

一个方法可以有任意数量的有效测试用例;它最终取决于方法的结构。有两种简单的方式可以帮助我们设计单元测试用例。

  • 参数方法
  • 执行路径方法

我将通过提供真实的代码来进行演示。所有代码片段都将用 C# 编写,断言将使用我最喜欢的单元测试包 Fluent Assertions。

我们将为以下方法提供测试用例:

public static bool ContainsNamelessItems(this List<Item> items) { return items.Any(item => item.Name.IsNullOrEmpty()) }

此方法将项目集合作为参数。它遍历项目列表,并针对每个项目Item检查其name属性是否为空。如果name存在且不为空,我们返回True,否则我们返回False

使用参数方法创建测试用例

这种方式主要考虑的是入参可以传递哪些值。

查看该方法的参数ContainsNamelessItems,我们有一个List名为items. 此参数可能有几个可能的值:

这些可能的值中的每一个都可以作为单独的用例存在。

以下是一些可能的测试用例和断言:

1,当List<Item>为空时,我们期望返回值是False因为其的List<Item>无name属性。

public void WhenItemsIsEmpty_ReturnFalse() { var items = new List<Item>(); var result = items.ContainsNamelessItems(); result.Should() .BeFalse("because an empty collection cannot contain nameless items"); }

2,当List<Item>包含至少 1 项没有name属性的Item时,我们期望返回值是True

public void WhenItemsContainsANamelessItem_ReturnTrue() { var items = new List<Item> { { new Item { Name = "Item1" }, { new Item { Name = string.Empty } // nameless item }; var result = items.ContainsNamelessItems(); result.Should() .BeTrue("because there is a nameless item in the collection"); }

3,当List<Item>不包含任何没有name属性的项目时,我们期望返回值是False,因为所有项目都有name。

public void WhenItemsDoesNotContainANamelessItem_ReturnFalse() { var items = new List<Item> { { new Item { Name = "Item1" }, { new Item { Name = "Item2" } }; var result = items.ContainsNamelessItems(); result.Should() .BeFalse("because there are no nameless items in the collection"); }

4,当List<Item>isnull的时候,我们期望抛出ArgumentNullException异常,这往往是最难想到的。

public void WhenItemsIsNull_ThrowArgumentException() { List<Item> items = null; Action act = () => items.ContainsNamelessItems(); act.Should() .Throw<ArgumentNullException>("because the collection is null"); }

使用执行路径方法创建测试用例

路径方式需要遍历被测方法并找到所有不同的执行路径。

我们上面定义的方法只有一条执行路径,因为除了直接到达方法的末尾之外,没有任何条件驱动路径。要改变路径,我们就需要引入某种条件,可以通过if...else、 switch以及try/catch语句。在这些条件块中,方法可能会在达到某个条件的情况下直接退出,而不是运行到方法的最后一行。

下面我们就引入条件。假设我们不希望方法在入参为空时候抛出ArgumentNullException异常,而是想抛出一个我们自定义的ArgumentException异常。那么我们必须向检查项目列表是否为空的方法添加一个条件。

流程图如下:

现在,如果项目为空,则有可能提前退出,而不是走到方法的末尾,具体实现如下

public static bool ContainsNamelessItems(List<Item> items) { if (items == null) throw new ArgumentException("The collection of items should not be null."); return items.Any(item => item.Name.IsNullOrEmpty()) }

这个测试用例的相应测试看起来像这样:

public void WhenItemCollectionIsNull_ThrowArgumentException() { List<Item> items = null; Action act = () => items.ContainsNamelessItems(); act.Should().Throw<ArgumentException>() .WithMessage("The collection of items should not be null."); }

总结

在入参的时候可以用等价类的方式构造任意参数,强类型语言里无效类用的会相对少一些,毕竟编译器会进行校验;而弱类型语言里无效类比较隐蔽,是测试的重点;

执行路径方法其实就是分支覆盖,通过不通的输入参数去覆盖所有分支,比如同样是有效类的输入情况下,空集合和非空集合可能会走到不通的路径;

在方法或函数特别复杂的情况下,可以试着去把方法拆小,从而获得更好的可测试性;

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

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

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

相关文章

OneMore智能目录:快速实现OneNote文档导航的终极技巧

OneMore智能目录&#xff1a;快速实现OneNote文档导航的终极技巧 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore 在OneNote文档编辑过程中&#xff0c;为长篇文档添加…

超参数调优策略生成:结合经验规则给出初始建议

VibeThinker-1.5B-APP 技术深度解析&#xff1a;小模型如何实现高阶推理突破 在当前大模型军备竞赛愈演愈烈的背景下&#xff0c;动辄千亿参数、百万美元训练成本的AI系统似乎成了“高性能”的代名词。然而&#xff0c;现实中的许多应用场景并不需要通用智能&#xff0c;而是更…

2026年伸缩臂振动小的厂家推荐、伸缩臂品牌哪家好 - 工业品网

在桩工机械领域,伸缩臂作为旋挖钻机的核心功能部件,其振动控制、品牌实力与合作案例数量直接决定施工效率与工程质量。面对市场上良莠不齐的供应商,如何选择振动小、适配广、案例丰富的伸缩臂厂家?以下是2025年五大…

GetQzonehistory完整指南:3步轻松备份QQ空间珍贵回忆

GetQzonehistory完整指南&#xff1a;3步轻松备份QQ空间珍贵回忆 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 还在担心QQ空间里的青春记忆会随着时间流逝而消失吗&#xff1f;GetQzo…

【生产环境必备】:Docker容器状态监控的8个黄金法则,错过等于事故

第一章&#xff1a;Docker容器状态监控的核心意义在现代云原生架构中&#xff0c;Docker容器作为应用部署的基本单元&#xff0c;其运行状态直接影响服务的可用性与性能。对容器进行持续的状态监控&#xff0c;不仅有助于及时发现异常进程、资源瓶颈或潜在故障&#xff0c;还能…

Scroll Reverser:macOS滚动方向个性化控制终极指南

Scroll Reverser&#xff1a;macOS滚动方向个性化控制终极指南 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 在macOS系统中&#xff0c;你是否曾为触控板和鼠标的滚动方向无法…

Windows驱动存储管家:Driver Store Explorer彻底解决系统臃肿难题

Windows驱动存储管家&#xff1a;Driver Store Explorer彻底解决系统臃肿难题 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否经常遇到C盘空间莫名消失、系统启动速度逐渐…

无障碍访问改进提案:让残障用户也能顺畅使用

无障碍访问改进提案&#xff1a;让残障用户也能顺畅使用 在人工智能迅速渗透日常生活的今天&#xff0c;我们越来越依赖大模型来完成写作、编程、学习甚至决策。然而&#xff0c;一个常被忽视的事实是&#xff1a;大多数AI系统的设计&#xff0c;默认服务的是“健全用户”——…

全网热议!2025年电缆桥架品牌推荐榜单 - 百誉集团

在2025年,模压桥架的选择和评估标准愈发重要。有效地选择一个厂家需要关注多个方面,包括其生产能力、技术实力以及市场口碑。考虑其历史经验和项目案例能够彰显厂家在行业中的地位。此外,不同厂家在材料选择、产品设…

IntelliJ IDEA 创建 Spring Boot 项目

IntelliJ IDEA 创建 Spring Boot 项目 本文将详细介绍使用 IntelliJ IDEA 搭建 Spring Boot 项目的全过程,包括项目初始化、依赖选择、项目结构说明、依赖配置验证及项目启动,步骤清晰且附关键配置说明。 项目初始化…

如何快速掌握NBTExplorer:Minecraft数据编辑的完整指南

如何快速掌握NBTExplorer&#xff1a;Minecraft数据编辑的完整指南 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer NBTExplorer是一款功能强大的图形化NBT编辑器&a…

GetQzonehistory:一键永久保存你的QQ空间青春回忆录

GetQzonehistory&#xff1a;一键永久保存你的QQ空间青春回忆录 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾经翻看QQ空间时&#xff0c;发现那些承载着青春记忆的说说正在逐…

2026商用智能咖啡机推荐:餐饮连锁、便利店与高奢酒店如何选择? - 品牌2026

在2026年的商业咖啡市场,无论是追求高效稳定的餐饮连锁、需要便捷可靠的便利店,还是注重品质体验的高奢酒店,选择一台专业的智能咖啡机已成为提升运营效率与服务质量的关键。面对多样化的场景需求,CAYE咖爷科技(苏…

南方网通性价比如何?服务质量与全面性深度解析 - 工业设备

在AI营销时代,ToB企业选择智能体解决方案时,性价比服务质量服务全面性是核心考量点。深圳市南方网通网络技术开发有限公司作为深耕19年的AI智能体研发源头厂家,其讯灵AI智能体能否满足企业需求?本文从三大核心问题…

【VSCode后台智能体深度解析】:揭秘Git工作树自动化管理的5大核心技巧

第一章&#xff1a;VSCode后台智能体与Git工作树的协同机制Visual Studio Code&#xff08;VSCode&#xff09;通过其内置的后台智能代理系统&#xff0c;实现了对 Git 工作树状态的实时监控与高效响应。该机制依赖于一个轻量级的文件监听服务&#xff0c;结合 Git 命令行工具&…

Windows驱动管理终极指南:Driver Store Explorer轻松解决系统臃肿问题

Windows驱动管理终极指南&#xff1a;Driver Store Explorer轻松解决系统臃肿问题 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否经常遇到C盘空间莫名消失、系统启动速度…

UE4

navigation 右键--旋转camera 左右 鼠标左键--前后 左右键一起按--上下 standard navigation game style navigation

2026年口碑好的材料试验机公司推荐,专业拉力机/测试机/试验机企业全解析 - myqiye

在工业制造与科研创新的链条中,材料力学性能测试是保障产品质量、推动技术突破的关键环节。从航空航天的高强度合金到医疗器械的生物相容性材料,一台精准稳定的试验机不仅是测量工具,更是品质把控的生命线。面对市场…

【必学收藏】AI代理入门指南:从小白到实战掌握智能代理开发

&#x1f331;入门指南本课程包含涵盖构建AI代理基础知识的课程。每节课都涵盖其自己的主题&#xff0c;因此可以从任何地方开始&#xff01; 课程 AI代理及代理用例介绍 探索AI代理框架 理解AI代理设计模式 工具使用设计模式 代理式RAG 构建可信赖的AI代理 规划设计模式 多代理…

共享经济信任机制:信用评分与奖惩规则设计

共享经济信任机制&#xff1a;信用评分与奖惩规则设计 在今天的共享出行平台&#xff0c;一个新注册的司机刚完成前三单服务&#xff0c;系统就自动将其接单优先级提升至中等水平&#xff1b;而另一位长期用户因连续两次被乘客投诉“绕路”&#xff0c;账户突然收到一条“需完成…