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

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

[图二] 是产品代码◦

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

当然合理!

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

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

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

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

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

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

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

相关文章

来自专栏落花落雨不落叶

canvas画简单电路图

84011
来自专栏C#

DotNet加密方式解析--非对称加密

    新年新气象,也希望新年可以挣大钱。不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬。(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...)...

5908
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2850
来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2752
来自专栏跟着阿笨一起玩NET

c#实现打印功能

3652
来自专栏杨龙飞前端

scrollto 到指定位置

2934
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2997
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4395
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.4K7
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

7096

扫码关注云+社区