Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >公司最大的内卷,偷偷做单元测试

公司最大的内卷,偷偷做单元测试

原创
作者头像
陈哥聊测试
发布于 2024-08-23 02:13:30
发布于 2024-08-23 02:13:30
1440
举报
文章被收录于专栏:陈哥聊测试陈哥聊测试

一位读者在看过我的《理解这八大优势,才算精通单元测试后,问我:知道单元测试有好处,但实在没空写。看完文章后又想重新落实一下,有没有啥写好单元测试的技巧?

这位读者绝对不是第一个和我抱怨单元测试的人。这很好理解,中国互联网公司太多太卷,想要抢夺市场就要推出不同功能,而这些压力一部分落在了程序员身上,拼命赶需求。单元测试这种费力不讨好的事情,自然而然就没有人做。

就我多年的经验来看,写单元测试其实不会拖延项目,反而能够加快功能研发进度。单元测试的好处我就不在这里赘述了,只有真正尝试过的人才能理解。

马克·吐温曾说:“取得成功的秘诀就是开始”。本篇文章想和大家分享一下写好单元测试的技巧,希望可以给大家带来新方向。

单元测试技巧-1
单元测试技巧-1

一、单元测试的注意事项

单元测试是为了让我们快速查找并隔离损坏的代码片段。正因如此,这些函数和类在测试时不应该依赖于mock(模拟)和stub(存根)以外的其他元素。在测试中,如果试图覆盖的逻辑过于复杂,就难以确保覆盖的可靠性,也难以准确找出失败的原因。

因此,我们要注意单元测试包括以下几点。

01 简洁性

短函数更容易阅读和理解。我们每次只测试一个逻辑点,因此测试代码应该控制在几行之内。但如果是高级逻辑可能具有多个依赖项,这就需要大量样板代码来初始化模拟和存根。此外,单元测试同样适用DRY原则(Don’t repeat yourself,一次且仅一次),我们在写单元测试时要避免到处复制粘贴混乱的代码,最好使用组合而不是继承。

爱因斯坦曾说:“当你在生活中感到困顿时,也许是你把事情复杂化了。”所以,当我们对单元测试产生困惑时,也许是因为我们在单元测试中使用复杂的逻辑。注意一点:单元测试的目的在于测试代码,不要让单元测试本身也成为测试的一部分。

02 明确性

单元测试要使用详尽的长名称。这样的名称不仅能清楚表达信息,还能起到索引作用、快速定位相应测试。就算需求发生变化,我们只需要针对相应的测试进行更改,不必查看所有内容并检查受影响的内容。

好的单元测试一般只有一个断言,因此命名起来也很容易。例如,在处理金额计算时,it('should return 0 for an empty cart')要比it('works for 0')或者 it('empty cart')好得多。对于使用函数名称作为测试名称的框架也是如此,shouldReturnZeroForAnEmptyCart就是一个很不错的的命名。

正如丁玲所言:“人生就像爬坡,要一步一步来。”单元测试也是如此,不要一次性测试整个方法,要一步一步来。 我们只针对单个需求写单元测试,代码就会变得易于阅读和维护。

03 可维护性

测试框架需要提供各种断言方法。它们提供不同的方法来检查结果,并且当断言失败时,它们还会显示更具体的错误消息,从而提供更多上下文来查看错误所在。

例如,

代码语言:clike
AI代码解释
复制
expect(result === expected).toBeTruthy();

将会失败

代码语言:clike
AI代码解释
复制
expect(received).toBeTruthy()
Received: false

尽管

代码语言:clike
AI代码解释
复制
expect(result).toBe(expected);

将提供更多有关具体失败原因的信息:

代码语言:clike
AI代码解释
复制
expect(received).toBe(expected) // Object.is equality
Expected: "John Doe"
Received: "JohnDoe"

框架还为不同的测试方式提供了各种断言。例如,在使用Jest进行测试时,toBe使用Object.is测试是否完全相等,而toEqualtoStrictEqual则深入比较对象,确保他们的类型和结构一致。

为了判断浮点数是否相等,我们需要采用一种特殊的匹配器,这种匹配器能够忽略由于浮点数在内存中的表示方式导致的微小舍入误差。在Jest中,匹配器是toBeCloseTo。虽然toEqual有时也能适用,但即使是看似简单的测试,如expect(0.1+0.2).toEqual(0.3)也可能无法通过。

单元测试技巧-2
单元测试技巧-2

二、单元测试的AAA原则

遵循AAA原则(Arrange、Act、Assert,安排、执行、断言),可以娴熟提升单元测试代码的清晰度、可靠性和可维护性。

