zoukankan      html  css  js  c++  java
  • 串行卧重建14:我们是等自己测试的主动性

    他说了这么多,让我们来看看有示范样本,该系统将帮助测试的重建自己主动。或者返回的前HelloWorld抽样(见 3.3 小步快跑的乐趣)。还有一类sayHello()办法。我们只是想用输入当前时间username,他返回给用户的问候。假定当前时间是在早晨。返回“Hi, XXX. Good morning!”。假设是下午,则返回“Hi, XXX. Good afternoon!”;假设是晚上,则返回“Hi, XXX.Good Night!”,这是HelloWorld这个程序实现的功能。

    然后我们開始为这段程序编写測试代码(假设採用測试驱动开发,应当先写測试代码再敲代码)。

    我们首先建立一个test源程序文件夹。然后建立与被測程序相应的包和測试程序。

    这就是说。假设被測程序在“org.refactoring.helloWorld.resource”包中,则測试程序应当建立“test.org.refactoring.helloWorld.resource”包与之相应;假设被測程序叫“HelloWorld”。则建立“HelloWorldTest”类与之相应,这个类是一个JUnit測试程序。

    以下就是编写这个測试程序运行測试了。因为被測程序有三个分支,即当前时间是上午、下午、晚上。因此我们分别为之建立了三个測试用例,測试程序例如以下:

    /**
     * Test for {@link org.refactoring.helloWorld.resource.HelloWorld}
     * @author fangang
     */
    public class HelloWorldTest {
    
    	private HelloWorld helloWorld = null;
    	/**
    	 * @throws java.lang.Exception
    	 */
    	@Before
    	public void setUp() throws Exception {
    		helloWorld = new HelloWorld();
    	}
    
    	/**
    	 * @throws java.lang.Exception
    	 */
    	@After
    	public void tearDown() throws Exception {
    		helloWorld = null;
    	}
    
    	/**
    	 * Test method for {@link org...HelloWorld#sayHello(java.util.Date, java.lang.String)}.
    	 */
    	@Test
    	public void testSayHelloInTheMorning() {
    		Date now = DateUtil.createDate(2013, 9, 7, 9, 23, 11);
    		String user = "鲍晓妹";
    		String result = "";
    		result = helloWorld.sayHello(now, user);
    		assertThat(result, is("Hi, 鲍晓妹. Good morning!"));
    	}
    
    	/**
    	 * Test method for {@link org...HelloWorld#sayHello(java.util.Date, java.lang.String)}.
    	 */
    	@Test
    	public void testSayHelloInTheAfternoon() {
    		Date now = DateUtil.createDate(2013, 9, 7, 15, 7, 10);
    		String user = "关二锅";
    		String result = "";
    		result = helloWorld.sayHello(now, user);
    		assertThat(result, is("Hi, 关二锅. Good afternoon!"));
    	}
    
    	/**
    	 * Test method for {@link org...HelloWorld#sayHello(java.util.Date, java.lang.String)}.
    	 */
    	@Test
    	public void testSayHelloAtNight() {
    		Date now = DateUtil.createDate(2013, 9, 7, 21, 30, 10);
    		String user = "IT攻城狮";
    		String result = "";
    		result = helloWorld.sayHello(now, user);
    		assertThat(result, is("Hi, IT攻城狮. Good night!"));
    	}
    }


    这段程序採用的是JUnit4编写的。当中assertThat(result, is("Hi, IT攻城狮. Good night!"));,第一个參数是被測程序运行的结果,而第二个參数是依据期望结果进行验证。假设运行结果与预期结果同样,则測试通过。否则測试失败。

    随后我们执行该測试程序,得到例如以下结果:


    图4.1 JUnit測试结果

     

    三项測试用例所有通过,測试成功!

    如今我们为原程序编写了測试用例并所有測试通过,我们为重构所做的准备工作就一切就绪了。然后,我们開始进行第一次重构。

    如前面所述,第一次重构我们调整了程序的顺序,进行了分段。添加了凝视,并改动了对应的变量,使其更加利于阅读。这是一个小步快跑的过程,我们完毕此次重构仅仅花费了3、5分钟。

    当重构完毕,程序又一次回到可编译执行状态时,我们执行它的这个測试程序,測试通过。測试通过意味着,尽管程序内部的代码有所改动,但程序对外的功能没有变化。即程序的外部行为没有变化,则重构成功,我们能够继续后面的工作。

    第二次重构,我们运用“抽取方法”,从sayHello()函数中抽取出了getFirstGreeting(), getSecondGreeting(), getHour()三个方法。之后我们再次运行測试程序,測试通过。

    第三次重构,我们运用“抽取类”,将getFirstGreeting()与getSecondGreeting()分别抽取出来形成了GreetingToUser和GreetingAboutTime。

    完毕之后运行測试通过。

    第四次重构。我们的需求发生了变化,问候语不仅随一天中的上午、下午、晚上等进行变化。还须要依据不同的日期推断是否是节日。在这样的情况下。我们採用“两顶帽子”的方式进行开发:首先不引入新的需求,只改动原程序,使之适应新需求。为此我们从GreetingAboutTime类中提炼出DateUtil。使之不仅有getHour()。还有getMonth()与getDate()。完毕重构以后測试通过。

    关于“两顶帽子”的设计方式。也是系统重构中还有一个不同以往的地方,我们还将在后面具体地进行讨论。

    随后我们開始加入新需求,使GreetingAboutTime中的getGreeting()写成这样:

    	/**
    	 * @return the greeting about time
    	 */
    	public String getGreeting(){
    		DateUtil dateUtil = new DateUtil(date);
    		int month = dateUtil.getMonth();
    		int day = dateUtil.getDay();
    		int hour = dateUtil.getHour();
    		
    		if(month==1 && day==1) return "Happy new year! ";
    		if(month==1 && day==14) return "Happy valentine's day! ";
    		if(month==3 && day==8) return "Happy women's day! ";
    		if(month==5 && day==1) return "Happy Labor day! ";
    		......
    		
    		if(hour>=6 && hour<12) return "Good morning!";
    		if(hour==12) return "Good noon! ";
    		if(hour>=12 && hour<19) return "Good afternoon! ";
    		if(hour>=19 && hour<22) return "Good evening! ";
    		return "Good night! ";
    	}


    之后我们的測试不能通过:


    图4.2 測试用例不能通过

    为什么testSayHelloAtNight測试不能通过呢?细致查看被測程序,我们发现它的功能发生了变化。变为:假设当前时间是1月1日。则返回“Hi, XXX. Happy new year!”;假设是1月14日。则返回“Hi, XXX. Happyvalentine's day!”……假设当前时间都不是这些节日,假设是上午则返回“Hi, XXX. Good morning!”,是中午则返回“Hi, XXX. Good noon!”,是下午则返回“Hi, XXX. Good afternoon!”,是傍晚则返回“Hi, XXX. Good evening!”,否则才返回“Hi, XXX. Good night!”。

    正由于如此。我们须要调整我们的測试程序,为每个分支编写測试用例。

    測试改动好后。最后測试通过。

    大话重构连载首页:http://blog.csdn.net/mooodo/article/details/32083021

    特别说明:希望网友们在转载当这篇文章。它应注明作者和来源,为了尊重作者,谢谢。


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    实现毛玻璃效果
    iOS-调用系统的短信和发送邮件功能,实现短信分享和邮件分享
    集成环信
    HTTP 方法:GET 对比 POST
    虚拟DOM
    javascript的回调函数 同步 异步
    jQuery中的Deferred和promise
    web性能
    JSONP
    java
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4807929.html
Copyright © 2011-2022 走看看