回覆列表
  • 1 # java進階提薪王

    一般來說,Java程式設計師要編寫更好的單元測試,可以從以下7個方面改善:

    1、首先需要全面瞭解軟體開發測試的型別。單元測試用於測試各個程式碼元件,並確保程式碼按照預期的方式工作。

    2、使用框架來用於單元測試。Java提供了若干用於單元測試的框架。TestNG和JUnit是最流行的測試框架

    3、謹慎使用測試驅動開發。測試驅動開發(TDD)是一個軟體開發過程,在這過程中,在開始任何編碼之前,我們基於需求來編寫測試。由於還沒有編碼,測試最初會失敗。然後寫入最小量的程式碼以透過測試。然後重構程式碼,直到被最佳化。

    4、測量程式碼覆蓋率。程式碼覆蓋率衡量(以百分比表示)了在執行單元測試時執行的程式碼量。通常,高覆蓋率的程式碼包含未檢測到的錯誤的機率要低,因為其更多的原始碼在測試過程中被執行。

    5、儘可能將測試資料外部化。在JUnit4之前,測試用例要執行的資料必須硬編碼到測試用例中。這導致了限制,為了使用不同的資料執行測試,測試用例程式碼必須修改。

    6、善用JUnit。與TestNG類似,測試資料也可以外部化用於JUnit。

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

  • 2 # Java架構達人

    一、概述

    1、 單元測試(模組測試)是開發者編寫的一小段程式碼,用於檢驗被測程式碼的一個很小的、很明確的功能是否正確。

    2、一般認為,在結構化程式時代,單元測試所說的單元是指函式,在當今的面向物件時代,單元測試所說的單元是指類。以我的實踐來看,以類作為測試單位,複雜度高,可操作性較差,因此仍然主張以函式作為單元測試的測試單位

    3、有一種看法是,只測試類的介面(公有函式),不測試其他函式,從面向物件角度來看,確實有其道理,但是,測試的目的是找錯並最終排錯,因此,只要是包含錯誤的可能性較大的函式都要測試,跟函式是否私有沒有關係

    二、單元測試設計思想

    1、單元測試可以借鑑類似功能測試的思想來進行設計

    2、一個待測試類當作一個功能塊,待測試類當中的方法當作一個小的功能點,

    單元測試就理解為對這個待測試方法進行場景設計,編寫程式碼,檢視執行各場景結果和場景覆蓋率

    3、單元測試場景設計可以採用因果分析的方法,將各個引數的組合當作各條件組合,將輸入引數後執行方法的結果當作是各條件組合後的結果

    三、單元測試設計(採用因果分析法)

    1、確定待測試模組即建立測試類

    Game類及對應的Game測試類

    package test.testDemo;public class Game { public String winGame(int num1,int num2) { int num=num1-num2; String txt=null; if(num>0) { txt="奪獎成功!"; }else if(num==0) { txt="安慰獎!"; }else { txt="奪獎失敗!"; } return txt; } }package test.testDemo;import static org.junit.Assert.*;import org.junit.Test;public class GameTest { @Test public void testWinGame() { fail("Not yet implemented"); } }

    2、分析因果條件列出場景並進行用例設計

    3、單元測試用例編寫

    3.1 引數化

    3.1.1 引入待測試類,定義引數

    3.1.2 引入註解@RunWith(Parameterized.class)引數化測試類

    3.1.3 編寫需用到的引數的建構函式

    3.1.4 編寫引數資料初始化方法

    package test.testDemo;import java.util.Arrays;import java.util.Collection;import org.junit.Test;import org.junit.runner.RunWith;import org.junit.runners.Parameterized;import org.junit.runners.Parameterized.Parameters;//引入註解@RunWith(Parameterized.class)引數化測試類@RunWith(Parameterized.class)public class GameTest { //引入待測試類,定義引數 private Game game=new Game(); private int num1; private int num2; private String expected; //編寫需用到的引數的建構函式 public GameTest(int num1, int num2,String expected) { super(); this.num1 = num1; this.num2 = num2; this.expected=expected; } //編寫引數資料初始化方法 @Parameters public static Collection<Object[]> data(){ return Arrays.asList(new Object[][] {{2,1,"奪獎成功!"},{2,2,"安慰獎!"},{1,2,"奪獎失敗!"}}); } @Test public void testWinGame() { } }

    3.2 編寫單元測試方法

    @Test public void testWinGame() { String txt=game.winGame(num1, num2); Assert.assertEquals(expected, txt); }

    四、執行單元測試用例,檢查覆蓋率,覆蓋率需eclipse中安裝EclEmma外掛

    1、選中測試類》右鍵選中Coverage As》Junit Test

    2、執行結果如下

  • 中秋節和大豐收的關聯?
  • 米勒推開喬丹投中絕殺,這球犯規了嗎?喬丹怎麼迴應的?後來發生了什麼?