第一步,安排阶段(Arrange)。 我们需要完成变量赋值、对象实例化对象以及测试运行所需的其余前置设置,并且定义预期结果。这样做的好处在于:一方面,我们需要在执行测试逻辑前就有明确预期;另一方面,这更方便在输入数据后立即查看预期输出,有助于避免代码混淆。

第二步,执行阶段(Act)。 我们将执行测试函数并存储其结果。结果存储其实是准备工作的自然延伸,有助于我们对结果进行回顾总结。

第三步,断言阶段(Assert)。 我们在这个阶段可以判断假设的正确性了。这正是单元测试的核心所在,因为这一环节实际上是对某些具体内容的测试。其目的在于是检查实际得到的结果否与预期结果相匹配。

我们要确保代码可靠性,避免错误输入、缺少参数、空数据、调用函数中的异常等情况的出现。代码覆盖率工具可以帮助我们查漏补缺,找到未测试的代码分支。我们要始终明确我们单元测试的目标,过于追求100%测试覆盖率反而会让单元测试代码越来越繁杂。这与《吕氏春秋》中的论点不谋而合:“不知轻重,则重者为轻,轻者为重矣。若此,则每动无不败”。

单元测试-3
单元测试-3

三、单元测试的优化和维护

为了提高单元测试效率,我们需要模拟所有可能影响速度的外部依赖项,例如API调用、数据库文件系统访问。我们在写单元测试时,应尽量避免线程休眠、等待和超时。如果必须设置超时,就应该将其缩短至几毫秒。在处理多线程或异步竞争条件时,精确控制出发条件比简单的等待要有效得多。

单元测试应当确保不会改变作用域外的任何内容。 如果测试仅在按照特定顺序执行时才能成功,这可能表明测试用例或测试代码存在问题。每个测试用例应独立运作。由于现代测试框架默认并行执行测试,因此我们不应依赖全局变量或之前测试的遗留效应。这也是全局变量常被视为不良编程习惯的原因之一,这会隐藏真正的依赖关系,导致代码耦合度升高,并在处理多线程问题时需要格外留意。

当测试需要复杂的重复配置时,应利用框架提供的设置和清理功能。这些功能保障了在每个测试用例或整个测试套件开始前后,相关代码能够得到执行。这样,无论是单独运行测试还是作为测试套件的一部分,都能确保测试结果的确定性,执行顺序不会对测试结果造成影响。

四、单元测试贵在坚持

《荀子·大略》:“夫尽小者大,积微成著,德至者色泽洽,行尽而声问远。”单元测试的作用只有经过长期积累才会变得显著。 其实,写单元测试更多的是对自己的代码负责。有测试用例的代码,别人更容易看懂,以后别人接手你的代码时,也可能放心做改动。

根据上述方法开始行动,单元测试也不是什么难事,毕竟“世上无难事,只怕有心人”。我发现关于单元测试有很多读者感兴趣,还有人曾问我单元测试到底该由测试进行还是开发进行。如果大家感兴趣,我也可以写一篇文章和大家简单分享一下。

