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

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

[图二] 是产品代码◦

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

当然合理!

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

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

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

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

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

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

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 条评论
登录 后参与评论

相关文章

来自专栏函数式编程语言及工具

Akka(0):聊聊对Akka的初步了解和想法

   前一段时间一直沉浸在函数式编程模式里,主要目的之一是掌握一套安全可靠的并发程序编程方法(concurrent programming),最终通过开源项目F...

2128
来自专栏魏琼东

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 服务定位器(SL)与AgileEAS.NET中的实现

        首先说一下 ,或许我是个懒汉,博客差不多已经一个月没有写了,给朋友们说声抱歉,最近发生了很多事,南方洪水呀洪水,北方热呀热,兰州遇到不知道多少年...

1725
来自专栏java一日一条

编写高性能 Java 代码的最佳实践

在这篇文章中,我们将讨论几个有助于提升Java应用程序性能的方法。我们首先将介绍如何定义可度量的性能指标,然后看看有哪些工具可以用来度量和监控应用程序性能,以及...

883
来自专栏斑斓

利用Actor实现管道过滤器模式

《基于Actor的响应式编程》计划分为三部分,第一部分剖析响应式编程的本质思想,为大家介绍何谓响应式编程(Reactive Programming)。第二部分则...

2834
来自专栏linux驱动个人学习

总线

总线是CPU与存储器和设备通信的机制,是计算机各部分之间传送数据、地址和控制信息的公共通道。 按照相对于CPU的位置来划分,总线可分为片内总线和片外总线。片内总...

3079
来自专栏BeJavaGod

网站平台架构演变史(二)

上篇文章大致降了网站架构的一个大致发展趋势,这篇咱们讲讲数据库。数据库在大并发的情况下是最容易出现问题的,往往都是由于写操作引发的网站访问缓慢或者崩溃,之前说过...

3165
来自专栏Albert陈凯

为什么之前的MapReduce系统比较慢

本文就两个问题进行讨论:1. 相比于Shark,为什么像Hive之类的传统MapReduce框架比较慢? 2. 对于细粒度的任务模型(fine-grained ...

2564
来自专栏CSDN技术头条

如何提升Java应用程序性能

【摘要】本文首先介绍了负载测试、基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践。最后研究了JVM特定的调优技巧、数据库端的...

1897
来自专栏大数据文摘

5大架构:细数数据平台的组成与扩展

2068
来自专栏云成本管理

云成本管理方法论(四)——云优化管理之管理措施

因为判定规则分析中的判定结果较分散,为便于后继的分析和使用,我们将判定结果进行分类,不同的类别称为“问题类型”。

4229

扫码关注云+社区