单元测试代码比产品代码还要多?

[图一] 是单元测试代码◦

[图二] 是产品代码◦

显而易见的是, 单元测试代码比产品代码还要多, 这合理吗?

当然合理!

产品代码虽然是只有短短的几行; 处理订阅者订阅赛马的消息◦

但, 却会衍生出许多不同的使用者场景; 如: 没有订阅者订阅, 只有单一或多个订阅者, 某个订阅者重复订阅, 某个订阅者取消订阅…..等等◦

单元测试, 根据这些不同的使用者场景, 分别有相对应的单元测试代码 (测试用例) ◦  所以, 单元测试代码自然会比产品代码还要多◦

但, 这样的付出 (投资) 绝对是值得的◦

因为, 唯有如此所形成的 “自动化单元测试”,  才能使产品可在 “最短的时间内反馈”, 既有产品的架构, 功能与质量是否已被所新增的代码 (功能) 所破坏◦

所以, 我们应该真正专注的是, 单元测试的 “测试用例的有效性” , 而不是表面的单元测试代码的行数◦

package test.java.com;
 
 import main.java.com.Client;
 import main.java.com.Message;
 import main.java.com.RaceResultsService;
 import org.junit.Before;
 import org.junit.Test;
 
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 
 /**
 * Created by ScalaMind on 2015/3/3.
  */
 public class RaceResultsServiceTest {
 
 private RaceResultsServiceraceResults;
 private Messagemessage;
 private ClientclientA;
 private ClientclientB;
 
 @Before
 public void setUp() {
 raceResults = new RaceResultsService();
  message = mock(Message.class);
 clientA = mock(Client.class, "clientA");
 clientB = mock(Client.class, "clientB");
 }
 
 // zero subscribers
 @Test
 public void notSubscribeClientShouldNotReceiveMessage() {
 raceResults.send(message);
 
 verify(clientA, never()).receive(message);
 verify(clientB, never()).receive(message);
 
 }
 
 // one subscriber
 @Test
 public void subscribedClientShouldReceiveMessage() {
 raceResults.addSubscriber(clientA);
 raceResults.send(message);
 
 verify(clientA).receive(message);
 }
 
 // two subscribers
 @Test
 public void messageShouldBeSentToAllSubscribedClients() {
 RaceResultsService raceResults= new RaceResultsService();
 Message message = mock(Message.class);
 
 raceResults.addSubscriber(clientA);
 raceResults.addSubscriber(clientB);
 raceResults.send(message);
 
 verify(clientA).receive(message);
 verify(clientB).receive(message);
 
 }
 
 // subscribe more than once
 @Test
 public void shouldSendOnlyOneMessageToMultiSubscriber() {
 raceResults.addSubscriber(clientA);
 raceResults.addSubscriber(clientA);
 raceResults.send(message);
 verify(clientA).receive(message);
 }
 
 // remove a subscriber
 @Test
 public void unsubscribedClientShouldNotReceiveMessages() {
 raceResults.addSubscriber(clientA);
 raceResults.removeSubscriber(clientA);
 
 raceResults.send(message);
 verify(clientA, never()).receive(message);
 
 }
 
 }

                                                                                                                                        [图一: 单元测试代码]

package main.java.com;
 
 import java.util.Collection;
 import java.util.HashSet;
 
 /**
 * Created by ScalaMind on 2015/3/3.
  */
 public class RaceResultsService {
 
 private Collection<Client> clients =  new HashSet<Client>();
 
 public void addSubscriber(Client client) {
 
 clients.add(client);
 }
 
 public void send(Message message) {
 for (Client client :  clients)
 client.receive(message);
 }
 
 public void removeSubscriber(Client client) {
 clients.remove(client);
 }
 }

                                                                                                                                         [图二: 产品代码]

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android 开发者

Android UI 及 API 优化指南|Android 开发者 FAQ Vol.10

1464
来自专栏Java社区

前后端数据对接的思考及总结

2313
来自专栏编程

6本PHP必备书籍,你值得拥有

PHP(Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,...

1876
来自专栏Data Analysis & Viz

用Zhihu-OAuth库轻松爬取知乎各类数据

去年(手动滑稽)某日想爬取知乎特定话题下的全部回答数据,于是翻出以前写的知乎话题爬虫跑运行了下,没想到遇到一个一直没能解决的bug,貌似是抓包到的API返回的J...

993
来自专栏开源优测

[接口测试 - 基础篇] 02 你应该掌握的Python3接口测试内功

概述 本文主要介绍基于Python3进行接口测试时,应该掌握Python3哪些基本的能力,主要从以下几个方面进行说明。 Python3基本语法 ...

3216
来自专栏编程

开发者必看:Android UI及API 优化指南

作为应用的设计者,有些开发者在开发过程中容易忽略一些用户体验方面的问题,从而导致了自己的应用用户体验欠佳。本期 Android 开发者 FAQ 我们整理了一些开...

1766
来自专栏北京马哥教育

10年 Windows 与 Linux 程序员的区别

如果一个程序员从来没有在Linux、Unix下开发过程序,一直在Windows下面开发程序,同样是工作10年,大部分情况下与在Linux、unix下面开发10年...

690
来自专栏Java帮帮-微信公众号-技术文章全总结

14款Java开发工具【面试+工作】

1、JDK (Java Development Kit)Java开发工具集 SUN的Java不仅提了一个丰富的语言和运行环境,而且还提了一个免费的J...

3855
来自专栏不会写文章的程序员不是好厨师

日志那些事儿——日志Logger漫谈

最近在关注限流、降级、监控等系统稳定性方面的技术,反复牵涉到的几个技术名词是日志log,Aop切片。

1172
来自专栏木头编程 - moTzxx

踩坑筆記 —— ThinkPHP 框架下微信支付

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

1172

扫码关注云+社区