Java 之單元測試

單元測試編寫

Junit 單元測試框架

對於Java語言而言,其單元測試框架,有Junit和TestNG這兩種, 下面是一個典型的JUnit測試類的結構api

  1. package com.example.demo;框架

  2.  

  3. import org.junit.jupiter.api.*;maven

  4.  

  5. import static org.junit.jupiter.api.Assertions.*;ide

  6.  

  7. @DisplayName("售票器類型測試")函數

  8. class DemoTest {單元測試

  9. // 定義測試的實例測試

  10. private Demo demo;優化

  11.  

  12. // 定義前綴 整個測試類開始執行的地方this

  13. @BeforeAll插件

  14. public static void init(){

  15.  

  16. }

  17.  

  18. // 定義後綴,整個測試類完成後執行的操做

  19. @AfterAll

  20. public static void cleanup(){

  21.  

  22. }

  23.  

  24.  

  25. // 定義每一個測試用例開始執行前的操做

  26. @BeforeEach

  27. public void create(){

  28. this.demo = new Demo();

  29. }

  30.  

  31.  

  32. // 定義在每一個測試用例完成後執行的操做

  33. @AfterEach

  34. public void destory(){

  35.  

  36. }

  37.  

  38. // 執行測試用例

  39. @Test

  40. @DisplayName("售票後的餘額減小")

  41. public void shouldReduceInventoryWhenticketSoldOut(){

  42.  

  43. }

  44.  

  45.  

  46.  

  47. @Test

  48. public void ming(){

  49.  

  50. }

  51. }

測試結果如圖所示

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

層次性表達測試用例

測試用例較多的狀況下,爲了層次性表達測試用例,使用Junit的Nested註解有層次的表達測試用例

  1. package com.example.demo;

  2.  

  3. import org.junit.jupiter.api.*;

  4.  

  5. @DisplayName("交易服務測試")

  6. class DemoTest {

  7. @Nested

  8. @DisplayName("用戶交易測試")

  9. class Test02{

  10.  

  11. @Test

  12. @DisplayName("交易檢查測試")

  13. public void test01(){

  14.  

  15. }

  16.  

  17. }

  18. }

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

使用Tag標籤區分測試用例

在執行Maven打包的時候,使用tage註解,能夠有選擇的執行一些測試命令

  1. package com.example.demo;

  2.  

  3. import org.junit.jupiter.api.*;

  4.  

  5. @DisplayName("交易服務測試")

  6. class DemoTest {

  7.  

  8. @Test

  9. @DisplayName("售票後額度減小")

  10. @Tag("fast")

  11. public void test01(){

  12.  

  13. }

  14.  

  15. @Test

  16. @DisplayName("一次性減小車票")

  17. @Tag("slow")

  18. public void test02(){

  19.  

  20. }

  21. }

添加相關的插件

  1. <plugin>

  2. <artifactId>maven-surefire-plugin</artifactId>

  3. <version>2.22.0</version>

  4. <configuration>

  5. <properties>

  6. <includeTags>fast</includeTags>

  7. <excludeTags>slow</excludeTags>

  8. </properties>

  9. </configuration>

  10. </plugin>

斷言

使用Junit命令進行斷言處理

  1. @Test

  2. @DisplayName("售票後額度減小")

  3. @Tag("fast")

  4. public void test01(){

  5. String s = "ming";

  6. Assertions.assertTrue(s.startsWith("ming"));

  7. Assertions.assertTrue(s.endsWith("g"));

  8. Assertions.assertEquals(5, s.length());

  9. }

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

此時斷言錯誤。

單元測試的目的

提高軟件質量

優質的單元測試能夠保障,開發質量和程序的健壯性,在大多數互聯網企業中,開發工程師,都會頻繁的執行測試用例。

促進代碼的優化

單元測試是由開發工程師編寫和維護的,這會促進開發工程師不斷的從新審視本身的代碼質量。

提升研發效率

單元測試,雖然佔用的大量的時間,可是對後續的聯調,集成等,均可以進一步的提升研發的效率。

增長重構的自信

代碼重構每每是牽一髮而動全身的,當修改底層代碼的時候,經過不斷的單元測試,能夠增長重構的軟件的自信。

單元測試的基本原則

單元測試要符合AIR原則。單元測試,符合如下三個原則

  1. 自動化

  2. 獨立性

  3. 可重複

單元測試覆蓋率

語句覆蓋

又稱行覆蓋(LineCoverage),段覆蓋(SegmentCoverage),基本塊覆蓋(BasicBlockCoverage),這是最經常使用也是最多見的一種覆蓋方式,就是度量被測代碼中每一個可執行語句是否被執行到了。

斷定覆蓋

又稱分支覆蓋(BranchCoverage),全部邊界覆蓋(All-EdgesCoverage),基本路徑覆蓋(BasicPathCoverage),斷定路徑覆蓋(Decision-Decision-Path)。它度量程序中每個斷定的分支是否都被測試到了。

條件覆蓋

它度量斷定中的每一個子表達式結果true和false是否被測試到了

路徑覆蓋

又稱斷言覆蓋(PredicateCoverage)。它度量了是否函數的每個分支都被執行了

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

小明菜市場

相關文章
相關標籤/搜索