JUnit - 基本用法

2022-02-23 16:03 更新

現(xiàn)在我們將應(yīng)用簡單的例子來一步一步教你如何使用 Junit。

JUnit的一些注意事項(xiàng):

  • 測試方法必須使用 @Test 修飾
  • 測試方法必須使用 public void 進(jìn)行修飾,不能帶參數(shù)
  • 一般使用單元測試會新建一個(gè) test 目錄存放測試代碼,在生產(chǎn)部署的時(shí)候只需要將 test 目錄下代碼刪除即可
  • 測試代碼的包應(yīng)該和被測試代碼包結(jié)構(gòu)保持一致
  • 測試單元中的每個(gè)方法必須可以獨(dú)立測試,方法間不能有任何依賴
  • 測試類一般使用 Test 作為類名的后綴
  • 測試方法使一般用 test 作為方法名的前綴

測試失敗說明:

  • Failure:一般是由于測試結(jié)果和預(yù)期結(jié)果不一致引發(fā)的,表示測試的這個(gè)點(diǎn)發(fā)現(xiàn)了問題
  • error:是由代碼異常引起的,它可以產(chǎn)生于測試代碼本身的錯(cuò)誤,也可以是被測試代碼中隱藏的 bug

一些常用注解:

  • @Test:將一個(gè)普通方法修飾成一個(gè)測試方法 @Test(excepted=xx.class): xx.class 表示異常類,表示測試的方法拋出此異常時(shí),認(rèn)為是正常的測試通過的 @Test(timeout = 毫秒數(shù)) :測試方法執(zhí)行時(shí)間是否符合預(yù)期
  • @BeforeClass: 會在所有的方法執(zhí)行前被執(zhí)行,static 方法 (全局只會執(zhí)行一次,而且是第一個(gè)運(yùn)行)
  • @AfterClass:會在所有的方法執(zhí)行之后進(jìn)行執(zhí)行,static 方法 (全局只會執(zhí)行一次,而且是最后一個(gè)運(yùn)行)
  • @Before:會在每一個(gè)測試方法被運(yùn)行前執(zhí)行一次
  • @After:會在每一個(gè)測試方法運(yùn)行后被執(zhí)行一次
  • @Ignore:所修飾的測試方法會被測試運(yùn)行器忽略
  • @RunWith:可以更改測試運(yùn)行器 org.junit.runner.Runner
  • Parameters:參數(shù)化注解

創(chuàng)建一個(gè)類

  • C:\ > JUNIT_WORKSPACE 路徑下創(chuàng)建一個(gè)名為 MessageUtil.java 的類用來測試。
/*
* This class prints the given message on console.
*/
public class MessageUtil {

   private String message;

   //Constructor
   //@param message to be printed
   public MessageUtil(String message){
      this.message = message;
   }

   // prints the message
   public String printMessage(){
      System.out.println(message);
      return message;
   }   
}  

創(chuàng)建 Test Case 類

  • 創(chuàng)建一個(gè)名為 TestJunit.java 的測試類。
  • 向測試類中添加名為 testPrintMessage() 的方法。
  • 向方法中添加 Annotaion @Test。
  • 執(zhí)行測試條件并且應(yīng)用 Junit 的 assertEquals API 來檢查。

C:\ > JUNIT_WORKSPACE路徑下創(chuàng)建一個(gè)文件名為 TestJunit.java 的類

import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {

   String message = "Hello World";  
   MessageUtil messageUtil = new MessageUtil(message);

   @Test
   public void testPrintMessage() {
      assertEquals(message,messageUtil.printMessage());
   }
}

創(chuàng)建 Test Runner 類

  • 創(chuàng)建一個(gè) TestRunner 類
  • 運(yùn)用 JUnit 的 JUnitCore 類的 runClasses 方法來運(yùn)行上述測試類的測試案例
  • 獲取在 Result Object 中運(yùn)行的測試案例的結(jié)果
  • 獲取 Result Object 的 getFailures() 方法中的失敗結(jié)果
  • 獲取 Result object 的 wasSuccessful() 方法中的成功結(jié)果

C:\ > JUNIT_WORKSPACE 路徑下創(chuàng)建一個(gè)文件名為 TestRunner.java 的類來執(zhí)行測試案例

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(TestJunit.class);
      for (Failure failure : result.getFailures()) {
         System.out.println(failure.toString());
      }
      System.out.println(result.wasSuccessful());
   }
}   

用 javac 編譯 MessageUtil、Test case 和 Test Runner 類。

C:\JUNIT_WORKSPACE>javac MessageUtil.java TestJunit.java TestRunner.java

現(xiàn)在運(yùn)行 Test Runner,它可以運(yùn)行在所提供的 Test Case 類中定義的測試案例。

C:\JUNIT_WORKSPACE>java TestRunner

檢查運(yùn)行結(jié)果

Hello World
true

現(xiàn)在更新 C:\ > JUNIT_WORKSPACE 路徑下的 TestJunit,并且檢測失敗。改變消息字符串。

import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {

   String message = "Hello World";  
   MessageUtil messageUtil = new MessageUtil(message);

   @Test
   public void testPrintMessage() {
      message = "New Word";
      assertEquals(message,messageUtil.printMessage());
   }
}

讓我們保持其他類不變,再次嘗試運(yùn)行相同的 Test Runner

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(TestJunit.class);
      for (Failure failure : result.getFailures()) {
         System.out.println(failure.toString());
      }
      System.out.println(result.wasSuccessful());
   }
}

現(xiàn)在運(yùn)行在 Test Case 類中提供的即將運(yùn)行測試案例的 Test Runner

C:\JUNIT_WORKSPACE>java TestRunner

檢查運(yùn)行結(jié)果

Hello World
testPrintMessage(TestJunit): expected:<[New Wor]d> but was:<[Hello Worl]d>
false


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號