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

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

[图二] 是产品代码◦


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

当然合理!

 

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

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

 

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


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

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

 

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

 

 

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值