成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

編寫更好的 Java 單元測試的 7 個技巧

瀏覽:112日期:2022-09-05 15:05:26

測試是開發的一個非常重要的方面,可以在很大程度上決定一個應用程序的命運。良好的測試可以在早期捕獲導致應用程序崩潰的問題,但較差的測試往往總是導致故障和停機。

雖然有三種主要類型的軟件測試:單元測試,功能測試和集成測試,但是在這篇博文中,我們將討論開發人員級單元測試。在我深入講述具體細節之前,讓我們先來回顧一下這三種測試的詳細內容。

編寫更好的 Java 單元測試的 7 個技巧

軟件開發測試的類型

單元測試用于測試各個代碼組件,并確保代碼按照預期的方式工作。單元測試由開發人員編寫和執行。大多數情況下,使用JUnit或TestNG之類的測試框架。測試用例通常是在方法級別寫入并通過自動化執行。

集成測試檢查系統是否作為一個整體而工作。集成測試也由開發人員完成,但不是測試單個組件,而是旨在跨組件測試。系統由許多單獨的組件組成,如代碼,數據庫,Web服務器等。集成測試能夠發現如組件布線,網絡訪問,數據庫問題等問題。

功能測試通過將給定輸入的結果與規范進行比較來檢查每個功能是否正確實現。通常,這不是在開發人員級別的。功能測試由單獨的測試團隊執行。測試用例基于規范編寫,并且實際結果與預期結果進行比較。有若干工具可用于自動化的功能測試,如Selenium和QTP。

如前所述,單元測試可幫助開發人員確定代碼是否正常工作。在這篇博文中,我將提供在Java中單元測試的有用提示。

1.使用框架來用于單元測試

Java提供了若干用于單元測試的框架。TestNG和JUnit是最流行的測試框架。JUnit和TestNG的一些重要功能:

易于設置和運行。 支持注釋。 允許忽略或分組并一起執行某些測試。 支持參數化測試,即通過在運行時指定不同的值來運行單元測試。 通過與構建工具,如Ant,Maven和Gradle集成來支持自動化的測試執行。

EasyMock是一個模擬框架,是單元測試框架,如JUnit和TestNG的補充。EasyMock本身不是一個完整的框架。它只是添加了創建模擬對象以便于測試的能力。例如,我們想要測試的一個方法可以調用從數據庫獲取數據的DAO類。在這種情況下,EasyMock可用于創建返回硬編碼數據的MockDAO。這使我們能夠輕松地測試我們意向的方法,而不必擔心數據庫訪問。

2.謹慎使用測試驅動開發!

測試驅動開發(TDD)是一個軟件開發過程,在這過程中,在開始任何編碼之前,我們基于需求來編寫測試。由于還沒有編碼,測試最初會失敗。然后寫入最小量的代碼以通過測試。然后重構代碼,直到被優化。

目標是編寫覆蓋所有需求的測試,而不是一開始就寫代碼,卻可能甚至都不能滿足需求。TDD是偉大的,因為它導致簡單的模塊化代碼,且易于維護。總體開發速度加快,容易發現缺陷。此外,單元測試被創建作為TDD方法的副產品。

然而,TDD可能不適合所有的情況。在設計復雜的項目中,專注于最簡單的設計以便于通過測試用例,而不提前思考可能會導致巨大的代碼更改。此外,TDD方法難以用于與遺留系統,GUI應用程序或與數據庫一起工作的應用程序交互的系統。另外,測試需要隨著代碼的改變而更新。

因此,在決定采用TDD方法之前,應考慮上述因素,并應根據項目的性質采取措施。

3.測量代碼覆蓋率

代碼覆蓋率衡量(以百分比表示)了在運行單元測試時執行的代碼量。通常,高覆蓋率的代碼包含未檢測到的錯誤的幾率要低,因為其更多的源代碼在測試過程中被執行。測量代碼覆蓋率的一些最佳做法包括:

使用代碼覆蓋工具,如Clover,Corbetura,JaCoCo或Sonar。使用工具可以提高測試質量,因為這些工具可以指出未經測試的代碼區域,讓你能夠開發開發額外的測試來覆蓋這些領域。 每當寫入新功能時,立即寫新的測試覆蓋。 確保有測試用例覆蓋代碼的所有分支,即if / else語句。

高代碼覆蓋不能保證測試是完美的,所以要小心!

