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

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

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

一种编写测试的好方法相关推荐

  1. 测试案例6种编写方法_一种编写测试的好方法

    测试案例6种编写方法 测试. 我最近一直在考虑测试. 作为我对各种项目所做的代码审查的一部分,我已经看到了数千行未经测试的代码. 这不仅是测试覆盖率统计数据指出这一点的情况,更是该项目中根本没有任何测 ...

  2. XCode中的单元测试:编写测试类和方法(内容意译自苹果官方文档)

    当你在工程中通过测试导航栏添加了一个测试target之后, xcode会在测试导航栏中显示该target所属的测试类和方法. 这一章演示了怎么创建测试类,以及如何编写测试方法. 测试targets, ...

  3. 6种编写程序代码的方法

    https://developer.aliyun.com/article/718649?utm_content=g_1000088936

  4. 服务总线yali测试_总线压力测试系统及其方法

    总线压力测试系统及其方法 [技术领域] [0001]本发明涉及一种压力测试系统及其方法,特别是指以快捷外设互联标准装置(PC1-E)产生压力数据流避免占用中央处理器使用时间的总线压力测试系统及其方法. ...

  5. 如何用计算机测试交易系统,一种自动售票机交易功能的测试系统和方法与流程...

    本发明涉及一种自动售票机检测领域,尤其是涉及一种自动售票机交易功能的测试系统和方法. 背景技术: 轨道交通的自动售票机(TVM)在接入线网投用之前,必须进行功能测试,以确保功能完备.交易完整.正常使用 ...

  6. IC验证培训——一种自动编写UVM testbench的方法

    路科验证官网:路科验证 - 专注于数字芯片验证的系统思想和前沿工程领域 EETOP路科首页: EETOP - 路科验证 - IC验证培训 CSDN路科首页:CSDN - 路科验证 - IC验证培训 S ...

  7. C++两种编写单件模式方法对比

    1.第一种:  1 template <typename T>  2 class CSingletonT  3 {  4 public:  5   6     virtual ~CSing ...

  8. 手游上线前的五种测试的基础方法

    手游测试中普遍存在的问题之一就是如何涵盖所有可能运行你游戏的设备.尽管市面上有数千款Android设备(以及iOS各个版本的系统),但其中仅有数百款真正与你的游戏产生联系.在本文,我们将探讨手游测试的 ...

  9. Linux下nvidia压力测试,一种服务器linux系统下GPU压力测试的监控方法与流程

    本发明属于服务器测试技术领域,具体涉及一种服务器linux系统下GPU压力测试的监控方法. 背景技术: 随着社会的快速发展,人们对高网络性能.快速存储.大量内存.超高计算能力的GPU的需求越来越大,产 ...

最新文章

  1. Linux6版本系统搭建Open***远程访问
  2. Vivado如何计算关键路径的建立时间裕量?(理论分析篇)
  3. Lock与synchronized测试区别
  4. 读书笔记_Effective_C++_条款三十一:将文件间的编译依存关系降至最低(第二部分)...
  5. 绕过安卓SSL验证证书的四种方式
  6. 在64位系统上注册并使用32位的COM组件
  7. 使用方法实现数组的对调与输出
  8. 【codevs2098】【Tyvj1625】化工厂装箱员,煞笔的人打煞笔的DP
  9. Jsp+Ssh+Mysql实现简单的校园实习兼职管理
  10. map中key值带‘-’转json_h5模型转savedModel + tf_serving部署采坑记录
  11. 3号团队-团队任务5:项目总结会
  12. HTTP请求时常见的请求方式与状态码
  13. 艾肯声卡调试机架安装教程与下载_2019最新推荐
  14. 用c语言屏蔽鼠标键盘,用VBS屏蔽键盘和鼠标
  15. 亚马逊17亿美元收购iRobot;谷歌·Web性能权威指南电子书;宾大·现代统计学习课程资料;轻量化爬虫实现方案;前沿论文 | ShowMeAI资讯日报
  16. 牙齿,我怎么才能保护你
  17. vue视频播放插件vue-video-player
  18. hazelcast的坑爹事
  19. html5微信录音文件,微信H5录音实现
  20. 类和对象常见题目详解

热门文章

  1. HashMap的实现原理及其特点
  2. ubuntu ifconfig_Ubuntu 设置固定 IP 最简单的方法!
  3. mysql-on duplicate key update实现insertOrUpdate官方文档
  4. java集合——具体的集合
  5. 算法运行时间中的对数
  6. 从零开始学spring-boot(2)-集成spring-data-jpa
  7. dynamodb java_使用Java将项目插入DynamoDB表
  8. java 编写代码_如果您在2015年编写过Java代码-这是您不容错过的趋势
  9. java 开发 jvm_Java开发人员应了解的JVM流行语
  10. formlayout_精简SWT FormLayout的用法