一种编写测试的好方法

测试。 最近我一直在考虑进行测试。 作为我对各种项目所做的代码审查的一部分,我已经看到了数千行未经测试的代码。 这不仅是测试覆盖率统计数据指出这一点的情况,还更多是该项目中根本没有任何测试的情况 。 我一直听到这种悲惨状况的两个原因? “我们没有时间”,紧随其后的是“完成代码后就去做”。

我在这里展示的不是万能药。 它涵盖了单元测试,尤其是接口的单元测试。 接口是好东西。 接口定义合同。 接口,无论接口有多少种实现方式,都可以轻松,轻松地进行测试。 让我们看看如何使用此类结构作为示例。

fd98ced9 CustomerService是我们的界面。 为了使示例保持简单,它有两种方法,下面将进行介绍。 注意javadoc-这是描述合同的地方。

public interface CustomerService
{/*** Retrieve the customer from somewhere.* @param userName the userName of the customer* @return a non-null Customer instance compliant with the userName* @throws CustomerNotFoundException if a customer with the given user name can not be found*/Customer get(String userName) throws CustomerNotFoundException;/*** Persist the customer.* @param customer the customer to persist* @return the customer as it now exists in its persisted form* @throws DuplicateCustomerException if a customer with the user name already exists*/Customer create(Customer customer) throws DuplicateCustomerException;
}

从图中可以看到,我们有两个此类的实现,RemoteCustomerService和CachingCustomerService。 这些的实现没有显示,因为它们无关紧要。 我怎么说呢 很简单–我们正在测试合同。 我们为接口中的每个方法以及合同的每个排列编写测试。 例如,对于get(),我们需要测试存在具有给定用户名的客户时发生的情况,以及不存在时发生的情况。

public abstract class CustomerServiceTest
{@Testpublic void testCreate(){CustomerService customerService = getCustomerService();Customer customer = customerService.create(new Customer("userNameA"));Assert.assertNotNull(customer);Assert.assertEquals("userNameA",customer.getUserName());}@Test(expected = DuplicateCustomerException.class)public void testCreate_duplicate(){CustomerService customerService = getCustomerService();Customer customer = new Customer("userNameA");customerService.create(customer);customerService.create(customer);}@Testpublic void testGet(){CustomerService customerService = getCustomerService();customerService.create(new Customer("userNameA"));Customer customer = customerService.get("userNameA");Assert.assertNotNull(customer);Assert.assertEquals("userNameA",result.getUserName());}@Test(expected = CustomerNotFoundException.class)public void testGet_noUser(){CustomerService customerService = getCustomerService();customerService.get("userNameA");}public abstract CustomerService getCustomerService();
}

现在,我们已经对合同进行了测试,并且在任何时候都没有提到任何实现。 这意味着两件事:

  • 我们不需要为每个实现重复测试。 这是一件非常好的事情。
  • 没有一个实现正在测试中。 我们可以通过为每个实现添加一个测试类来纠正此问题。 由于每个测试类几乎都是相同的,因此我将仅演示RemoteCustomerService的测试。
public class RemoteCustomerServiceTest extends CustomerServiceTest
{public CustomerService getCustomerService(){return new RemoteCustomerService();}
}

就是这样! 现在,我们有了一种非常简单的方法来测试任何接口的多个实现,方法是预先进行艰苦的工作,并将测试新实现的工作减少到一个简单的方法中。

参考: Objective博客上的JCG合作伙伴 Steve Chaloner 编写测试的一种好方法 。

翻译自: https://www.javacodegeeks.com/2013/06/a-good-lazy-way-to-write-tests.html

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

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

相关文章

rem、px、em之间的区别以及网页响应式设计写法

个人收藏用,转载自:http://www.w3cplus.com/css3/define-font-size-with-css3-rem 在Web中使用什么单位来定义页面的字体大小,至今天为止都还在激烈的争论着,有人说PX做为单位好,有人说EM优点多,还有人在说…

游戏服务器架构图

1:ARPG类型游戏 2:MMORPG 3:MOBA 4:卡牌类 5:棋盘类 转载于:https://www.cnblogs.com/like-minded/p/8297718.html

php 解析http,用PHP手动解析原始HTTP数据

好的,所以Dave和Everts的建议我决定手动解析原始请求数据。搜索约一天后,我没有找到任何其他方式来做到这一点。我从这个thread获得了一些帮助。我没有任何运气篡改原始数据,就像在引用的线程中一样,因为这将破坏正在上传的文件。…

长为N的数组,元素范围是0-N-1,其中只有一个数是重复的,找出这个重复元素...

思路:如果限制空间复杂度为O(1),我们就无法采用哈希表的方法去求解。题目中数组中所以数字都在范围[0, N-1],因此哈希表的大小为N即可。因此我们实际要做的就是对N个范围为0到N-1的数进行哈希,而…

测试Spring的“会话”范围

在基于Spring的Web应用程序中,bean的作用域可以是用户“会话”。 从本质上讲,这意味着对会话范围的Bean的状态更改仅在用户会话范围内可见。 此项的目的是简单地突出显示Spring Test MVC提供的一种方法,以测试将会话范围的bean作为依赖项的组…

Sass学习之路(3)——Sass编译

