在谈论单元测试时,“ DAMP not DRY”是什么意思?

如何解决在谈论单元测试时,“ DAMP not DRY”是什么意思?

| 我听说有人说单元测试(例如nUnit,jUnit,xUnit)应该是   潮湿不干燥 (例如,单元测试应包含\“阻尼代码\”而不是\“干燥代码\”) 他们在说什么?     

解决方法

        这是平衡,而不是矛盾 DAMP和DRY并不矛盾,而是它们平衡了代码可维护性的两个不同方面。可维护的代码(易于更改的代码)是这里的最终目标。 DAMP(描述性和有意义的短语)提高了代码的可读性。 要维护代码,您首先需要了解代码。要理解它,您必须阅读它。考虑一下您花多少时间阅读代码。很多。 DAMP通过减少阅读和理解代码所需的时间来提高可维护性。 DRY(不要重复自己)可提高代码的正交性。 删除重复项可确保系统中的每个概念在代码中都有一个权威的表示。对单个业务概念的更改导致对代码的单个更改。 DRY通过将更改(风险)仅隔离到系统中那些必须更改的部分来提高可维护性。 那么,为什么重复测试在测试中更容易接受? 测试通常包含固有的重复,因为它们一次又一次地测试同一件事,仅使用稍微不同的输入值或设置代码进行测试。但是,与生产代码不同,此复制通常仅隔离到单个测试夹具/文件中的方案。因此,重复操作是最少且显而易见的,这意味着与其他类型的重复操作相比,它对项目造成的风险较小。 此外,消除这种重复会降低测试的可读性。以前在每个测试中重复的细节现在隐藏在某些新方法或类中。为了获得测试的全貌,您现在必须在精神上将所有这些部分放在一起。 因此,由于测试代码重复通常带来较少的风险,并提高了可读性,因此很容易看到它如何被接受。 原则上,在生产代码中偏爱DRY,在测试代码中偏爱DAMP。两者同等重要,但只要稍加一点智慧,您就可以平衡自己的利益。     ,           DAMP-描述性和有意义的短语。 \“ DAMP not DRY \”重视代码重复使用的可读性。在测试用例中使用DAMP而不是DRY的想法是,测试应该易于理解,即使这意味着测试用例有时具有重复的代码。 另请参见单元测试中重复的代码是否容忍得多?对于这种观点的优点进行一些讨论。 它可能是Jay Fields在领域特定语言方面创造的。     ,        \“ DRY \”是\“不要重复自己\” 这是一个用来告诉人们编写可重复使用的代码的术语,这样您就不必一次又一次地编写类似的代码。 \“ DAMP \”是\“描述性和有意义的短语\”。 该术语旨在告诉您编写可以被看过它的人容易理解的代码。如果遵循此原则,则将具有描述性长的变量和函数名称等。     ,        Damp =“描述性和有意义的短语”-您的单元测试应该能够被“读取”:   可读性比   避免冗余代码。 从文章:   DAMP代表“描述性和有意义的短语”,与DRY相反,并不是说“一切看起来都像垃圾堆,无法阅读”,因为可读性比避免冗余代码更重要。      这是什么意思,在哪里使用?   DAMP主要在编写测试代码时适用。测试代码应该很容易理解,以至于可以接受一些冗余。     ,        DAMP代表“描述性和有意义的短语”,与DRY相反,并不是说“一切看起来都像垃圾堆,无法阅读”,因为可读性比避免冗余代码更重要。 http://codeshelter.wordpress.com/2011/04/07/dry-and-damp-principles-when-developing-and-unit-testing/     ,这里已经有几个答案,但是我想添加另一个答案,因为我认为他们不一定尽力解释。 DRY(不要重复自己)的想法是,在您的应用程序代码中,您要避免冗余或保护性代码。如果您的代码需要多次执行某些操作,则应为其提供函数或类,而不要在多个位置重复类似的代码。 这是一个众所周知的编程概念。 DAMP(描述性和有意义的短语)适用于您的单元测试。这里的想法是,您的单元测试方法名称应长而具描述性-实际上是简短的句子,描述您要测试的内容。 例如:
testWhenIAddOneAndOneIShouldGetTwo() { .... }
当您读取这样的DAMP方法名称时,您应该完全了解测试编写者试图达到的目标,甚至不必阅读测试代码(尽管测试代码当然也可以使用这个概念,但使用冗长的变量名,等等)。 这是可能的,因为单元测试方法具有非常特定的输入和期望的输出,因此DAMP原理对其非常有效。主应用程序代码中的方法不太可能具体到足以保证这样的名称,特别是如果您已牢记DRY原理编写了该方法。 DAMP和DRY并不矛盾-它们涵盖了代码编写的不同方面-但是尽管如此,它们通常不一起使用,因为牢记DRY原理编写的方法将是通用的,并且不太可能适合高度特定的方法名称。因此,通常,如上所述,您的应用程序代码应为DRY,而单元测试代码为DAMP。 我希望这有助于更好地解释它。     ,        我同意克里斯·爱德华兹(Chris Edwards)的观点,即您需要在两者之间取得平衡。要注意的另一件事是,如果试图删除重复项而最终在单元测试代码中添加了许多其他结构(即,将DRY发挥到极致),则可能会在其中引入错误。在这种情况下,您要么必须对单元测试进行单元测试,要么不对结构进行测试。     ,        我不想在这里重复这些工作,但是您可以使用DAMP的测试,但可以受益于DRY。另一方面,DRY测试在某些情况下不能满足DAMP测试。 我已经写了有关DRY vs DAMP的博客,其中包括一些示例。 两种方法都不是您唯一的解决方案,有时DAMP会显得过大,有时则是非常好的选择。 作为一般规则,应应用三个规则。如果您第三次发现重复,可能值得研究编写DAMP样式测试,但是即使如此,并非所有重复都是不好的。上下文很重要。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-