1. 程式人生 > >“村長”教你測試用例

“村長”教你測試用例

當你在網上查詢Android Studio單元測試的時候,有大量的資料教程,但是都不完整,至少跟著教程一步步的是無法看到自己想看的效果的,所以我寫了此篇,想盡量完整地向大家展示單元測試的編寫過程。

Android Studio 自帶的單元測試功能用起來很簡單,它不需要修改gradle或者AndroidManifest.xml檔案裡的內容,直接編寫測試用例即可。不過即使是這樣,我相信大多數的程式設計師都還是不喜歡編寫測試用例的,因為這是一件很繁瑣的事情而且好像顯得很多餘:明明執行一下程式,觀察執行結果就能知道對與錯了,為什麼還要通過程式碼來進行判斷呢?確實,如果只是普通的一個小程式,編寫測試用例是有些多此一舉,但是當你正在維護一個非常龐大的工程時,你就會發現編寫測試用例是非常有必要的。
  
 一份

測試用例設計技巧 密碼:85p0 送給大家,再給大家推薦一個QQ群:903217991,裡面可以領取有關軟體測試各方面的學習資料。如果在專案中有什麼問題也是可以請教測試大牛的喔!
  
  舉個例子吧!比如你確實正在維護一個很龐大的工程,裡面有許許多多數也數不清的功能。某天,你的領導要求你對其中一個功能進行修改,難度也不高,你很快就解決了,並且測試通過。但是幾天之後,突然有人發現其他功能出現了問題,最終定位出來的原因竟然就是你之前修改的那個功能所導致的,這下你可就冤死了。
  
  不過千萬別以為這是天方夜譚,在大型的專案中,這種情況還是很常見的。由於專案裡的很多程式碼都是公用的,你為了完成一個功能而去修改某行程式碼,完全有可能因此而導致另一個功能無法正常工作。
  
  所以,當專案比較龐大的時候,一般都應該去編寫測試用例的。如果我們給專案的每一項功能都編寫了測試用例,每當修改或新增任何功能之後,就將所有的測試用例都跑一遍,只要有任何測試用例沒有通過,就說明修改或新增的這個功能影響到現有功能了,這樣就可以及早地發現問題,避免事故的出現。
 
 一、目錄介紹

 在這裡插入圖片描述
 目錄結構
  mian:專案程式碼;
  androidTest:編寫Android測試用例使用;
  test:編寫Java測試用例使用,如果所寫的測試程式碼沒有使用android sdk(android.*下的程式碼),那麼可以在test目錄下新建測試用例;
  二、執行我們的測試用例
  Android Studio 本身就是支援Android單元測試的,我用的是 AS2.2.3 版本,它甚至無需像之前的版本那樣需要進行繁瑣的配置。

在這裡插入圖片描述
Android Studio 2.2.3 版本
  (1)編寫測試用例
  這裡我們首先進入到Java的測試類當中:
在這裡插入圖片描述
Java單元測試類
  其中“assertEquals(4, 2 + 2);”是用來斷言4和2+2是否是相等的語句,我們先不做改變。
  點選14行左側的按鈕,然後選擇第一項執行:
在這裡插入圖片描述


執行測試用例
  這時觀察到底部Run面板顯示為綠色橫條,表示為執行測試成功:
在這裡插入圖片描述
底部Run面板
  然後我們把“assertEquals(4, 2 + 2);”改為“assertEquals(4, 5);”。
  按照剛才的步驟執行測試用例:
在這裡插入圖片描述
執行測試用例
  由於 4 和 5 是不相等的,那麼斷言失敗,所以Run面板中顯示出紅色並表示出了錯誤的原因。
  到這裡我們自然就明白了測試用例是什麼,測試用例其實就是一段普通的程式程式碼,通常是帶有期望的執行結果的,測試者可以根據最終的執行結果來判斷程式是否能正常工作。
  那麼單元測試又是什麼呢?單元測試是指對軟體中最小的功能模組進行測試,如果軟體的每一個單元都能通過測試,說明程式碼的健壯性已經非常好了。下面我們就一起來進行一下Android的單元測試。

一份測試用例設計技巧 密碼:85p0 送給大家,再給大家推薦一個QQ群:903217991,裡面可以領取有關軟體測試各方面的學習資料。如果在專案中有什麼問題也是可以請教測試大牛的喔!
(2)單元測試
  首先在 MainActivity 中編寫 androidTest() 方法,該方法用於向集合 testList 中新增不重複的 int 值,並返回此時 testList 的大小:
  待測試方法:
  在這裡插入圖片描述
  待測試方法
  然後在 ExampleInstrumentedTest 測試類中進行斷言測試:
在這裡插入圖片描述
斷言測試
  此時執行測試用例:
在這裡插入圖片描述
執行測試用例
  發現沒有異常情況丟擲,說明測試通過。
  不過,現在這個單元測試其實只是覆蓋了很少的情況而已,我們應該再編寫一些特殊情況下的斷言,看看程式是不是仍然能夠正常工作。
  修改 ExampleInstrumentedTest 中的程式碼,如下所示:
在這裡插入圖片描述
特殊情況下的斷言
  可以看到,這裡我們又呼叫了一次 androidTest() 方法來新增int值到 testList 中,並且新增的仍然還是2。連續新增兩次相同int值,這應該算是一種比較特殊的情況了。這時我們覺得 androidTest() 有能力去過濾掉重複的資料,因此在斷言的時候認為目前
  androidTest() 中的testList大小仍然是 3。
  重新執行一遍測試用例,結果如圖:
一份測試用例設計技巧 密碼:85p0 送給大家,再給大家推薦一個QQ群:903217991,裡面可以領取有關軟體測試各方面的學習資料。如果在專案中有什麼問題也是可以請教測試大牛的喔!
在這裡插入圖片描述
特殊情況下斷言執行結果
  很遺憾,測試用例沒有通過。從這個測試用例中我們發現, androidTest() 方法中的程式碼原來是不夠健壯的,這個時候就應該對程式碼進行優化了。
  修改 androidTest() 中的程式碼,如下所示:
  在這裡插入圖片描述
  androidTest()修改後
  這裡我們在 androidTest()方法中加入了一個 if 判斷,只有當集合中不包含傳入的int值的時候才會將它新增到集合中,這樣就可以解決掉int值重複的 bug 了。
  現在重新執行一遍測試用例:
在這裡插入圖片描述
重新執行測試用例
  你就會發現測試又能成功通過了。