Sass的编译也是在我们使用Sass的时候必须要经过的一个步骤&#xff0c;因为".sass"和".scss"文件并不能直接使用<link>标签引用&#xff0c;最终其实还是要将他们转换成CSS文件来在项目中使用。 所以要让web页面真正使用到Sass缩写的东西&#xff0…

爬虫练习一(爬取笑话集)

爬取笑话集网页 目标网址为&#xff1a;http://www.jokeji.cn/list.html 感觉这个网站挺简单&#xff0c;不用登陆&#xff0c;没有复杂的功能&#xff0c;好爬~ 可以现在浏览器中访问这个链接看一下效果&#xff0c;你会发现这个页面是个目录&#xff0c;有很多笑话页面的链接…

Huffman树学习

一篇很好的博客 转载于:https://www.cnblogs.com/cjoierljl/p/9319902.html

JAVA第六章第6题,java第六章例题源代码

《JavaWeb 程序设计》 练习题参考答案 第一章:Servlet 基础 1、下列选项中属于...由于 PHP 开放源 代码,并且是免费的,所以非常流行,是当今 Internet 上最为火热......JAVA 编程实例大全及详解答案(50 例) 【程序 1】题目:古典问题:有一对...9、Java 中一个字符占用两个 字节,所…

GlassFish 4带来了Java EE 7

真是惊喜 除了推出新的iOS 7外&#xff0c;苹果在wwdc上什么也没提供。 碰巧的是&#xff0c;在他们的主题演讲后不久&#xff0c;又有7个人正式露面。 GlassFish 4.0已于昨天晚上发布&#xff08;显然是不需要的&#xff09;。 新的Java EE 7参考实现自动成为当今第一个可用的…

bootstrap的栅格布局与两列布局结合使用

在工作中我们常常需要实现响应式布局&#xff0c;这个可以使用bootstrap的栅格系统来实现&#xff0c;我们在列里也需要实现一部分的响应式。比如下面的效果图&#xff0c;需要实现左边图标固定&#xff0c;右边的自适应 &#xff1a; 左边固定宽度&#xff0c;右边自适应&…

软件测试初学记录——第一章

阅读软件测试记要 什么是软件测试&#xff1a; 以找出软件中不符合需求而去操作软件的过程称为软件测试。 软件测试员的工作&#xff1a; 软件测试员的目标是尽早的发现软件缺陷&#xff0c;并确保其被修复。 软件缺陷是什么&#xff1a; 不符合需求文档或导致软件不能正常运行…

matlab命令 脑电波,基于Matlab的脑电波信号处理

做脑电波信号处理滴嘿嘿。。Matlab addictedCodes%FEATURE EXTRACTERfunction [features] EEGfeaturetrainmod(filename,m)a 4;b 7;d 12;e 30;signals 0;for index 1:9; % read in the first ten EEG data because the files are numbered as ha11test01 rather than ha…

JavaScript内置对象Date常用函数

// //获取当前时间// var dt new Date();// alert(dt);// //传入时间// var dt1 new Date("2017-08-12");// alert(dt1);//// //获取时间的对象(毫秒)// var dt2 Date.now();// alert(dt2);//// …

JVM性能魔术技巧

HotSpot是我们众所周知和喜爱的JVM&#xff0c;是Java和Scala汁流淌的大脑。 多年来&#xff0c;许多工程师对其进行了改进和调整&#xff0c;并且在每次迭代中&#xff0c;其代码执行的速度和效率都接近本机编译代码。 JIT&#xff08;“即时”&#xff09;编译器是其核心。…

移动端1px

移动端不同尺寸设备dpi不同&#xff0c;会造成1px线条不同程度的缩放&#xff0c;可利用媒体查询device-pixel-ratio&#xff0c;进行不同情况匹配&#xff1a; media&#xff08;-webkit-min-device-pixel-ratio:1.5&#xff09;,(min-device-pixel-ratio:1.5){//dpi:1.5 .bo…

mysql 10个日期,MySQL自学篇(10)——日期函数

MySQL自学篇(十)——日期函数日期和时间函数(1)获取当前日期的函数和时间的函数CURDATE()和CURRENT_DATE()函数&#xff0c;获取当前日期select current_date(),curdate(),curdate()0;curdate()0 表示将当前时间转化为数值型CURTIME()和CURRENT_TIME()获取当前时间select cur…

python-flask-请求源码流程

启动先执行manage.py 中的 app.run() class Flask(_PackageBoundObject):   def run(self, hostNone, portNone, debugNone, **options):from werkzeug.serving import run_simpletry:#run_simple 是werkzeug 提供的方法&#xff0c;会执行第三个参数 self()run_simple(ho…

正则表达式强化,爬虫练习

re模块下的常用方法 import re ret re.findall(\d(\.\d)?, 1.232.34)   print(ret) 结果&#xff1a; [.23,.34] # findall的正则表达式里面有分组(),()里面的内容优先显示 ret re.findall(\d(?:\.\d)?, 1.232.34)print(ret)    结果&#xff1a;…

Java垃圾回收(3)

这是我之前的两个垃圾收集博客文章中的内容&#xff1a; 热点GC概述 。 并行垃圾收集器 。 并发标记扫描 Hotspot中的并行垃圾收集器旨在最大程度地减少应用程序进行垃圾收集所花费的时间&#xff0c;这称为吞吐量 。 对于所有应用程序来说&#xff0c;这并不是一个适当的权…