前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >单元测试代码比产品代码还要多?

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

作者头像
Ken Fang 方俊贤
发布2018-01-04 18:11:40
1.2K0
发布2018-01-04 18:11:40
举报

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

[图二] 是产品代码◦

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

当然合理!

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

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

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

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

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

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

代码语言:txt
复制
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);
 
 }
 
 }

                                                                                                                                        [图一: 单元测试代码]

代码语言:txt
复制
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);
 }
 }

                                                                                                                                         [图二: 产品代码]

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-03-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档