Java 單元測試及JUnit的使用

來源:互聯網
上載者:User

標籤:java   單元測試   junit   

Java 單元測試:
 單元測試是開發人員編寫的一小段代碼,用於檢測被測代碼的一個很小的、很明確的功能是否正確。
 
 單元測試的方法:
 人工靜態分析:人工閱讀檢測代碼
 自動靜態分析:使用代碼複查工具檢查
 自動動態測試:用工具自動產生測試案例並執行被測程式
 人工動態測試:人工設定程式的輸入和預期輸出,執行程式。
 
 
 
 Junit 單元測試:
 它是人工動態測試
 支援語言C++、Java,支援的IDE: Eclipse
 功能:用單獨的classloader來運行每個單元測試
 標準的資源初始化和回收方式(setUp、tearDown)
 
 
 Eclipse 使用Junit測試的方法
 1、匯入 Junit Jar包,可以在Java Build Path 中添加,最好直接使用Eclipse 內建的JUnit套件
 2、為單元測試代碼建立單獨的目錄,單元測試代碼和被測試代碼建議使用一樣的包層結構。比如src\com\lls\Person.java 和 testSrc\com\lls\PersonTest.java
 3、建立單元測試類,可以直接通過Eclipse的Junit Test Case 功能進行添加,這樣就只需修改Source folder即可
 下面內容為Junit 4.0之後內容
 4、Junix 包所定義的註解及其意義
 方法註解
 @Before - 它所修飾的方法在每個測試方法執行之前都要執行一次。 之前沒有註解的版本叫做setUp方法
 @After  - 它所修飾的方法在每個測試方法執行之後都要執行一次。  tearDown方法
 @Test   - 測試用的方法,他可以添加參數來對特定的情況進行驗證
 比如@Test(expected=*.class)  表示的是異常的類型,如果沒有產生異常則失敗
 @Test(timeout = xxx) 表示的是測試的最大時間,逾時則認為失敗
 @ignore - 它所修飾的測試方法會被忽略
 
 其中@Before 和@After 被稱為Fixture,也就是每個測試之前都必須要執行的內容
 
 
 5、測試方法使用要求
 @Test
 public void xxx(無參)
 
 6、使用Eclipse的 Run as Juit來執行測試案例
 如果與測試結果不符,則結果為 失敗 failure
 如果測試時,直接產生異常,則結果為error
 
 
 7、測試套件
 也就是一次執行多個測試案例
 方法:建立一個空類作為測試套件的入口。使用註解RunWith和SuiteClasses修飾這個空類。
 將org.junit.runners.Suite 作為參數傳入註解RunWith,表示使用套件運行器執行。
 將測試類別組成數組作為註解SuiteClasses的參數
 
 比如:
 @RunWith(Suite.class) 
 @Suite.SuiteClasses({xx1.class, xx2.class})
 public class RunAllUtilTestsSuite {
 }

 原理及架構說明
 8、Runner 運行器
 在運行測試代碼的時候是通過Runner來運行(也就是Runner的子類),比如,預設的JUnit4ClassRunner(不過這個已經廢棄了,看來有了新的)
 它可以用@RunWith 註解來說明,需要注意的是它修飾的是類
 
 裡麵包含兩個特殊的測試,參數化測試、套件打包測試
 參數化測試:
 @RunWith(Parameterized.class)
 首先應該為這種測試專門產生一個新的類,因為他要用一個新的運行器。然後指定運行器為Parameterized。
 然後在測試類別中定義兩個變數,一個用於存放參數,另一個存放期待的結果。接下來定義測試資料的集合,用@Parameters標註進行修飾。
 建構函式中對變數進行初始化,順序需要與集合中的順序一致,比如{參數,預期結果}。
 打包測試:
 通常在一個項目中,我們需要寫很多個測試類別,打包測試就是一次執行多個或所有的測試類別.
 @RunWith(Suite.class) // 指定運行器
 @Suite.SuiteClass({..,..,..}) // 指定需要同時測試的類

待測試的類:package com.test;public class Calculator { private static int result;// 靜態變數,用於儲存運行結果 public void add(int n) {  result = result + n; } public void substract(int n) {  result = result - 1;  // Bug: 正確的應該是 result = result - n; } public void multiply(int n) { } // 此方法尚未寫好 public void divide(int n) {      result = result / n; } public void square(int n) {  result = n * n; } public void squareRoot(int n) {  for (;;)   ;  // Bug : 死迴圈 } public void clear() {  // 將結果清零  result = 0; }  public int getResult(){  return result; } }// -------------  基本測試package com.test;import static org.junit.Assert.assertEquals;import static org.junit.Assert.fail;import org.junit.After;import org.junit.Before;import org.junit.Ignore;import org.junit.Test;public class CalculatorTest { private static Calculator calculator = new Calculator();  @Before public void setUp() throws Exception {  calculator.clear(); } @After public void tearDown() throws Exception {    } @Test public void testAdd() {  calculator.add(2);   calculator.add(3);    assertEquals(5, calculator.getResult());  } @Test public void testSubstract() {  calculator.add(2);   calculator.add(3);   assertEquals(5, calculator.getResult());  } @Ignore("not implemented yet")  @Test  public void testMultiply() {  fail("Not yet implemented"); } @Test public void testDivide() {  calculator.add(8);  calculator.divide(2);  assertEquals(4, calculator.getResult()); } @Test(expected = Exception.class) public void DivideByZero(){  calculator.divide(0); } }// -----------------  多個參數測試package com.test;import static org.junit.Assert.*;import java.util.Arrays;import java.util.Collection;import org.junit.After;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.junit.runners.Parameterized;import org.junit.runners.Parameterized.Parameters;@RunWith(Parameterized.class)public class SquareTest { Calculator calculator; private int param; private int result;  public SquareTest(int param,int result) {  this.param = param;  this.result = result; }  @Before public void setUp() throws Exception {  calculator = new Calculator(); } @After public void tearDown() throws Exception { }  @Parameters public static Collection data(){  return Arrays.asList( new Object[][]{{2,4},{0,0},{-2,4}}); }  @Test public void testSquare() {  calculator.square(param);  assertEquals(calculator.getResult(),result );   }}// ---------------  打包測試@RunWith(Suite.class)@Suite.SuiteClasses({CalculatorTest.class, SquareTest.class })public class AllCalculator {}




本文出自 “技術生活” 部落格,請務必保留此出處http://6621180.blog.51cto.com/6611180/1923489

Java 單元測試及JUnit的使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.