vue 脚手架测试环境_关于单元测试脚手架的几点思考

vue 脚手架测试环境

莱昂:Luc Besson的专业人士

莱昂:Luc Besson的专业人士

当我开始通过创建相同的对象并准备用于运行测试的数据来重复进行单元测试方法时,我对设计感到失望。 带有大量代码重复的长测试方法看起来并不正确。 为了简化和缩短它们,基本上有两个选择,至少在Java中:1)通过@Before@BeforeClass初始化的私有属性,以及2)私有静态方法。 他们俩对我来说都是反面向对象的,我认为还有另一种选择。 让我解释。

JUnit正式建议一个测试装置 :

public final class MetricsTest {private File temp;private Folder folder;@Beforepublic void prepare() {this.temp = Files.createTempDirectory("test");this.folder = new DiscFolder(this.temp);this.folder.save("first.txt", "Hello, world!");this.folder.save("second.txt", "Goodbye!");}@Afterpublic void clean() {FileUtils.deleteDirectory(this.temp);}@Testpublic void calculatesTotalSize() {assertEquals(22, new Metrics(this.folder).size());}@Testpublic void countsWordsInFiles() {assertEquals(4, new Metrics(this.folder).wc());}
}

我认为该测试正在做什么很明显。 首先,在prepare() ,它创建Folder类型的“测试装置”。 在所有三个测试中将其用作Metrics构造函数的参数。 这里要测试的实际类是Metricsthis.folder是我们测试它所需要的。

此测试有什么问题? 有一个严重的问题:测试方法之间的耦合 。 测试方法(以及所有常规测试)必须彼此完全隔离。 这意味着更改一项测试不得影响任何其他测试。 在此示例中,情况并非如此。 当我想更改countsWords()测试时,必须更改before()的内部,这会影响测试“类”中的其他方法。

在充分尊重JUnit的情况下,在@Before@After中创建测试装置的想法是错误的,主要是因为它鼓励开发人员耦合测试方法。

这是我们可以改善测试并隔离测试方法的方法:

public final class MetricsTest {@Testpublic void calculatesTotalSize() {final File dir = Files.createTempDirectory("test-1");final Folder folder = MetricsTest.folder(dir,"first.txt:Hello, world!","second.txt:Goodbye!");try {assertEquals(22, new Metrics(folder).size());} finally {FileUtils.deleteDirectory(dir);}}@Testpublic void countsWordsInFiles() {final File dir = Files.createTempDirectory("test-2");final Folder folder = MetricsTest.folder(dir,"alpha.txt:Three words here","beta.txt:two words""gamma.txt:one!");try {assertEquals(6, new Metrics(folder).wc());} finally {FileUtils.deleteDirectory(dir);}}private static Folder folder(File dir, String... parts) {Folder folder = new DiscFolder(dir);for (final String part : parts) {final String[] pair = part.split(":", 2);this.folder.save(pair[0], pair[1]);}return folder;}
}

现在看起来好点了吗? 我们还没有,但现在我们的测试方法已完全隔离。 如果要更改其中一个,则不会影响其他参数,因为我将所有配置参数都传递给私有静态实用程序(!)方法folder()

一种实用方法,对吗? 是的, 闻起来 。

尽管比以前的设计要好得多,但这种设计的主要问题是它不能防止测试“类”之间的代码重复。 如果在另一个测试用例中需要类似Folder类型的测试治具,则必须将该静态方法移到那里。 甚至更糟的是,我将不得不创建一个实用程序类。 是的,在面向对象的编程中没有什么比实用程序类更糟糕的了。

更好的设计是使用“伪”对象而不是私有静态实用程序。 这是怎么回事。 首先,我们创建一个伪造的类并将其放入src/main/java 。 必要时,此类可用于测试以及生产代码中( Fk表示“伪造”):

public final class FkFolder implements Folder, Closeable {private final File dir;private final String[] parts;public FkFolder(String... prts) {this(Files.createTempDirectory("test-1"), parts);}public FkFolder(File file, String... prts) {this.dir = file;this.parts = parts;}@Overridepublic Iterable<File> files() {final Folder folder = new DiscFolder(this.dir);for (final String part : this.parts) {final String[] pair = part.split(":", 2);folder.save(pair[0], pair[1]);}return folder.files();}@Overridepublic void close() {FileUtils.deleteDirectory(this.dir);}
}

这是我们的测试现在的外观:

