JUnit入門筆記

References:git

  1. http://mark-yang.github.io/blog/2015/05/17/junit/
  2. JUnit官方

Introduction

簡單介紹一下概念。github

所謂測試用例

  1. 從開發的角度,所謂測試用例,主要是方便在開發、重構過程當中,對代碼邏輯、編輯條件的一些測試。
  2. 若是不使用測試用例的寫法,能夠每一個.java文件都寫一個main方法進行測試。
  3. 然而,main方法測試的手段,low,而且不利於重用。
  4. 因而,在java中,經常使用JUnit框架,對代碼進行測試。

Java中測試基本概念

  1. 測試單元:對一個類進行測試。
  2. 建議僅對public方法進行測試。

JUnit 踩坑

安裝

下載 JUnit-xxx.jar (下載地址) 和 Hamcrest(點擊直接下載) ,放在一個文件夾下web

第一個測試用例

  1. 按照官方推薦,編寫一個java類
public class Calculator {
  public int evaluate(String expression) {
    int sum = 0;
    for (String summand: expression.split("\\+"))
      sum += Integer.valueOf(summand);
    return sum;
  }
}
  1. 編譯這個文件
javac Calculator.java

目錄下出現 Calculator.classspring

  1. 而後編寫一個Test.java文件:
import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class CalculatorTest {
  @Test
  public void evaluatesExpression() {
    Calculator calculator = new Calculator();
    int sum = calculator.evaluate("1+2+3");
    assertEquals(6, sum);
  }
}

以上。express

  1. 編譯Test.java
# Linux or MacOS
javac -cp .:junit-4.XX.jar:hamcrest-core-1.3.jar CalculatorTest.java

# Windows
javac -cp .;junit-4.XX.jar;hamcrest-core-1.3.jar CalculatorTest.java

以上。bash

  1. 運行測試用例
# Linux or MacOS
java -cp .:junit-4.XX.jar:hamcrest-core-1.3.jar org.junit.runner.JUnitCore CalculatorTest

# Windows
java -cp .;junit-4.XX.jar;hamcrest-core-1.3.jar org.junit.runner.JUnitCore CalculatorTest

# 如下爲輸出:
JUnit version 4.12
.
Time: 0.006

OK (1 test)
  1. 讓測試用例失敗
    Test.java中修改assert相關項,重複 4-5,輸出以下:
JUnit version 4.12
.E
Time: 0.006
There was 1 failure:
1) evaluatesExpression(CalculatorTest)
java.lang.AssertionError: expected:<8> but was:<6>
    at org.junit.Assert.fail(Assert.java:88)
    at org.junit.Assert.failNotEquals(Assert.java:834)
    ...
FAILURES!!!
Tests run: 1,  Failures: 1:

結合 Intellij IDEA

  1. 先隨便寫個類,拿來測試
package fc.learn.java.junit;

public class BaobaoFeng {

    public void awei18shi(){
        laohanTuiche();
        guanyinzuolian();
        zhongchu();
        dulongzuan();
    }

    public void laohanTuiche(){
        System.out.println("laohantuiche!");
    }

    private void guanyinzuolian(){
        System.out.println("guanyinzuolian!");
    }

    private int zhongchu(){
        return 1;
    }

    public String dulongzuan(){
        return "dulongzuan!";
    }

    public String lianxuzhongchu(int param){
        if (param < 5){
            throw new IllegalArgumentException("test exception!");
        }
        return "lianxuzhongchu";
    }

}

以上。intellij-idea

  1. 在類名 BaobaoFeng 出,點開 quickLips:
    image
    直接點擊create:
    image
    完成,就創建了一個BaobaoFengTest.java。能夠看到,這裏不支持private方法的。
package fc.learn.java.junit;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class BaobaoFengTest {

    BaobaoFeng fengbaobao;

    @Before
    public void setUp() throws Exception {
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void awei18shi() {
    }

    @Test
    public void laohanTuiche() {
    }

    @Test
    public void dulongzuan() {
    }

    @Test
    public void lianxuzhongchu(){
    }
}

以上。app

  1. 要測試哪一個方法,就在Test.java中的對應方法編寫測試用例,而後右鍵運行便可。
    好比我要測試dulongzuan()方法的返回值,能夠以下:
    image
    image
    image

用JUnit測試web項目中DAO層

  1. 和上一節中的步驟2相同,能夠在 Interface 上打開 quickTips,自動建立Test文件。
  2. 在Class前加@RunWith@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/config/context/appcontext-*.xml")

public class TryJunitDaoTest {

    @Autowired
    TryJunitDao tryJunitDao;

    @Test
    @Transactional  //  此處加上Transactional註解,測試完成以後會回滾
    public void insert() {
        TryJunitDto dto = new TryJunitDto();
        tryJunitDao.insert(dto)
    }

    @Test
    public void select() {
        TryJunitDto dto = tryJunitDao.select();
        Assert.assertNotEquals(dto, null);
    }
}

用 JUnit 模擬請求

實際上,模擬請求,關鍵是Mock,和JUnit關係不是特別大。框架

  1. 一樣,生成 Test.java 文件,而後
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
        "classpath:/config/spring/appcontext-*.xml",
        "file:src/main/webapp/WEB-INF/servlet-context.xml"
})
public class MockRequestControllerTest {
    @Autowired
    private MockRequestController mockRequestController;

    @Test
    public void testAcceptRequest() throws Exception {
        // 這裏,構造 MockRequest
        MockHttpServletRequest request = new MockHttpServletRequest();
        request.setAttribute("user", "user");

        mockRequestController.acceptRequest(request);
    }
}
相關文章
相關標籤/搜索