*参考文章:Andriy Obrizan,How to Write Good Unit Tests: 14 Tips

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LLM Agent和 Agentic RAG 的最佳综述
代理式检索增强生成(Agentic RAG)通过在RAG管道中嵌入自主代理,代表了人工智能领域的重大飞跃。本仓库补充了综述论文《代理式检索增强生成(Agentic RAG):综述》,提供了以下方面的见解:
致Great
2025/01/22
4780
LLM Agent和 Agentic RAG 的最佳综述
深入浅出智能工作流(Agentic Workflow)|技术干货
著名 AI 学者、斯坦福大学教授吴恩达提出了 AI Agent 的四种设计方式后,Agentic Workflow(智能体工作流)立即火爆全球,多个行业都在实践智能体工作流的应用,并推动了新的 Agentic AI 探索热潮。
Botnow
2024/09/18
1.4K0
深入浅出智能工作流(Agentic Workflow)|技术干货
当AI创业公司遇困境,能借“Agent化”找到新出路吗?
编者按:以变革应对变局,以远见超越未见。适道、大象新闻、大象财富联合腾讯新闻、腾讯科技,推出2024年终策划《变局之下》,回望2024、展望2025,让洞见穿越时间,向未来寻求确定。
小腾资讯君
2025/01/10
5400
Agentic AI 要终结数据库和 SaaS?大厂掌门人公开互撕,焦虑的 CEO 们押上了不同的技术路线
无论是大模型厂商、AI 初创公司,还是企业级应用团队,几乎都在讨论“多智能体协作”“自动化决策流程”以及“具备工具调用能力的 AI 系统”。
深度学习与Python
2025/05/13
1530
Agentic AI 要终结数据库和 SaaS?大厂掌门人公开互撕,焦虑的 CEO 们押上了不同的技术路线
什么是智能工作流?模式、应用案例、示例及更多
AI 智能体、智能化 AI、智能化架构、智能化工作流。智能体(Agents)无处不在。但它们到底是什么?它们真的能做些什么吗?
AgenticAI
2025/04/01
7250
什么是智能工作流?模式、应用案例、示例及更多
Agentic AI及其设计模式简介
微软推出 AI 代理,加深与 Salesforce 的竞争;这家总部位于华盛顿州雷德蒙德的软件制造商,周一表示,将推出 10 个自治agent,代表销售、客户支持和会计等领域的人员完成任务。
AIGC新知
2024/12/25
4710
Agentic AI及其设计模式简介
一文读懂 Agentic RAG 技术点滴
Hello folks,我是 Luga,今天我们来聊一下人工智能应用场景 - 提升大型语言模型(LLMs)的知识获取和生成能力的 Agentic RAG(智能增强检索生成)技术。
Luga Lee
2025/04/04
3660
一文读懂 Agentic RAG 技术点滴
Agent:数字代理的崛起与未来
在ChatGPT引发的人工智能热潮中,我们亲眼见证了AI应用形态的戏剧性演变。回想2022年底,当人们首次体验ChatGPT时,那种震撼感仍历历在目——一个能够理解复杂问题并提供流畅回答的聊天机器人(chatbot),彻底改变了我们对机器智能的期望。这种应用形态——我们姑且称之为"对话式AI"——本质上是大语言模型(LLM)应用的初级表现形式,一种简单的信息交换机制。
立委
2025/03/08
2610
AI Agent:大模型的下一个高地
2023年11月,比尔·盖茨发表了一篇文章,他表示,AI Agent将是大模型之后的下一个平台,不仅改变每个人与计算机互动的方式,还将在五年内彻底改变我们的生活。
科技云报道
2024/01/17
5740
AI Agent:大模型的下一个高地
推理模型升级浪潮下,Agentic RAG 如何借力 DeepSeek 实现知识革命?
王昊奋,同济大学特聘研究员、博导、腾讯云 TVP。研究方向包括知识图谱、自然语言处理、对话问答机器人等。长期在一线人工智能公司担任 CTO 之职。是全球最大的中文开放知识图谱联盟 OpenKG 发起人之一。负责主持多项国家级和上海市 AI 相关项目,发表 100 余篇 AI 领域高水平论文,谷歌学术引用 6100 余次,H-index 达到 31。构建了全球首个可交互养成的虚拟偶像—“琥珀·虚颜”;所构建的智能客服机器人已累计服务用户超过 10 亿人次。目前担任中国计算机学会术语工委副主任,SIGKG 主席,上海秘书长,中国中文信息学会理事,语言与知识计算专委会副秘书长,上海市计算机学会自然语言处理专委会副主任,上海交通大学 AI 校友会秘书长等社会职位。
TVP官方团队
2025/04/11
2680
推理模型升级浪潮下,Agentic RAG 如何借力 DeepSeek 实现知识革命?
【最全总结,建议收藏】一文看懂LLM / 智能体 / 工作流 和 MCP
长期跟踪关注统计学、机器学习算法、深度学习、人工智能、大模型技术与行业发展动态,日更精选技术文章。回复机器学习有惊喜资料。
Ai学习的老章
2025/06/08
5740
【最全总结,建议收藏】一文看懂LLM / 智能体 / 工作流 和 MCP
最新AI Agent万字综述分享!
近日,支付宝百宝箱团队的技术负责人王月凡在 Datawhale 社区带来了 AI Agent 综述分享。从大语言模型的发展历程出发,全面分享了AI Agent现状,包括:AI Agent 出现的原因、构成、核心技术、核心能力、应用场景,以及备受关注的场景落地难点。
Datawhale
2025/01/08
1.8K0
最新AI Agent万字综述分享!
【科普篇】LLM、GPT、AIGC、AI Agent、Agentic AI 到底是个啥?
2024 年可谓是AI 大模型全面开花的一年,各大厂纷纷发布了自己的大模型应用产品,比如:
巫山老妖
2025/06/16
2830
【科普篇】LLM、GPT、AIGC、AI Agent、Agentic AI 到底是个啥?
RAG+AI工作流+Agent:LLM框架该如何选择,全面对比MaxKB、Dify、FastGPT、RagFlow、Anything-LLM,以及更多推荐
MaxKB = Max Knowledge Base,是一款基于 LLM 大语言模型的开源知识库问答系统,旨在成为企业的最强大脑。它能够帮助企业高效地管理知识,并提供智能问答功能。想象一下,你有一个虚拟助手,可以回答各种关于公司内部知识的问题,无论是政策、流程,还是技术文档,MaxKB 都能快速准确地给出答案:比如公司内网如何访问、如何提交视觉设计需求等等
汀丶人工智能
2024/08/05
12.6K0
RAG+AI工作流+Agent:LLM框架该如何选择,全面对比MaxKB、Dify、FastGPT、RagFlow、Anything-LLM,以及更多推荐
一文读懂 Agentic RAG 数据检索范式
众所周知,LLM (大型语言模型)的出现彻底改变了我们与信息互动的传统方式,为信息获取和知识学习带来了全新的途径。然而,纵使这些语言模型拥有惊人的知识容量,但其内部知识库的有限性仍可能导致它们在回答某些复杂问题时存在准确性和深度不足的局限。这便是 RAG(Retrieval Augmented Generation,检索增强生成)技术应运而生的原因。
Luga Lee
2024/11/01
4110
一文读懂 Agentic RAG 数据检索范式
使用Agentic工作流在Python中构建自主系统
随着企业和技术的不断发展,保持领先地位往往意味着寻找更具创新性、更快捷的工作方式。Agentic 工作流应运而生,这是一种革命性的任务自动化方法,使系统能够独立地分析、决策和执行任务。Agentic 工作流不仅仅是另一个技术流行语;它们关乎实现自动化,这种自动化不仅遵循脚本,而且能够实时适应以应对复杂的挑战。
云云众生s
2025/02/05
1430
Agentic RAR+Nano-GraphRAG+Claude 3.7 Sonnet=最强智能推理RAG系统,未来已来!
在这篇文章中,我将向你介绍如何利用 LangGraph、Agentic RAR、Nano-GraphRAG 和 Claude 3.7 Sonnet 创建一个基于智能推理的聊天机器人。阅读完后,你将能够为自己的业务构建一个强大的智能推理聊天机器人。
福大大架构师每日一题
2025/04/15
1130
Agentic RAR+Nano-GraphRAG+Claude 3.7 Sonnet=最强智能推理RAG系统,未来已来!
一文搞懂大模型!基础知识、 LLM 应用、 RAG 、 Agent 与未来发展
LLM 探秘:想要深入了解人工智能界的“新宠”大型语言模型(LLM)吗?本文将带你走进 LLM 的世界,从入门知识到实际应用,全方位解读这个充满魔力的“大模型”。我们将一起揭开 LLM 的神秘面纱,领略其在各个领域的独特魅力。无论你是初学者还是有一定基础的 AI 爱好者,这篇文章都将为你提供宝贵的知识和启发,让你的 AI 之旅更加精彩纷呈!快来加入我们,一起探索 LLM 的奥秘吧!
腾讯云开发者
2024/07/19
6.4K0
一文搞懂大模型!基础知识、 LLM 应用、 RAG 、 Agent 与未来发展
95后打造世界首个行动型浏览器——Fellou,从「浏览」到「行动」一键直达!
得益于自由开放的Web,浏览器成为我们探索数字世界的核心入口,社交、娱乐、信息获取、生产力,它几乎可以承载我们全部的数字生活。
新智元
2025/04/22
5630
95后打造世界首个行动型浏览器——Fellou,从「浏览」到「行动」一键直达!
不用写一行复杂代码,也能构建强大的 AI 代理系统?试试 NVIDIA AIQ Toolkit
NVIDIA 的 AIQ Toolkit(Agent Intelligence Toolkit) 是一个为构建多智能体 AI 系统而设计的开源工具包。它帮助开发者将多个 AI 代理(Agents)整合在一个统一框架下,构建出更智能、更高效、更可管理的 AI 应用程序。以下是基于 NVIDIA 官方博客《Extending the NVIDIA Agent Intelligence Toolkit to Support New Agentic Frameworks》的详细 2000 字介绍。
GPUS Lady
2025/05/12
1460
不用写一行复杂代码,也能构建强大的 AI 代理系统?试试 NVIDIA AIQ Toolkit
推荐阅读
相关推荐
LLM Agent和 Agentic RAG 的最佳综述
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档