下面的 concat 方法接受布爾值作為輸入,并且僅當布爾值為true時附加傳遞兩個字符串:

public String concat(boolean append, String a,String b) {String result = null;If (append) { result = a + b; }return result.toLowerCase();}

以下是上述方法的測試用例:

@Testpublic void testStringUtil() { String result = stringUtil.concat(true, 'Hello ', 'World'); System.out.println('Result is '+result);}

在這種情況下,執行測試的值為true。當測試執行時,它將通過。當代碼覆蓋率工具運行時,它將顯示100%的代碼覆蓋率,因為 concat 方法中的所有代碼都被執行。但是,如果測試執行的值為false,則將拋出 NullPointerException 。所以100%的代碼覆蓋率并不真正表明測試覆蓋了所有場景,也不能說明測試良好。

4.盡可能將測試數據外部化

在JUnit4之前,測試用例要運行的數據必須硬編碼到測試用例中。這導致了限制,為了使用不同的數據運行測試,測試用例代碼必須修改。但是,JUnit4以及TestNG支持外部化測試數據,以便可以針對不同的數據集運行測試用例,而無需更改源代碼。

下面的 MathChecker 類有方法可以檢查一個數字是否是奇數:

public class MathChecker {public Boolean isOdd(int n) { if (n%2 != 0) {return true; } else {return false; }} }

以下是MathChecker類的TestNG測試用例:

public class MathCheckerTest {private MathChecker checker;@BeforeMethodpublic void beforeMethod() { checker = new MathChecker();}@Test@Parameters('num')public void isOdd(int num) { System.out.println('Running test for '+num); Boolean result = checker.isOdd(num); Assert.assertEquals(result, new Boolean(true));} } TestNG

以下是testng.xml(用于TestNG的配置文件),它具有要為其執行測試的數據:

<?xml version='1.0' encoding='UTF-8'?> <suite name='ParameterExampleSuite' parallel='false'> <test name='MathCheckerTest'> <classes> <parameter name='num' value='3'></parameter> <class name='com.stormpath.demo.MathCheckerTest'/> </classes> </test> <test name='MathCheckerTest1'> <classes> <parameter name='num' value='7'></parameter> <class name='com.stormpath.demo.MathCheckerTest'/> </classes> </test> </suite>

可以看出,在這種情況下,測試將執行兩次,值3和7各一次。除了通過XML配置文件指定測試數據之外,還可以通過DataProvider注釋在類中提供測試數據。

JUnit

與TestNG類似,測試數據也可以外部化用于JUnit。以下是與上述相同MathChecker類的JUnit測試用例:

