Java用JUnit進行單元測試

jikexue 8年前發布 | 21K 次閱讀 JUnit 單元測試 Java開發

單元測試應該是開發人員必備的技能,但又是開發人員最容易忽略的內容。我是一個Android Coder,接下來從零開始學習使用JUnit進行單元測試。

1 最原始的寫法

1.1 準備

創建一個文件夾作為工作文件夾。

1.2 下載

這里我們需要下載兩個東西:

junit.jar

hamcrest-core.jar

我這里下載了4.12版本的JUnit和1.3版本的hamcrest。下載完成之后,拷貝到工作文件夾。

1.3 編寫Java類

在工作文件夾創建編寫Java類。

import java.lang.String;
import java.lang.Integer;

public class Calculate{

    public int evaluate(String expression) {
        int sum = 0;
        for (String summand: expression.split("\\+"))
            sum += Integer.valueOf(summand);
        return sum;
    }

}

然后通過Java命令行編譯該類:

javac Calculate.java

1.4 編寫測試類

在工作文件夾創建編寫測試類

import static org.junit.Assert.assertEquals;
import org.junit.Test;


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

然后使用命令行編譯該類:

javac -cp .:junit-4.12.jar CalculateTest.java

1.5 運行測試

使用命令行:

java -cp .:junit-4.12.jar:hamcrest-core-1.3.jar org.junit.runner.JUnitCore CalculateTest

結果:

JUnit version 4.12
.
Time: 0.004

OK (1 test)

1.6 測試失敗的情況

更改Java類為:

import java.lang.String;
import java.lang.Integer;

public class Calculate{

    public int evaluate(String expression) {
        int sum = 0;
        for (String summand: expression.split("\\+"))
            sum -= Integer.valueOf(summand); //這里改為-
        return sum;
    }

}

重新編譯,運行測試。結果:

JUnit version 4.12
.E
Time: 0.009
There was 1 failure:
1) evaluatesExpression(CalculateTest)
java.lang.AssertionError: expected:<6> 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

最基礎的用法完成Java的單元測試。我們進行單元測試肯定不會這么麻煩。但是要知道,我們使用任何框架或者編輯器,他們在背后做的事情大概也就是這些。那接下來,仍然手工來做一個使用Gradle構建的Java工程的測試寫法。

2 對使用Gradle構建的Java項目進行單元測試

2.1 使用Gradle構建Java工程

估計,即使是使用過Gradle構建的人,也很少有人手動使用grad

2.1.1 準備

仍然是創建一個文件夾作為我們的工程文件夾。

2.1.2 創建build.gradle文件

在這個文件夾下面創建一個build.gradle文件,內容:

apply plugin: 'java'

2.1.3 創建Java工程結構并編寫代碼

然后在工程文件夾下創建Java工程結構,并在src/main/java下創建一個文件,Calculator文件。PS:我創建的工程文件夾叫Gradle。

Calculator.java

import java.lang.String;

public class Calculator{

    public int add(int a, int b){
        return a + b ; 
    }

    public static void main(String[] args) {
        Calculator calculator = new Calculator() ; 
        int result = calculator.add(1,2) ; 
        System.out.println(String.valueOf(result));
    }
}

2.1.4 使用gradle構建工程

在工程文件夾下使用命令行gradle build構建工程。

gradle build

然后查看工程文件夾:

我們可以看到多出了build文件夾,這個就是使用gradle構建出的內容。我們可以看到有class和jar文件。那么我們去運行一下試一試。

我們看到,輸出3,正是我們程序預期的結果。OK這樣我們就使用gradle構建好了一個最基礎的Java工程了。接下來為我們的工程添加測試文件。

2.2 使用JUnit進行單元測試

2.2.1 添加依賴

首先我們需要在build.gradle中添加依賴,那么更改之后的build.gradle文件如下。

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
  testCompile 'junit:junit:4.12'
}

2.2.2 添加單元測試代碼

在 src/test/java 中創建 CalculatorTest.java 文件:

內容如下:

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class CalculatorTest {

    @Test
    public void evaluatesExpression() {
        Calculator calculate = new Calculator();
        int sum = calculate.add(1,2);
        assertEquals(3, sum);
    }
}

2.2.3 使用gradle重新構建

在命令行中執行:

gradle build

結果如下:

從結果看貌似并沒有什么不同,那么,我們看一下新的目錄結構:

從目錄結構中我們可以看出多了很多東西。

打開build/reports/tests/test/index.html

在網頁中顯示測試結果,100%通過。那么我們試一試沒有通過的情況。

2.2.4 測試失敗情況

將原來的Calculator.java改為如下:

import java.lang.String;

public class Calculator{

    public int add(int a, int b){
        return a - b ; //這里改成減號
    }

    public static void main(String[] args) {
        Calculator calculator = new Calculator() ; 
        int result = calculator.add(1,2) ; 
        System.out.println(String.valueOf(result));
    }
}

然后在使用Gradle構建:

我們可以看到失敗了。然后它提示我們有一個報告文件。那么我們就去看看這個報告文件。

可以看到,我們非常成功的失敗了!

3 結束語

你可以看到,我都是通過手動構建的工程。沒有使用任何IDE。這種方式肯定不實用,但對于我們開始學習打下一個好的基礎非常重要,這可以讓你非常清楚IDE為我們做了哪些事情,當出現問題的時候不至于摸不著頭腦。我還手工用Gradle構建過Android工程,用Maven也構建過Java和Android工程。從那以后自己對哪些目錄結構就很清晰明了了。

自己也剛剛學習單元測試。如果有什么不對的地方還請斧正!學識尚淺,還望大家多多指教!

 

來自:http://www.jianshu.com/p/e4e99b62a203

 

 本文由用戶 jikexue 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!