Junit測試 詳細介紹
一、爲什麼要進行測試
其實編寫測試代碼看起來是增加了代碼量和工作量,實際不然。測試可以減少後期項目上線debug調試排錯的時間,提升代碼質量,讓代碼變得更容易維護。
二、什麼是單元測試
單元測試簡單來說就是對項目最小的功能模塊進行測試,在java中是一個方法。假如說你現在寫好了一個類,那你怎麼驗證這個類中的方法有沒有問題?如果按照咱們傳統的單元測試做法,就是再編寫一個類,然後在新編寫的這個類的main方法中調用被測試的類的方法,而且一般情況下都需要通過肉眼去觀察運行結果是否正確。
那麼問題來了,萬一這時候有很多類都要進行測試,那怎麼辦?那是不是要寫很多個main方法,或者說是把測試代碼寫到一個main方法中。但是這樣做會增加測試複雜度和提高工作量,所以說程序員對於單元測試的熱情一直不是很高。後來有一個大神推出了一個可以簡化單元測試工作的jar包(JUnit),大大減輕了程序員進行單元測試的工作量。
三、JUnit是什麼?
JUnit是一個用於java語言的單元測試框架,可以簡化單元測試的工作量。
很多開發環境默認已經集成了Junit:Eclipse,MyEclipse,Idea。
四、JUnit使用注意事項
1.測試方法上必須要使用@Test註解進行修飾
2.所有測試方法必須要使用public void進行修飾,且不能有參數
3.每個測試方法都要保證能獨立運行,測試方法之間不能有依賴。
4.測試類儘量以(被測試類的名字+Test)作爲測試類的名字(非必須,只是爲了更好的編程習慣)
5.測試類所在的包名儘量和被測試類的包名保持一致(非必須,只是爲了更好。。。)
6.測試方法儘量以test作爲前綴(非必須,只是爲了更好。。。)
五、JUnit的使用
1.在項目的pom.xml中配置JUnit單元測試框架jar包
六、測試失敗的兩種情況
Failure:代碼正常但是運行結果和期望結果不一致導致的【Assert.assertEquals(num, 2);】
Error:代碼執行過程中出現異常!
七、JUnit4中的常用註解
@Test:修飾普通方法爲測試方法
@BeforeClass:在測試類的所有測試方法執行前執行,必須用static修飾
@AfterClass:在測試類的所有測試方法執行後執行,必須用static修飾
@Before:在測試類的每個測試方法執行前執行一次
@After:在測試類的每個測試方法執行後執行一次
@Ignore:忽略測試方法
public class CalculatorTest {
private static Calculator cal;
@BeforeClass
public static void createCalculator(){
cal = new Calculator();
System.out.println("我會在所有測試方法執行前執行一次,只會執行一次!");
}
@AfterClass
public static void destoryCalculator(){
cal = null;
System.out.println("我會在所有測試方法執行後執行一次,只會執行一次!");
}
@Before
public void start(){
System.out.println("開始執行測試方法");
}
@After
public void end(){
System.out.println("執行測試方法結束");
}
@Test
public void testAdd(){
System.out.println("進行加法測試");
int num = cal.add(1, 2);
//斷言機制,可以判斷程序運行結果和預期結果是否一致!
Assert.assertEquals(num, 2);
}
@Test
@Ignore
public void testSub(){
System.out.println("進行減法測試");
int num = cal.sub(10, 2);
Assert.assertEquals(num, 8);
}
}
八、JUnit測試套件的使用(當有多個類需要統一測試)
在實際項目中,隨着開發的深入,項目會越來越大,相應的測試類也會越來越多,那麼總不能一個一個的運行吧,JUnit測試套件就提供了批量運行的方法
測試套件就是組織測試類一起運行的
寫一個類作爲測試套件的入口類,這個類裏不包含其他的方法,更改測試運行器爲Suite.class,將要測試的類作爲數組傳入到Suite.SuiteClasses({})
九、Maven Web項目使用Junit進行測試
1. 在項目的pom.xml中Junit jar包的依賴配置
十、Maven Web項目+Spring Test框架+JUnit進行測試
【當沒有controller,無法啓動服務,無法加載配置文件時候,如何測試:】
1.在項目pom.xml中加入JUnit和Spring Test jar包的依賴配置
2.編寫一個測試類
//用於指定junit運行環境,是junit提供給其他框架測試環境接口擴展,爲了便於使用spring的依賴注入
//spring提供了org.springframework.test.context.junit4.SpringJUnit4ClassRunner作爲Junit測試環境
@RunWith(SpringJUnit4ClassRunner.class)
//加載配置文件(加載多個)
@ContextConfiguration(locations = { "classpath*:/applicationContext_realm.xml",
"classpath*:/applicationContext_daily.xml",
"classpath*:/applicationContext.xml",
"classpath*:/applicationContext_airwarm.xml",
"classpath*:/applicationContext_airwet.xml",
"classpath*:/applicationContext_illum.xml",
"classpath*:/applicationContext_rainfall.xml"
})
//這個非常關鍵,如果不加入這個註解配置,事務控制就會完全失效!
@Transactional
//這裏的事務關聯到配置文件中的事務控制器(transactionManager = "transactionManager"),
//同時指定自動回滾(defaultRollback = true)。這樣做操作的數據纔不會污染數據庫!
@TransactionConfiguration(transactionManager="transactionManager",defaultRollback = true)
public class BookDaoTest {
@Autowired
private BookDao bookDao;
@Test
public void testAddBook(){
Book book = new Book();
book.setBookName(“sdssd”);
bookDao.save(book);
}
}
Junit 斷言詳解:
其中方法應用的時候由於其都是static 方法,所以直接調用即可
(如:Assert.assertEquals(1,1) )
斷言是編寫測試用例的核心實現方式,即期望值是多少,測試的結果是多少,以此來判斷測試是否通過。
|assertArrayEquals(expecteds, actuals) 查看兩個數組是否相等。
assertEquals(expected, actual) 查看兩個對象是否相等。類似於字符串比較使用的equals() 方法
assertNotEquals(first, second) 查看兩個對象是否不相等。
assertNull(object) 查看對象是否爲空。
assertNotNull(object) 查看對象是否不爲空。
assertSame(expected, actual) 查看兩個對象的引用是否相等。類似於使用“==”比較兩個對象
assertNotSame(unexpected, actual) 查看兩個對象的引用是否不相等。類似於使用“!=”比較兩個對象
assertTrue(condition) 查看運行結果是否爲true。
assertFalse(condition) 查看運行結果是否爲false。
assertThat(actual, matcher) 查看實際值是否滿足指定的條件
fail() 讓測試失敗