精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

JUnit:別再用 main 方法測試了,好嗎?

開發 后端
在了解我之前,先來了解一下什么是單元測試。單元測試,就是針對最小的功能單元編寫測試代碼。在 Java 中,最小的功能單元就是方法,因此,對 Java 程序員進行單元測試實際上就是對 Java 方法的測試。

[[361023]]

01、前世今生

你好呀,我是 JUnit,一個開源的 Java 單元測試框架。在了解我之前,先來了解一下什么是單元測試。單元測試,就是針對最小的功能單元編寫測試代碼。在 Java 中,最小的功能單元就是方法,因此,對 Java 程序員進行單元測試實際上就是對 Java 方法的測試。

為什么要進行單元測試呢?因為單元測試可以確保你編寫的代碼是符合軟件需求和遵循開發規范的。單元測試是所有測試中最底層的一類測試,是第一個環節,也是最重要的一個環節,是唯一一次能夠達到代碼覆蓋率 100% 的測試,是整個軟件測試過程的基礎和前提。可以這么說,單元測試的性價比是最好的。

微軟公司之前有這樣一個統計:bug 在單元測試階段被發現的平均耗時是 3.25 小時,如果遺漏到系統測試則需要 11.5 個小時。

 

經我這么一說,你應該已經很清楚單元測試的重要性了。那在你最初編寫測試代碼的時候,是不是經常這么做?就像下面這樣。

  1. public class Factorial { 
  2.     public static long fact(long n) { 
  3.         long r = 1; 
  4.         for (long i = 1; i <= n; i++) { 
  5.             r = r * i; 
  6.         } 
  7.         return r; 
  8.     } 
  9.  
  10.     public static void main(String[] args) { 
  11.         if (fact(3) == 6) { 
  12.             System.out.println("通過"); 
  13.         } else { 
  14.             System.out.println("失敗"); 
  15.         } 
  16.     } 

要測試 fact() 方法正確性,你在 main() 方法中編寫了一段測試代碼。如果你這么做過的話,我只能說你也曾經青澀天真過啊!使用 main() 方法來測試有很多壞處,比如說:

1)測試代碼沒有和源代碼分開。

2)不夠靈活,很難編寫一組通用的測試代碼。

3)無法自動打印出預期和實際的結果,沒辦法比對。

但如果學會使用我——JUnit 的話,就不會再有這種困擾了。我可以非常簡單地組織測試代碼,并隨時運行它們,還能給出準確的測試報告,讓你在最短的時間內發現自己編寫的代碼到底哪里出了問題。

02、上手指南

好了,既然知道了我這么優秀,那還等什么,直接上手吧!我最新的版本是 JUnit 5,Intellij IDEA 中已經集成了,所以你可以直接在 IDEA 中編寫并運行我的測試用例。

第一步,直接在當前的代碼編輯器窗口中按下 Command+N 鍵(Mac 版),在彈出的菜單中選擇「Test...」。

 

勾選上要編寫測試用例的方法 fact(),然后點擊「OK」。

此時,IDEA 會自動在當前類所在的包下生成一個類名帶 Test(慣例)的測試類。如下圖所示。

 

如果你是第一次使用我的話,IDEA 會提示你導入我的依賴包。建議你選擇最新的 JUnit 5.4。

 

導入完畢后,你可以打開 pom.xml 文件確認一下,里面多了對我的依賴。

  1. <dependency> 
  2.     <groupId>org.junit.jupiter</groupId> 
  3.     <artifactId>junit-jupiter</artifactId> 
  4.     <version>RELEASE</version> 
  5.     <scope>compile</scope> 
  6. </dependency> 