public final class MetricsTest {@Testpublic void calculatesTotalSize() {final String[] parts = {"first.txt:Hello, world!","second.txt:Goodbye!"};try (final Folder folder = new FkFolder(parts)) {assertEquals(22, new Metrics(folder).size());}}@Testpublic void countsWordsInFiles() {final String[] parts = {"alpha.txt:Three words here","beta.txt:two words""gamma.txt:one!"};try (final Folder folder = new FkFolder(parts)) {assertEquals(6, new Metrics(folder).wc());}}
}

你怎么看? 它不是比JUnit提供的更好吗? 它不是比实用程序方法更具可重用性和可扩展性吗?

总而言之,我认为单元测试中的脚手架必须通过与生产代码一起提供的伪造对象来完成。

翻译自: https://www.javacodegeeks.com/2015/05/a-few-thoughts-on-unit-test-scaffolding.html

vue 脚手架测试环境

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

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

相关文章

Lightly:新一代的C语言IDE

点击上方蓝字关注我&#xff0c;了解更多咨询C语言最初是作为Unix系统的开发工具而发明&#xff0c;现如今已成为最广泛使用、最流行的编程语言之一。它具有如下几个特点&#xff1a;&#xff08;1&#xff09;低级语言它是一种建立在底层构建逻辑的机器语言&#xff0c;可以直…

c语言程序的基本单位是什么呢?

点击上方蓝字关注我&#xff0c;了解更多咨询随着科技的不断发展&#xff0c;电脑等终端设备已经成为我们生活中不可或缺的工具&#xff0c;而希望学习程序设计语言的朋友也越来越多&#xff0c;那么c语言的基本单位是什么呢&#xff1f;其实&#xff0c;c语言的基本单位是函数…

关于C语言中的memset()函数你了解多少

点击上方蓝字关注我&#xff0c;了解更多咨询1.函数原型及功能memset()函数原型为&#xff1a;函数功能&#xff1a;将_Dst所指区域的前size_t个字节均初始化为_val&#xff0c;调用时需要引用string.h头文件memset()函数多用于数组和结构体这种占用内存比较大的数据结构的初始…

如何判断无法到达目标的拼图_拼图项目的动机和目标

如何判断无法到达目标的拼图几周前&#xff0c;我写了一篇关于Jigsaw项目可能如何破坏现有代码的文章 。 那么我们得到什么回报呢&#xff1f; 让我们看一下项目解决的痛点及其在Java 9中解决问题的目标。 系列 这篇文章是正在进行的有关拼图项目系列的一部分。 按照推荐的顺序…

javafx显示image_JavaFX技巧20:有很多要显示的吗? 使用画布!

javafx显示imageJavaFX应用程序似乎有两种&#xff1a;第一种使用带有节点和CSS样式的场景图&#xff0c;第二种使用单个画布。 但是&#xff0c;将这两种方法混合使用是完全合法的。 尤其是当您的应用程序必须显示大量详细信息时&#xff0c;您很容易最终创建成千上万个节点。…

c语言中|的含义

点击上方蓝字关注我&#xff0c;了解更多咨询||在c语言中的意思是逻辑OR&#xff08;或&#xff09;运算&#xff0c;运算符两端有一个变量为真&#xff0c;则结果为真。比如a||b表示a和b做逻辑OR&#xff08;或&#xff09;运算&#xff0c;只要有任何一个变量为“真”&#x…

30 校准_校准or质控,傻傻分不清楚

今天发个福利&#xff0c;应kkz的要求&#xff0c;聊一聊我对IVD校准和质控的个人理解。非专业科普文&#xff0c;欢迎交流&#xff5e;先来讲个小故事&#xff1a;我小的时候&#xff0c;家里用的挂钟每隔一段时间就要调准一下。那个时候没有网络&#xff0c;爸妈是对着中央新…

C语言查找数组最大最小值

点击上方蓝字关注我&#xff0c;了解更多咨询C语言查询最大最小值的实现思路&#xff1a;定一个变量存储最大值或最小值&#xff0c;变量的初始值取自数组的第一个元素&#xff0c;然后遍历数组&#xff0c;如果遍历到的元素比变量的值大&#xff0c;就把值赋给变量&#xff0c…

c语言中%s的含义你知道吗?

点击上方蓝字关注我&#xff0c;了解更多咨询%s在C语言中代表字符串型格式符&#xff0c;一般用在printf、sprintf等字符串格式化函数中&#xff0c;用于决定格式化参数的数据类型。整数类型是%d,单精度浮点类型&#xff0c;也就是小数是%f,字符类型%c%c&#xff0c;%s这些代表…

