亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

大話重構(gòu)連載14:我們是這樣自動化測試的

系統(tǒng) 2209 0
說了那么多,讓我們用示例看看,系統(tǒng)重構(gòu)是應(yīng)該怎樣做自動化測試的。還是回到前面那個HelloWorld的例子(詳見 3.3 小步快跑是這樣玩的),該類中有一個sayHello()方法,只要我們輸入當(dāng)前的時間與用戶名,就返回對該用戶的問候語。如果當(dāng)前時間是上午,則返回“Hi, XXX. Good morning!”;如果是下午,則返回“Hi, XXX. Good afternoon!”;如果是晚上,則返回“Hi, XXX. Good Night!”,這是HelloWorld這個程序?qū)崿F(xiàn)的功能。

然后我們開始為這段程序編寫測試代碼(如果采用測試驅(qū)動開發(fā),應(yīng)當(dāng)先寫測試代碼再寫程序)。我們首先建立一個test源程序目錄,然后建立與被測程序?qū)?yīng)的包和測試程序。這就是說,如果被測程序在“org.refactoring.helloWorld.resource”包中,則測試程序應(yīng)當(dāng)建立“test.org.refactoring.helloWorld.resource”包與之對應(yīng);如果被測程序叫“HelloWorld”,則建立“HelloWorldTest”類與之對應(yīng),這個類是一個JUnit測試程序。
下面就是編寫這個測試程序執(zhí)行測試了。由于被測程序有三個分支,即當(dāng)前時間是上午、下午、晚上,因此我們分別為之建立了三個測試用例,測試程序如下:

    /**
 * 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 = "關(guān)二鍋";
		String result = "";
		result = helloWorld.sayHello(now, user);
		assertThat(result, is("Hi, 關(guān)二鍋. 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!"));,第一個參數(shù)是被測程序執(zhí)行的結(jié)果,而第二個參數(shù)是根據(jù)期望結(jié)果進(jìn)行驗(yàn)證。如果執(zhí)行結(jié)果與預(yù)期結(jié)果相同,則測試通過,否則測試失敗。

隨后我們運(yùn)行該測試程序,得到如下結(jié)果:


大話重構(gòu)連載14:我們是這樣自動化測試的
圖4.1 JUnit測試結(jié)果


三項(xiàng)測試用例全部通過,測試成功!

現(xiàn)在我們?yōu)樵绦蚓帉懥藴y試用例并全部測試通過,我們?yōu)橹貥?gòu)所做的準(zhǔn)備工作就一切就緒了。然后,我們開始進(jìn)行第一次重構(gòu)。如前面所述,第一次重構(gòu)我們調(diào)整了程序的順序,進(jìn)行了分段,增加了注釋,并修改了相應(yīng)的變量,使其更加利于閱讀。這是一個小步快跑的過程,我們完成此次重構(gòu)只花費(fèi)了3、5分鐘。當(dāng)重構(gòu)完成,程序重新回到可編譯運(yùn)行狀態(tài)時,我們執(zhí)行它的這個測試程序,測試通過。測試通過意味著,雖然程序內(nèi)部的代碼有所修改,但程序?qū)ν獾墓δ軟]有變化,即程序的外部行為沒有變化,則重構(gòu)成功,我們可以繼續(xù)后面的工作。

第二次重構(gòu),我們運(yùn)用“抽取方法”,從sayHello()函數(shù)中抽取出了getFirstGreeting(), getSecondGreeting(), getHour()三個方法。之后我們再次執(zhí)行測試程序,測試通過。

第三次重構(gòu),我們運(yùn)用“抽取類”,將getFirstGreeting()與getSecondGreeting()分別抽取出來形成了GreetingToUser和GreetingAboutTime。完成之后執(zhí)行測試通過。
第四次重構(gòu),我們的需求發(fā)生了變化,問候語不僅隨一天中的上午、下午、晚上等進(jìn)行變化,還需要根據(jù)不同的日期判斷是否是節(jié)日。在這種情況下,我們采用“兩頂帽子”的方式進(jìn)行開發(fā):首先不引入新的需求,僅僅修改原程序,使之適應(yīng)新需求。為此我們從GreetingAboutTime類中提煉出DateUtil,使之不僅有g(shù)etHour(),還有g(shù)etMonth()與getDate()。完成重構(gòu)以后測試通過。

關(guān)于“兩頂帽子”的設(shè)計方式,也是系統(tǒng)重構(gòu)中另一個不同以往的地方,我們還將在后面詳細(xì)地進(jìn)行討論。隨后我們開始添加新需求,使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! ";
	}
  


之后我們的測試不能通過:
大話重構(gòu)連載14:我們是這樣自動化測試的
圖4.2 測試用例不能通過


為什么testSayHelloAtNight測試不能通過呢?仔細(xì)查看被測程序,我們發(fā)現(xiàn)它的功能發(fā)生了變化,變?yōu)椋喝绻?dāng)前時間是1月1日,則返回“Hi, XXX. Happy new year!”;如果是1月14日,則返回“Hi, XXX. Happy valentine's day!”……如果當(dāng)前時間都不是這些節(jié)日,如果是上午則返回“Hi, XXX. Good morning!”,是中午則返回“Hi, XXX. Good noon!”,是下午則返回“Hi, XXX. Good afternoon!”,是傍晚則返回“Hi, XXX. Good evening!”,否則才返回“Hi, XXX. Good night!”。正因?yàn)槿绱耍覀冃枰{(diào)整我們的測試程序,為每一個分支編寫測試用例。測試修改好后,最后測試通過。

大話重構(gòu)連載首頁: http://fangang.iteye.com/blog/2081995
特別說明:希望網(wǎng)友們在轉(zhuǎn)載本文時,應(yīng)當(dāng)注明作者或出處,以示對作者的尊重,謝謝!

大話重構(gòu)連載14:我們是這樣自動化測試的


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲欧美另类精品久久久 | 亚洲精品9999久久久久 | 免费精品精品国产欧美在线 | 免费a级毛片大学生免费观看 | www.亚洲精品.com | 国产伦理一区二区三区 | 久草在线最新 | 亚洲欧美日韩在线观看你懂的 | 日韩精品国产自在久久现线拍 | 九九热视| 亚洲国产成人99精品激情在线 | 天天拍夜夜添久久精品中文 | 久久香蕉综合色一综合色88 | 欧美激情免费观看一区 | 日韩孕交japanese孕交 | 国产亚洲视频在线 | 久久久久国产精品免费网站 | 亚洲精品一区二区中文 | 国产一级在线观看www色 | 国内精品伊人久久久影院 | 黄视频网站免费看 | 亚洲性视频网站 | 国产香蕉一区二区在线网站 | 久久天天躁狠狠躁狠狠躁 | 全亚洲最大的免费私人影剧院 | 久久久久国产精品四虎 | 国产成人亚洲精品久久 | 99re热视频这里只有精品5 | 欧美日韩亚洲视频 | 久久精品啪啪嗷嗷叫 | 7777成年大片免费播放器 | 欧美美女一区二区三区 | 四虎在线观看免费视频 | 国产成人教育视频在线观看 | 欧美中文字幕在线视频 | 奇米色影视 | 国产在线拍揄自揄视频不卡99 | 亚洲欧美日韩国产综合久 | 久久综合欧美 | 国产一区二区三区久久 | 色综合欧美色综合七久久 |