首页 / 知识
关于不可知的语言:什么是好的单元测试?
2023-04-15 06:31:00

What Makes a Good Unit Test?我敢肯定,你们中的大多数人都在编写大量的自动化测试,并且在进行单元测试时也遇到了一些常见的陷阱。 我的问题是,您是否遵循任何编写测试的行为准则,以避免将来出现问题? 更具体而言:好的单元测试的特性是什么?如何编写测试? 鼓励与语言无关的建议。 让我首先插入源代码-使用JUnit用Java进行实用单元测试(也有一个带有C#-Nunit的版本..但是我有这个版本。.在很大程度上与它无关。建议。) 好的测试应该是一次旅行(首字母缩略词不够粘稠-我在书中有一份速查表的打印输出,为了确保我理解正确,我不得不将其抽出。)
2010-08更新:
除此之外,其他大多数都是减少低效益工作的准则:例如"不要测试您不拥有的代码"(例如第三方DLL)。不要去测试吸气剂和吸气剂。留意成本效益比或缺陷概率。 这里的大多数答案似乎都是针对一般的单元测试最佳实践(何时,何地,为什么以及什么),而不是实际编写测试(如何)。由于问题似乎在"如何"部分上非常具体,因此我认为应该从我在公司进行的"棕色袋子"演示文稿中发布。 Womp的五项写作定律: 1.使用描述性长的测试方法名称。
2.以"编配/执行/声明"样式编写测试。
3.始终向您的断言提供失败消息。
4.评论测试的原因–业务假设是什么?
5.每个测试都必须始终还原其接触的任何资源的状态
牢记这些目标(改编自Meszaros的xUnit Test Patterns)
一些使这更容易的事情:
不要忘记,您也可以使用xUnit框架进行集成测试,但要将集成测试和单元测试分开 测试应隔离。一种测试不应依赖于另一种。更进一步,测试不应依赖外部系统。换句话说,请测试您的代码,而不是代码所依赖的代码。您可以在集成或功能测试中测试这些交互。 出色的单元测试的一些属性:
@Alotor:如果您建议一个库仅在其外部API上进行单元测试,那么我不同意。我想要每个类的单元测试,包括我不公开给外部调用者的类。 (但是,如果我觉得需要为私有方法编写测试,则需要重构。) 编辑:关于"每个测试一个断言"引起的重复的评论。具体来说,如果您有一些代码来设置场景,然后想要对其进行多个声明,但每个测试只有一个声明,则可以在多个测试之间复制设置。 我不采取这种方法。相反,我针对每种情况使用测试夹具。这是一个粗糙的例子:
您所追求的是描述被测类的行为。 基本目的是增强您对课堂行为的信心。 这在查看重构代码时特别有用。 Martin Fowler在他的网站上有一篇有趣的文章,关于测试。 HTH。 干杯, 抢 测试最初应该失败。然后,您应该编写使它们通过的代码,否则,您将冒编写有漏洞且始终通过的测试的风险。 好的测试需要维护。 我还没有弄清楚如何在复杂的环境中执行此操作。
当您的代码库开始覆盖时,所有教科书都开始脱胶
好的架构可以控制一些交互爆炸,但不可避免的是 这是您必须权衡的地方:
您还需要确定: 您将测试用例存储在代码库中的什么位置?
我可以永远继续下去,但是我的意思是: 测试必须是可维护的。 我喜欢上述实用单元测试书中的Right BICEP缩写:
我个人认为,可以通过检查是否得到正确的结果(在加法函数中1 + 1应该返回2),尝试所有可以想到的边界条件(例如使用两个数字之和来求和),可以走得很远。大于add函数中的整数最大值),并强制出现错误条件,例如网络故障。 我在《 MSDN杂志》的这篇文章中介绍了这些原则,我认为这对于任何开发人员来说都是重要的。 我定义"良好"单元测试的方式是,它们是否具有以下三个属性:
杰伊·菲尔德斯(Jay Fields)在编写单元测试方面有很多很好的建议,并且他在帖子中总结了最重要的建议。您将在此处看到,您应该认真考虑自己的情况,并判断建议是否对您有价值。您可以在此处获得大量令人惊奇的答案,但是由您决定哪个最适合您的情况。尝试一下,如果气味难闻,请进行重构。 亲切的问候 我第二次回答" A TRIP",只是测试应该相互依赖!!! 为什么? 干-不要重复自己-也适用于测试!测试相关性可以帮助1)节省设置时间,2)节省夹具资源,3)查明故障。当然,仅考虑到您的测试框架支持一流的依赖关系。否则,我承认,它们是不好的。 跟进http://www.iam.unibe.ch/~scg/Research/JExample/ 永远不要认为琐碎的2行方法会起作用。编写快速的单元测试是防止遗漏的空测试,放负号和/或细微的范围错误咬住您的唯一方法,这是不可避免的,因为与现在相比,处理时间更少了。 考虑一下这两种测试,并以不同的方式对待它们-功能测试和性能测试。 分别使用不同的输入和指标。您可能需要针对每种类型的测试使用不同的软件。 我使用Roy Osherove的单元测试命名标准描述的一致的测试命名约定。给定测试用例类中的每个方法都具有以下命名方式MethodUnderTest_Scenario_ExpectedResult。
每个部分均使用上驼峰式保护套,并由得分下限分隔。 当运行测试时,按测试方法的名称对测试分组是很有用的。并且有一个约定允许其他开发人员了解测试意图。 如果被测方法已重载,我还将参数附加到方法名称上。
通常,单元测试基于模拟对象或模拟数据。
关键是要避免重播所有内容以便能够测试每个功能。
|
最新内容
相关内容
linux汇编语言命令?
linux汇编语言命令?,系统,地址,代码,数据,网络,平台,平均,位置,灵活,工作,汇编语言指令的基本格式是什么1、有以下几种基本格式:标号,又称为指令linux命令是什么语言?
linux命令是什么语言?,系统,环境,代码,传播,管理,语言,操作系统,源码,自由,部分,dos和linux的命令行里面用的是什么语言?1、DOS/Windows/Linuxlinux改语言命令行?
linux改语言命令行?,系统,环境,工具,密码,概念,地方,软件,通信,管理,国际,linux命令行下怎样改变语言将内容改为:LANG=zh_CN.UTF-8LANGUAGE=zh_linux命令行c语言?
linux命令行c语言?,代码,系统,工具,环境,工作,保险,发行,命令,文件,终端,linux终端下如何进行C语言编译1、在Linux下面,如果要编译一个C语言源c语言在linux命令?
c语言在linux命令?,系统,工作,管理,命令,保险,基础,环境,信息,文件,语言,linux系统的命令是什么linux常用命令有pwd命令、cd命令、ls命令、catlinux编写c语言命令?
linux编写c语言命令?,系统,基础,环境,代码,盘面,保险,百度,情况,数据,工具,在Linux系统中,如何运行一个C语言程序?编译。由.c文件生成.o文件,写linux改变语言命令?
linux改变语言命令?,系统,管理,网上,官方网站,情况,服务,中文,语言,命令,终端,linux命令行下怎样改变语言将内容改为:LANG=zh_CN.UTF-8LANGUAGEc语言编译linux命令?
c语言编译linux命令?,代码,工具,环境,系统,基础,保险,百度,语言,源程序,文件,Linux中,运行一个C语言程序如何运行1、编译。由.c文件生成.o文件linux常用命令语言?
linux常用命令语言?,工作,地址,系统,信息,命令,目录,标准,管理,工具,服务,linux常用命令linux系统常用操作命令如下:ls:全拼list,功能是列出目录r语言命令行写linux?
r语言命令行写linux?,环境,数据,系统,工具,简介,官网,语言,报告,软件,发展,如何在linux环境下使用r语言是的,可以在Linux系统上安装RStudio。 Rlinux语言查找命令行?
linux语言查找命令行?,系统,工作,位置,标准,地址,信息,命令,管理,时间,文件,在linux命令行下如何查找显示/etc/passwd文件中包含root的行如何Python编程语言的优缺点
Python编程语言的优缺点,代码,网站,航空,管理系统,培训,系统,概念,网络,基础,机器人,Python是一种编程语言,它的名字来源于一个喜剧。是由Guid