mysql 1千万 like优化_MYSQL千万级数据量的优化方法积累

1、分库分表很明显&#xff0c;一个主表(也就是很重要的表&#xff0c;例如用户表)无限制的增长势必严重影响性能&#xff0c;分库与分表是一个很不错的解决途径&#xff0c;也就是性能优化途径&#xff0c;现在的案例是我们有一个1000多万条记录的用户表members,查询起来非常之…

C语言while循环要点你会吗

点击上方蓝字关注我&#xff0c;了解更多咨询while语句在使用过程需要注意几个要点&#xff1a;一、无限循环先来看看以下的代码示例int n 0;while(n<3)printf("n %d", n);n;执行代码后&#xff0c;循环输出n0。在上述代码中&#xff0c;虽然有n自增&#xff0c…

C语言if与else匹配规则你知道多少?

点击上方蓝字关注我&#xff0c;了解更多咨询如果程序中有多个if和else&#xff0c;那如何配对&#xff0c;if和else的匹配规则简单总结为以下两点&#xff1a;1.无花括号&#xff0c;else和最近的if匹配2.有花括号&#xff0c;else和内含有if语句的第1个if语句匹配我们通过两个…

C语言中+=的含义你明白吗?

点击上方蓝字关注我&#xff0c;了解更多咨询c语言中是代表两个变量相加&#xff0c;并将答案记录在左边的变量里。比如xy实际代表的表达式为&#xff1a;xxy。这是c语言为了语言的简洁性推出的组合运算。常见的运算符都可以这样组合运算。一、源码演示&#xff1a;二、输出结果…

C语言中「」的含义

点击上方蓝字关注我&#xff0c;了解更多咨询取决于在scanf中使用还是在printf中使用。在scanf中使用&#xff0c;则添加了*的部分会被忽略&#xff0c;不会被参数获取。例如&#xff1a;int a,b;char b[10];scanf("%d%*s",&a,b)&#xff1b;输入为&#xff1a;1…

mysql ondumplictcate_4.5万字手把手教你实现MySQL TB级数据存储!!

写在前面业界对系统的高可用有着基本的要求&#xff0c;简单的说&#xff0c;这些要求可以总结为如下所示。系统架构中不存在单点问题。可以最大限度的保障服务的可用性。一般情况下系统的高可用可以用几个9来评估。所谓的几个9就是系统可以保证对外提供的服务的时间达到总时间…

c语言中+ =和=+有什么区别

点击上方蓝字关注我&#xff0c;了解更多咨询c语言中 和有什么区别&#xff1a;区别在于 是简写&#xff0c;a 1就是a a1&#xff1a;并不是简写&#xff0c;a a直接对a的赋值&#xff0c;符号代表的是正负&#xff08;完全可以省略不写&#xff09;&#xff0c;即a b其实就…

jvm7 jvm8_我们真的仍然需要32位JVM吗?

jvm7 jvm8即使在今天&#xff08;2015年&#xff09;&#xff0c;我们仍然有两个版本或Oracle HotSpot JDK –已调整为32或64位体系结构。 问题是我们是否真的想在服务器甚至笔记本电脑上使用32位JVM&#xff1f; 我们应该有很受欢迎的意见&#xff01; 如果只需要较小的堆&…

C语言中的printf函数,你觉得它简单吗?

点击上方蓝字关注我&#xff0c;了解更多咨询什么是printf函数&#xff1f;printf函数是C语言当中的输出函数&#xff0c;是用来将内容显示在屏幕上的&#xff0c;是C库中的一种函数。printf函数的用法printf函数使用起来很简单&#xff0c;格式&#xff1a;printf&#xff08;…

tp5怎么生成短链接_请问在tp5中怎样才能使用url函数?

MM们thinkphp中的自动完成函数调用有两种不同的方法&#xff0c;分别为callback与function;12345678910namespace Home\Model;use Think\Model;class UserModel extends Model{protected $_auto array (array(status,1), // 新增的时候把status字段设置为1array(password,md5,…

cuba 平台_CUBA平台的理念

cuba 平台最近发生了很多事。 在CUBA于6月1日正式发布之后&#xff0c;我们推出了新版本&#xff0c;在一些Java网站上发布了我们的第一篇文章&#xff0c;并在伦敦的Devoxx UK会议上介绍了该平台 。 但是在热潮继续之前&#xff0c;大约是时候阐明CUBA背后的哲学了。 与企业软…