第二步,在測試方法中添加一組斷言,如下所示。

  1. @Test 
  2. void fact() { 
  3.     assertEquals(1, Factorial.fact(1)); 
  4.     assertEquals(2, Factorial.fact(2)); 
  5.     assertEquals(6, Factorial.fact(3)); 
  6.     assertEquals(100, Factorial.fact(5)); 

@Test 注解是我要求的,我會把帶有 @Test 的方法識別為測試方法。在測試方法內部,你可以使用 assertEquals() 對期望的值和實際的值進行比對。

第三步,你可以在郵件菜單中選擇「Run FactorialTest」來運行測試用例,結果如下所示。

 

測試失敗了,因為第 20 行的預期結果和實際不符,預期是 100,實際是 120。此時,你要么修正實現代碼,要么修正測試代碼,直到測試通過為止。

 

不難吧?單元測試可以確保單個方法按照正確的預期運行,如果你修改了某個方法的代碼,只需確保其對應的單元測試通過,即可認為改動是沒有問題的。

03、瞻前顧后

在一個測試用例中,可能要對多個方法進行測試。在測試之前呢,需要準備一些條件,比如說創建對象;在測試完成后呢,需要把這些對象銷毀掉以釋放資源。如果在多個測試方法中重復這些樣板代碼又會顯得非常啰嗦。

這時候,該怎么辦呢?

我為你提供了 setUp() 和 tearDown(),作為一個文化人,我稱之為“瞻前顧后”。來看要測試的代碼。

  1. public class Calculator { 
  2.     public int sub(int a, int b) { 
  3.         return a - b; 
  4.     } 
  5.     public int add(int a, int b) { 
  6.         return a + b; 
  7.     } 

新建測試用例的時候記得勾選setUp 和 tearDown。

 

生成后的代碼如下所示。

  1. class CalculatorTest { 
  2.     Calculator calculator; 
  3.  
  4.     @BeforeEach 
  5.     void setUp() { 
  6.         calculator = new Calculator(); 
  7.     } 
  8.  
  9.     @AfterEach 
  10.     void tearDown() { 
  11.         calculator = null
  12.     } 
  13.  
  14.  
  15.     @Test 
  16.     void sub() { 
  17.         assertEquals(0,calculator.sub(1,1)); 
  18.     } 
  19.  
  20.     @Test 
  21.     void add() { 
  22.         assertEquals(2,calculator.add(1,1)); 
  23.     } 

@BeforeEach 的 setUp() 方法會在運行每個 @Test 方法之前運行;@AfterEach 的tearDown() 方法會在運行每個 @Test 方法之后運行。

與之對應的還有 @BeforeAll 和 @AfterAll,與 @BeforeEach 和 @AfterEach 不同的是,All 通常用來初始化和銷毀靜態變量。

  1. public class DatabaseTest { 
  2.     static Database db; 
  3.  
  4.     @BeforeAll 
  5.     public static void init() { 
  6.         db = createDb(...); 
  7.     } 
  8.      
  9.     @AfterAll 
  10.     public static void drop() { 
  11.         ... 
  12.     } 

03、異常測試

對于 Java 程序來說,異常處理也非常的重要。對于可能拋出的異常進行測試,本身也是測試的一個重要環節。

還拿之前的 Factorial 類來進行說明。在 fact() 方法的一開始,對參數 n 進行了校驗,如果小于 0,則拋出 IllegalArgumentException 異常。

  1. public class Factorial { 
  2.     public static long fact(long n) { 
  3.         if (n < 0) { 
  4.             throw new IllegalArgumentException("參數不能小于 0"); 
  5.         } 
  6.         long r = 1; 
  7.         for (long i = 1; i <= n; i++) { 
  8.             r = r * i; 
  9.         } 
  10.         return r; 
  11.     } 

在 FactorialTest 中追加一個測試方法 factIllegalArgument()。

  1. @Test 
  2. void factIllegalArgument() { 
  3.     assertThrows(IllegalArgumentException.class, new Executable() { 
  4.         @Override 
  5.         public void execute() throws Throwable { 
  6.             Factorial.fact(-2); 
  7.         } 
  8.     }); 

我為你提供了一個 assertThrows() 的方法,第一個參數是異常的類型,第二個參數 Executable,可以封裝產生異常的代碼。如果覺得匿名內部類寫起來比較復雜的話,可以使用 Lambda 表達式。

  1. @Test 
  2. void factIllegalArgumentLambda() { 
  3.     assertThrows(IllegalArgumentException.class, () -> { 
  4.         Factorial.fact(-2); 
  5.     }); 

04、忽略測試

有時候,由于某些原因,某些方法產生了 bug,需要一段時間去修復,在修復之前,該方法對應的測試用例一直是以失敗告終的,為了避免這種情況,我為你提供了 @Disabled 注解。

  1. class DisabledTestsDemo { 
  2.  
  3.     @Disabled("該測試用例不再執行,直到編號為 43 的 bug 修復掉"
  4.     @Test 
  5.     void testWillBeSkipped() { 
  6.     } 
  7.  
  8.     @Test 
  9.     void testWillBeExecuted() { 
  10.     } 
  11.  

@Disabled 注解也可以不需要說明,但我建議你還是提供一下,簡單地說明一下為什么這個測試方法要忽略。在上例中,如果團隊的其他成員看到說明就會明白,當編號 43 的 bug 修復后,該測試方法會重新啟用的。即便是為了提醒自己,也很有必要,因為時間長了你可能自己就忘了,當初是為什么要忽略這個測試方法的。

05、條件測試

有時候,你可能需要在某些條件下運行測試方法,有些條件下不運行測試方法。針對這場使用場景,我為你提供了條件測試。

1)不同的操作系統,可能需要不同的測試用例,比如說 Linux 和 Windows 的路徑名是不一樣的,通過 @EnabledOnOs 注解就可以針對不同的操作系統啟用不同的測試用例。

  1. @Test 
  2. @EnabledOnOs(MAC) 
  3. void onlyOnMacOs() { 
  4.     // ... 
  5.  
  6. @TestOnMac 
  7. void testOnMac() { 
  8.     // ... 
  9.  
  10. @Test 
  11. @EnabledOnOs({ LINUX, MAC }) 
  12. void onLinuxOrMac() { 
  13.     // ... 
  14.  
  15. @Test 
  16. @DisabledOnOs(WINDOWS) 
  17. void notOnWindows() { 
  18.     // ... 

2)不同的 Java 運行環境,可能也需要不同的測試用例。@EnabledOnJre 和 @EnabledForJreRange 注解就可以滿足這個需求。

  1. @Test 
  2. @EnabledOnJre(JAVA_8) 
  3. void onlyOnJava8() { 
  4.     // ... 
  5.  
  6. @Test 
  7. @EnabledOnJre({ JAVA_9, JAVA_10 }) 
  8. void onJava9Or10() { 
  9.     // ... 
  10.  
  11. @Test 
  12. @EnabledForJreRange(min = JAVA_9, max = JAVA_11) 
  13. void fromJava9to11() { 
  14.     // ... 

06、尾聲

最后,給你說三句心里話吧。在編寫單元測試的時候,你最好這樣做:

1)單元測試的代碼本身必須非常名單明了,能一下看明白,決不能再為測試代碼編寫測試代碼。

2)每個單元測試應該互相獨立,不依賴運行時的順序。

3)測試時要特別注意邊界條件,比如說 0,null,空字符串"" 等情況。

希望我能盡早的替你發現代碼中的 bug,畢竟越早的發現,造成的損失就會越小。see you!

 本文轉載自微信公眾號「沉默王二」,可以通過以下二維碼關注。轉載本文請聯系沉默王二公眾號。

 

責任編輯:武曉燕 來源: 沉默王二
相關推薦

2017-11-22 15:13:20

集成測試自動化測試契約測試

2023-09-14 12:03:30

空指針判空

2025-11-03 04:00:00

2025-08-13 03:00:00

2025-05-19 04:00:00

2021-06-09 06:41:11

OFFSETLIMIT分頁

2021-01-29 11:05:50

PrintPython代碼

2020-12-03 09:05:38

SQL代碼方案

2020-12-02 11:18:50

print調試代碼Python

2020-12-15 08:06:45

waitnotifyCondition

2021-05-25 09:30:44

kill -9Linux kill -9 pid

2023-10-26 16:33:59

float 布局前段CSS

2020-12-04 10:05:00

Pythonprint代碼

2020-07-17 07:15:38

數據庫ID代碼

2022-01-27 07:48:37

虛擬項目Django

2012-03-13 16:14:09

JavaJUnit

2024-12-26 07:47:20

2019-03-12 14:48:29

路由器XBOXPS4

2022-10-27 21:34:28

數據庫機器學習架構

2020-02-05 14:17:48

Python數據結構JavaScript
點贊
收藏

51CTO技術棧公眾號

亚洲精品国产精品久久清纯直播 | 三级精品在线观看| 日韩国产精品视频| 黑森林精品导航| 国产日产一区二区| av激情综合网| 成人国产在线激情| 激情五月色婷婷| 国产精品成人a在线观看| 日韩欧美的一区二区| 人妻无码视频一区二区三区| 成码无人av片在线观看网站| 欧美一级视频免费| 激情久久五月| 最近2019中文字幕第三页视频| 久久精品国产99久久99久久久| 77thz桃花论族在线观看| 久久久久久久久久久久久女国产乱 | 欧美91在线|欧美| 久久久久久日产精品| 亚洲sss综合天堂久久| 色屁屁影院www国产高清麻豆| 亚洲人metart人体| 亚洲人成在线观看网站高清| 亚洲国产日韩在线一区| 日韩精选视频| 欧美日韩精品国产| 日韩人妻一区二区三区蜜桃视频| 青青草免费在线视频| 国产精品一二二区| 国产欧美精品一区二区三区介绍| 久久亚洲天堂网| 国产一区亚洲| 久久九九免费视频| 超碰人人干人人| 免费成人三级| 精品国产亚洲在线| 免费在线观看污网站| 99re66热这里只有精品4| 五月天亚洲婷婷| 波多野结衣与黑人| av在线影院| 日韩毛片在线免费观看| 一区二区三区四区不卡| 成人午夜影视| 国产清纯白嫩初高生在线观看91 | 日日夜夜操视频| 婷婷亚洲最大| 日韩综合中文字幕| 免费在线观看a视频| 卡通动漫精品一区二区三区| 欧美一区二区三区爱爱| 欧美性受xxxx黒人xyx性爽| 日韩成人高清| 欧美亚洲禁片免费| 亚洲免费久久| 国产乡下妇女做爰视频| 午夜亚洲福利| 美女黄色丝袜一区| www青青草原| 欧美人成网站| 理论片在线不卡免费观看| 91高清免费观看| 中文精品久久| 欧美极品在线视频| 国产成人综合亚洲| 国产麻豆剧传媒精品国产| 国产成人久久精品一区二区三区| 69p69国产精品| 超碰中文字幕在线观看| 无码国模国产在线观看| 精品第一国产综合精品aⅴ| 国产一级伦理片| 国产成人精品999在线观看| 国产成人a亚洲精v品无码| 成人毛片视频免费看| 国产精品一二三四区| 国产精品免费一区| 亚洲天堂男人av| 视频一区二区国产| 成人av在线网址| 国产黄频在线观看| 99久久国产综合精品色伊| 欧美一级日本a级v片| 欧美精品hd| 亚洲综合一区二区三区| 久久久免费视频网站| 成人交换视频| 精品免费视频一区二区| 永久免费看mv网站入口78| 99久久人爽人人添人人澡| 欧美一区二区大片| 在线天堂www在线国语对白| 啄木系列成人av电影| 中文字幕亚洲自拍| 色小说视频一区| 微拍福利一区二区| 中文字幕人成人乱码| 91国在线精品国内播放| 久久综合导航| 欧美激情奇米色| 日韩手机在线视频| 国产在线不卡一卡二卡三卡四卡| 国产精品一区二区三区观看| 国产在线中文字幕| 亚洲欧美另类图片小说| 黄色片视频在线免费观看| 免费视频成人| 国产视频精品久久久| 亚洲一级二级片| 久久新电视剧免费观看| 日韩av片永久免费网站| 国产又粗又大又黄| 国产一区中文字幕| 久久99精品一区二区三区| 丝袜诱惑制服诱惑色一区在线观看| 激情视频在线观看免费| 777av视频| 欧洲一区二区视频| 超碰日本道色综合久久综合| 在线免费观看日韩欧美| 粉嫩av亚洲一区二区图片| 成人三级毛片| 日韩在线免费看| 亚洲AV无码成人精品区明星换面| 成人在线免费高清视频| 麻豆av一区| 欧美精品中文字幕一区二区| 日韩免费在线看| 色妞欧美日韩在线| 欧美美女视频在线观看| 亚洲一区二区三区自拍| 日本一区二区三区免费乱视频| 久草成人资源| 欧美午夜视频在线观看| 国产在线a视频| 色综合久久一区二区三区| 日本精品视频在线| 神马电影在线观看| 亚洲成人一区二区在线观看| 国产老头和老头xxxx×| 亚洲精品91| 亚洲va码欧洲m码| 蜜桃视频网站在线| 欧美日韩国产首页| 一级免费黄色录像| 久久精品国产999大香线蕉| 亚洲国产欧美日韩| 日本国产一区| 久久精彩免费视频| av片免费播放| 一区二区三区中文字幕电影 | 日本高清成人vr专区| 欧美丰满一区二区免费视频| 天堂网中文在线观看| 精品一区二区影视| 五月天综合婷婷| 精品国产一区二区三区性色av| 久久久成人精品| www.成人免费视频| 午夜影视日本亚洲欧洲精品| 免费a v网站| 亚洲欧美日韩视频二区| 日本一区二区免费看| 国产精品亲子伦av一区二区三区 | 午夜小视频在线观看| 日韩欧美专区在线| 日韩精品一区二区三| 91老师片黄在线观看| 成年人视频在线免费| japanese国产精品| 成人国内精品久久久久一区| 日韩专区av| 亚洲免费小视频| 影音先锋黄色网址| 成人夜色视频网站在线观看| 亚洲欧洲日本专区| 国产精品51麻豆cm传媒 | free性欧美hd另类精品| 日韩三级在线免费观看| 四虎永久在线精品| 久久久久久久综合色一本| 自拍偷拍一区二区三区四区| 午夜激情一区| 欧美在线一区二区三区四区| av一级久久| 57pao成人永久免费视频| 夜级特黄日本大片_在线| 欧美成人精品3d动漫h| 最近免费中文字幕大全免费版视频| 国产精品一区二区三区www| 亚洲视频在线观看三级| 丰满少妇一区二区三区专区| 亚洲午夜电影| 亚洲国产一区二区三区在线| 日韩在线观看一区二区三区| 欧美一级片一区| 日本在线免费| 亚洲加勒比久久88色综合| 亚洲一级片免费看| 精品成人在线视频| 国产午夜手机精彩视频| 91老师片黄在线观看| 亚洲区 欧美区| 日本视频在线一区| 国产 日韩 亚洲 欧美| 希岛爱理av一区二区三区| 久久久久无码国产精品一区| 香蕉成人app| 国产精品稀缺呦系列在线| 高潮在线视频| 欧美美女18p| 9191在线| 亚洲色图美腿丝袜| 天堂v在线观看| 日韩欧美在线影院| 91在线播放视频| 欧美黑人猛交| 久久国产精品网站| 在线中文资源天堂| 亚洲精品影片| 日韩最新在线视频| 国产在线黄色| 精品亚洲国产视频| 日韩一区二区三区在线观看视频| 欧美日韩免费高清一区色橹橹| 69国产精品视频免费观看| 亚洲h在线观看| 国产亚洲成人av| 亚洲精品乱码久久久久久 | 九色精品蝌蚪| 国产精品久久久久久久av电影| caoporn视频在线| 国内外成人免费激情在线视频| 特级毛片在线| 欧美日韩成人精品| 少妇视频在线| 色综合久久88| 激情网站在线| 欧美激情视频三区| 青春草免费在线视频| 欧美人成在线视频| 秋霞在线午夜| 欧美激情一区二区三区久久久| 亚洲wwwww| 欧美日韩国产第一页| av网站大全在线| 九九精品视频在线| 男女视频在线| 97久久久免费福利网址| 日本在线高清| 欧美一区三区三区高中清蜜桃| 97超碰免费在线| 97国产suv精品一区二区62| 成人免费网站观看| 欧美一区二区三区图| 黄色精品视频| 成人午夜黄色影院| 亚洲专区**| 91精品久久久久久久91蜜桃| 男人的天堂最新网址| 精品一区二区免费看| 色姑娘综合天天| 成人sese在线| 鲁丝一区二区三区| 中文字幕亚洲一区二区av在线 | 中文字幕在线视频一区二区| 国产成人av电影在线观看| 催眠调教后宫乱淫校园| 91麻豆.com| 国产精品视频看看| 亚洲最快最全在线视频| 亚洲第一在线播放| 欧美羞羞免费网站| 国产乱叫456在线| 亚洲第一福利网| 国产三级视频在线播放线观看| 日韩少妇与小伙激情| 福利成人导航| 国产999精品久久久| 国产高清日韩| 鲁丝一区鲁丝二区鲁丝三区| 91亚洲人成网污www| 97碰在线视频| 日本亚洲视频在线| 国产免费a级片| 国产丝袜美腿一区二区三区| 强行糟蹋人妻hd中文| 日韩欧美成人区| 99精品免费观看| 欧美精品一二三| 人妻一区二区三区四区| 99热精品久久| 鲁丝一区鲁丝二区鲁丝三区| 久久视频国产| 欧美三级一级片| 精品一二三四区| 精品人妻无码一区二区三区| 综合网在线视频| 狠狠躁夜夜躁人人爽视频| 日韩精品一区二区三区swag| 激情小视频在线| 久久久久久高潮国产精品视| 久久国内精品| 欧美日韩一区二区视频在线观看 | 亚洲色欲色欲www在线观看| 免费中文字幕在线观看| 91国产丝袜在线播放| 国产不卡av在线播放| 一区二区欧美在线| 蜜桃av在线播放| 成人欧美一区二区| 99精品网站| 久久精品影视大全| 91视频在线观看免费| 国产亚洲成人av| 日韩色在线观看| 成人短视频在线| 国产免费久久av| 九九热视频精品| 在线看一区二区| 天堂网在线资源| 美女av一区二区| 91嫩草国产线观看亚洲一区二区 | 国产日韩一区在线| 精品国产欧美日韩| 亚洲丝袜制服诱惑| 久久久久久久久久久久久久久久久 | 久久狠狠高潮亚洲精品| 欧美大肚乱孕交hd孕妇| 黄色免费网站在线| 国产日韩欧美黄色| 日韩欧美不卡| 亚洲性生活网站| 国产亚洲短视频| 中文字幕日韩免费| 国产一区二区三区视频在线观看| 在线成人av观看| 欧美精品一区二区三区在线看午夜| 亚洲国产一区二区三区a毛片| 国产一精品一aⅴ一免费| 一个色在线综合| 好吊视频一区二区三区| 欧美激情综合色综合啪啪五月| 麻豆国产一区二区三区四区| 国产免费内射又粗又爽密桃视频| 韩日欧美一区二区三区| 丝袜美腿小色网| 欧美xxxx老人做受| 国产精选在线| 欧美日韩一区在线观看视频| 日韩经典中文字幕一区| 女人十八毛片嫩草av| 欧美人与z0zoxxxx视频| 国产原创视频在线观看| 99国精产品一二二线| 亚洲国产免费| 女人又爽又黄免费女仆| 欧美日韩中文一区| 国产原创在线观看| 国产精品国产亚洲精品看不卡15| 日韩五码在线| 成年人看的免费视频| 337p亚洲精品色噜噜狠狠| 国产精品va在线观看视色 | 欧美在线 | 亚洲| 91av视频导航| 欧美美女视频| 亚洲国产欧美91| 欧美日韩中文字幕| 中文字幕日本在线观看| 超碰97国产在线| 美女精品一区| 波多野结衣久久久久| 精品99999| 福利精品在线| av网站大全免费| 中文字幕成人在线观看| hs视频在线观看| 国产精品第一第二| 欧美欧美全黄| 国产高清一区二区三区四区| 91精品国产综合久久久蜜臀图片| 香蕉成人app免费看片| 欧美与黑人午夜性猛交久久久| 亚洲性受xxx喷奶水| 午夜精品亚洲一区二区三区嫩草| 狠狠色丁香久久婷婷综| 日韩女同强女同hd| 在线看片第一页欧美| 超碰免费在线观看| 亚洲精品美女免费| 日本欧美韩国| 久久久久久久9| 日本一区二区免费在线观看视频| 97在线播放免费观看| 性欧美激情精品| 欧美国产美女| 亚洲自拍偷拍精品| 岛国av一区|