@RunWith(Parameterized.class) public class MathCheckerTest { private int inputNumber; private Boolean expected; private MathChecker mathChecker; @Before public void setup(){ mathChecker = new MathChecker(); }// Inject via constructorpublic MathCheckerTest(int inputNumber, Boolean expected) { this.inputNumber = inputNumber; this.expected = expected;}@Parameterized.Parameterspublic static Collection<Object[]> getTestData() { return Arrays.asList(new Object[][]{ {1, true}, {2, false}, {3, true}, {4, false}, {5, true} });}@Testpublic void testisOdd() { System.out.println('Running test for:'+inputNumber); assertEquals(mathChecker.isOdd(inputNumber), expected);} }

可以看出,要對其執行測試的測試數據由getTestData()方法指定。此方法可以輕松地修改為從外部文件讀取數據,而不是硬編碼數據。

5.使用斷言而不是Print語句

許多新手開發人員習慣于在每行代碼之后編寫System.out.println語句來驗證代碼是否正確執行。這種做法常常擴展到單元測試,從而導致測試代碼變得雜亂。除了混亂,這需要開發人員手動干預去驗證控制臺上打印的輸出,以檢查測試是否成功運行。更好的方法是使用自動指示測試結果的斷言。

下面的 StringUti 類是一個簡單類,有一個連接兩個輸入字符串并返回結果的方法:

public class StringUtil {public String concat(String a,String b) { return a + b;} }

以下是上述方法的兩個單元測試:

@Test public void testStringUtil_Bad() { String result = stringUtil.concat('Hello ', 'World'); System.out.println('Result is '+result); } @Test public void testStringUtil_Good() { String result = stringUtil.concat('Hello ', 'World'); assertEquals('Hello World', result); }

testStringUtil_Bad將始終傳遞,因為它沒有斷言。開發人員需要手動地在控制臺驗證測試的輸出。如果方法返回錯誤的結果并且不需要開發人員干預,則testStringUtil_Good將失敗。

6.構建具有確定性結果的測試

一些方法不具有確定性結果,即該方法的輸出不是預先知道的,并且每一次都可以改變。例如,考慮以下代碼,它有一個復雜的函數和一個計算執行復雜函數所需時間(以毫秒為單位)的方法:

public class DemoLogic { private void veryComplexFunction(){//This is a complex function that has a lot of database access and is time consuming//To demo this method, I am going to add a Thread.sleep for a random number of millisecondstry { int time = (int) (Math.random()*100); Thread.sleep(time);} catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace();} } public long calculateTime(){long time = 0;long before = System.currentTimeMillis();veryComplexFunction();long after = System.currentTimeMillis();time = after - before;return time; } }

在這種情況下,每次執行 calculateTime 方法時,它將返回一個不同的值。為該方法編寫測試用例不會有任何用處,因為該方法的輸出是可變的。因此,測試方法將不能驗證任何特定執行的輸出。

7.除了正面情景外,還要測試負面情景和邊緣情況

通常,開發人員會花費大量的時間和精力編寫測試用例,以確保應用程序按預期工作。然而,測試負面測試用例也很重要。負面測試用例指的是測試系統是否可以處理無效數據的測試用例。例如,考慮一個簡單的函數,它能讀取長度為8的字母數字值,由用戶鍵入。除了字母數字值,應測試以下負面測試用例:

用戶指定非字母數字值,如特殊字符。 用戶指定空值。 用戶指定大于或小于8個字符的值。

類似地,邊界測試用例測試系統是否適用于極端值。例如,如果用戶希望輸入從1到100的數字值,則1和100是邊界值,對這些值進行測試系統是非常重要的。

來自:http://blog.csdn.net/qq_35101189/article/details/53925268

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品裸体一区二区三区| 欧美区视频在线观看| 欧美视频福利| 91影院在线观看| 91麻豆成人久久精品二区三区| 成人免费av资源| 91小视频免费看| 亚洲视频综合| 国产欧美日韩一级| 欧美亚洲免费| 久久大逼视频| 国产一区二区91| 国产一区二区美女诱惑| 久久久福利视频| 久久久久免费| 在线观看www91| 51久久夜色精品国产麻豆| 日韩欧美一级在线播放| 久久久91精品国产一区二区精品 | 99视频+国产日韩欧美| 国产日韩一区二区三区在线| 久久亚洲视频| 欧美精品1区2区| 国产亚洲精品福利| 一区二区三区欧美日| 日本不卡不码高清免费观看| 色94色欧美sute亚洲线路一ni| 日韩不卡手机在线v区| 欧美日韩免费观看一区三区| 欧美日韩一区精品| 日韩精品一区二区三区蜜臀| 中文字幕欧美日韩一区| 亚洲高清免费视频| 国产一区二区三区四| 欧美日韩一区二区三区在线观看免 | 先锋影音国产一区| 欧美日韩成人综合| 中文子幕无线码一区tr | 99国产精品视频免费观看一公开 | 日韩一区二区三区在线| 国产日韩欧美制服另类| 香蕉加勒比综合久久| 成人在线视频首页| 亚洲免费影院| 久久亚区不卡日本| 天天色 色综合| 91论坛在线播放| 色欧美88888久久久久久影院| 337p日本欧洲亚洲大胆色噜噜| 一区二区三区欧美日韩| 国产成人免费网站| 亚洲女同同性videoxma| 久久这里只有精品视频网| 亚洲国产毛片aaaaa无费看 | 欧美一区二区在线看| 亚洲精品乱码久久久久久黑人| 国产一区二区精品久久91| 91久久国产自产拍夜夜嗨| 日韩一级免费一区| 日韩精品一卡二卡三卡四卡无卡| 99精品黄色片免费大全| 欧美色手机在线观看| 亚洲色图欧美激情| 97精品超碰一区二区三区| 在线观看www91| 亚洲自拍都市欧美小说| 欧美在线亚洲综合一区| 欧美日韩在线观看一区二区| 一区二区三区日韩精品视频| 99久久免费国产| 91精品国产一区二区三区蜜臀| 午夜日韩在线观看| 亚洲国产精品一区制服丝袜 | 亚洲人妖av一区二区| 972aa.com艺术欧美| 欧美日韩视频在线观看一区二区三区 | 最新中文字幕一区二区三区| zzijzzij亚洲日本少妇熟睡| 在线精品视频一区二区| 日韩美女久久久| 国产欧美二区| 国产成人自拍网| 亚洲国产经典视频| 狼狼综合久久久久综合网| 成人一级视频在线观看| 国产欧美久久久精品影院| 中文精品一区二区三区| 日本在线不卡视频一二三区| 精品久久人人做人人爰| 久久成人综合网| 国产在线一区观看| 久久久久久自在自线| 亚洲国产美国国产综合一区二区| 亚洲国产精品www| 亚洲人123区| 99精品国产在热久久下载| 国产精品国产自产拍高清av | 夜夜嗨av一区二区三区网站四季av| 国产女人18水真多18精品一级做 | 久久久夜夜夜| 日韩精品成人一区二区在线| 久久精品中文| 蜜桃在线一区二区三区| 91黄色激情网站| 狠狠色丁香婷综合久久| 日韩午夜在线观看| www.亚洲在线| 亚洲国产精品高清| 亚洲巨乳在线| 午夜电影一区二区| 欧美日韩一区二区在线观看| 国产呦萝稀缺另类资源| 日韩欧美中文字幕精品| 91香蕉国产在线观看软件| 亚洲欧美怡红院| 久久国产精品亚洲77777| 天堂一区二区在线| 欧美精品久久99久久在免费线| 岛国精品在线观看| 国产精品拍天天在线| 亚洲综合二区| 精品亚洲porn| 久久久久国产成人精品亚洲午夜 | 国产午夜精品一区二区三区嫩草| 狠狠综合久久av一区二区老牛| 亚洲国产精品一区二区www在线| 在线观看视频一区二区欧美日韩| 国产盗摄女厕一区二区三区| 91精品国产91久久久久久最新毛片 | 国产精品免费免费| 国产精品www994| 亚洲电影激情视频网站| 6080国产精品一区二区| 欧美一区二区三区四区夜夜大片| 亚洲免费看黄网站| 欧美日韩中文字幕精品| 91在线精品一区二区三区| 亚洲精品大片www| 欧美精品777| 狠狠爱www人成狠狠爱综合网 | k8久久久一区二区三区| 亚洲精品第1页| 日韩欧美亚洲国产另类 | 一区二区三区四区激情| 91在线无精精品入口| 精品国产乱码久久久久久老虎| 激情久久综合| 黄网站免费久久| 亚洲天堂中文字幕| 在线不卡中文字幕播放| 亚洲人体一区| 国产成人免费视频网站高清观看视频| 国产精品国产三级国产aⅴ中文 | 亚洲宅男天堂在线观看无病毒| 在线成人av网站| 性欧美精品高清| 91色综合久久久久婷婷| 亚洲国产精品久久不卡毛片| 欧美精品一区男女天堂| 日本高清免费不卡视频| 欧美系列一区| 丁香六月久久综合狠狠色| 偷偷要91色婷婷| 亚洲私人黄色宅男| 欧美军同video69gay| 亚洲深夜影院| 不卡的av电影| 极品销魂美女一区二区三区| 一二三区精品福利视频| 欧美激情资源网| 欧美不卡一区二区三区| 欧美亚洲另类激情小说| 国产精品一区二区你懂得| 色综合久久中文字幕| 国产成人一级电影| 免费看黄色91| 亚洲国产你懂的| 亚洲美女屁股眼交| 国产日韩在线不卡| 欧美一级爆毛片| 欧美日韩免费不卡视频一区二区三区 | 免费在线欧美黄色| 亚洲国产裸拍裸体视频在线观看乱了中文| 成人一区二区在线观看| 国产在线精品免费| 日本v片在线高清不卡在线观看| 亚洲另类色综合网站| 国产精品欧美极品| 日本一区二区久久| 久久久久久日产精品| 精品少妇一区二区三区| 欧美一区二区精品| 欧美一区二区三区视频免费播放| 欧美在线你懂的| 欧美三级在线播放| 欧美美女bb生活片| 51午夜精品国产| 欧美日韩国产高清一区二区三区| 欧美性大战久久| 欧美三级资源在线|