【前言】概念方面的東西。
單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證。對於單元測試中單元的含義,一般來說,要根據實際情況去判定其具體含義,如C語言中單元指一個函數,Java裏單元指一個類,圖形化的軟件中可以指一個窗口或一個菜單等。總的來說,單元就是人爲規定的最小的被測功能模塊。
第一講,什麼是單元測試
寫了個類,要給別人用,會不會有bug?怎麼辦?測試一下。
用main方法測試好不好?不好!
- 不能一起運行!
- 大多數情況下需要人爲的觀察輸出確定是否正確
80各類難道需要寫80個main方法累死你。其中修改了20各類,難道我們還得在跑一邊。
第二講,爲什麼要進行單元測試
重用測試,應付將來的實現的變化。
以後基於我現在這個類寫出來的其他代碼,會更加有正確性。
提高士氣,明確知道我的東西是沒問題的。
成本:開發,測試,部署,維護。那個階段哈udeqianshi最多的-----------維護。!!!佔60%=è降低後期的成本
說了一句:保證方法是正確的。
很多公司都不寫junit測試。爲啥嘞,因爲中國公司有的太簡單,增刪改差。有的給政府做,無所謂。呵呵。
最終提高軟件的質量。
引出junit。單元測試的一個工具,就是junit
第三講,JUnit4 HelloWorld(開始使用!!!)
前言:Eclipse是直接對junit進行了集成的。我們可以直接用。!!哈哈
下面是建一個junit的步驟。
1.new project
新建一個包,不是新建一個類哦。
包名:com.bjsxt.junit4.test。我們需要專門見一個junit的的包。跟java源碼的包並列即可。如圖所示u。
2.建立類(生成測試類)
建類的名字。被測類名Test。這麼構成。比如TTest。
可以選擇對那個類進行測試。可以選擇對類的哪個方法進行測試。
Eclipse自帶了junit包的,默認就行。一會兒再說,如果不用自帶的jar包應該怎麼導入外部的包。
構建完了。
import static org.junit.Assert.*;
發現有這麼一句代碼。
這個靜態類,裏面有很多靜態的方法,可以直接用。
jdk5出現的新語法。靜態引入。哈哈。
3.建立testcase
其實上一部已經建立了testcase的框框吧。我們繼續完善。
剛纔的狀態:
按照之前的測試步驟,我們需要寫完程序,用print打印出來,看結果對不對。但是junit的assert類給我們提供了方法。
【引言】assert:翻譯,斷言。其實就是判斷的意思。
assert有很多方法。提供給我們。
Assert.assertEquals(expected,actual);
期望值是8,實際值是z。自己進行判斷。
keeps the bar green ,to keeps the code clean.
程序自動判斷有什麼好處呢?:
- 直接看滾動條是不是綠色就能判斷代碼是不是通過
- 可以一下子測試很多方法啊。(在類上右鍵,test junit)用main是不行的。
- 不用人工肉眼判斷了,程序判斷方便啊。
第四講。放棄舊的斷言assert,使用hamcrest斷言
並不是真的放棄舊的assert。只是提出一種新的統一的assertThat。用那種都可以。後者必須用到hamcrest包。
讀junit網址。可以下載最新想junit來使用。
讀文檔。看起來跟jdk幫助文檔一樣。
試一下assert的其他方法:
幾乎所有的assert方法都有一個重載 的形式。也即是前面有一個字符串參數。作用是:當斷言沒有通過的時候,會提示這個字符串。
- assertThat
在junit4之後,加入了assertThat方法。可以替代所有的assert方法。
使用方法:
assertThat(actual,matcher)
matcher:規則匹配器。
只用例子:
這個方法需要hamcrest這個包。需要自己下載。
將hamcrest的兩個jar包加入我們的項目。引入。
可能會報錯:ClassLoader的錯誤。說明我們引入的包有衝突(他們用到classloader用到不是同一個)。之前講過類似問題
原因:Eclipse自帶的junit.jar與hamcrest又衝突。
解決:移除原來的junit.jar,自己import最新的junit.jar即可。
2.使用hamcrest的匹配方法(唯一優點)
a) 更自然
3.示例
a) assertThat( n, allOf( greaterThan(1), lessThan(15) ) );滿足左右條件 assertThat( n, anyOf( greaterThan(16), lessThan(8) ) );滿足其中一個條件
assertThat( n, anything() );
assertThat( str, is( "bjsxt" ) );
assertThat( str, not( "bjxxt" ) );
b) assertThat( str, containsString( "bjsxt" ) );
assertThat( str, endsWith("bjsxt" ) );
assertThat( str, startsWith( "bjsxt" ) );
assertThat( n, equalTo( nExpected ) );
assertThat( str, equalToIgnoringCase( "bjsxt" ) ); assertThat( str, equalToIgnoringWhiteSpace( "bjsxt" ) );
c) assertThat( d, closeTo( 3.0, 0.3 ) );
assertThat( d, greaterThan(3.0) );
assertThat( d, lessThan (10.0) );
assertThat( d, greaterThanOrEqualTo (5.0) );
assertThat( d, lessThanOrEqualTo (16.0) );
d) assertThat( map, hasEntry( "bjsxt", "bjsxt" ) );
assertThat( iterable, hasItem ( "bjsxt" ) );
assertThat( map, hasKey ( "bjsxt" ) );
assertThat( map, hasValue ( "bjsxt" ) );
第五講,Failure和Error
- Failure是指測試失敗
2.Error是指測試程序本身出錯(一個測試單元,出現error就不會再報failure了!有優先級的。)
第六講,JUnit4 Annotation(註解!!!)
- @Test: 測試方法
在junit4中,新建Junit Test類是之前講過的方法。但是在已有的類中添加新的測試方法,只需要寫一個符合語法的方法,再在前面加上註解:@Test
a) (expected=XXException.class)期望拋出某種異常,拋出的話不影響測試是否通過。
b) (timeout=xxx)如圖:期望在一定時間內結束本方法的測試,否則失敗。、
2.@Ignore: 被忽略的測試方法
該測試方法在本次測試中暫時不執行。
3.@Before: 每一個測試方法之前運行
4.@After: 每一個測試方法之後運行
上面兩個annotation用在情況:測試方法需要打開文件,我們就在before中打開文件。在after中關閉文件。
5.@BeforeClass: 所有測試開始之前運行
6.@AfterClass: 所有測試結束之後運行
這個是所有測試方法開始之前使用的。
beforeClass取得比較耗時的資源。搭載比較耗時間的環境的時候。
jiazai 配置文件,什麼連接數據庫的連接池各種。總不能每個測試方法都執行一遍這些操作吧,費時也沒必要。
afterClass資源釋放掉,環境卸載
第七講,運行多個測試
新建一個java類。
新建一個Junit類。
run-configruation-Test—Run
all tests
甚至有人提出來,先把測試junit類寫出啦。TDD:Test Drive Development 測試驅動開發。一個新的開發思想。
注意
其實最開始創建Junit Test類的時候就已經按照這個約定在創建了。
結構上是:建一個包,與java源碼的包並列。
命名:類名需要XXXTest;方法名XXXtestMethod
- 遵守約定,比如:
a) 關於包:類放在test包中
b) 關於測試類:類名用XXXTest結尾
c) 關於測試方法:方法用testMethod命名
其他框架
除了junit測試框架之外,還有別的測試框架:比如TestNG
ant的使用場合:
積累業務經驗是關鍵啦。而不是編碼經驗嘍。。。
轉自:http://www.cnblogs.com/xiaobaishuowoshigou/articles/5244506.html