Java用JUnit進行單元測試

單元測試應(yīng)該是開發(fā)人員必備的技能,但又是開發(fā)人員最容易忽略的內(nèi)容。我是一個Android Coder,接下來從零開始學(xué)習(xí)使用JUnit進行單元測試。

1 最原始的寫法

1.1 準備

創(chuàng)建一個文件夾作為工作文件夾。

1.2 下載

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

junit.jar

hamcrest-core.jar

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

1.3 編寫Java類

在工作文件夾創(chuàng)建編寫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 編寫測試類

在工作文件夾創(chuàng)建編寫測試類

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

結(jié)果:

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;
    }

}

重新編譯,運行測試。結(jié)果:

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

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

2 對使用Gradle構(gòu)建的Java項目進行單元測試

2.1 使用Gradle構(gòu)建Java工程

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

2.1.1 準備

仍然是創(chuàng)建一個文件夾作為我們的工程文件夾。

2.1.2 創(chuàng)建build.gradle文件

在這個文件夾下面創(chuàng)建一個build.gradle文件,內(nèi)容:

apply plugin: 'java'

2.1.3 創(chuàng)建Java工程結(jié)構(gòu)并編寫代碼

然后在工程文件夾下創(chuàng)建Java工程結(jié)構(gòu),并在src/main/java下創(chuàng)建一個文件,Calculator文件。PS:我創(chuàng)建的工程文件夾叫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構(gòu)建工程

在工程文件夾下使用命令行g(shù)radle build構(gòu)建工程。

gradle build

然后查看工程文件夾:

我們可以看到多出了build文件夾,這個就是使用gradle構(gòu)建出的內(nèi)容。我們可以看到有class和jar文件。那么我們?nèi)ミ\行一下試一試。

我們看到,輸出3,正是我們程序預(yù)期的結(jié)果。OK這樣我們就使用gradle構(gòu)建好了一個最基礎(chǔ)的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中創(chuàng)建CalculatorTest.java文件:

內(nèi)容如下:

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重新構(gòu)建

在命令行中執(zhí)行:

gradle build

結(jié)果如下:

從結(jié)果看貌似并沒有什么不同,那么,我們看一下新的目錄結(jié)構(gòu):

從目錄結(jié)構(gòu)中我們可以看出多了很多東西。

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

在網(wǎng)頁中顯示測試結(jié)果,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構(gòu)建:

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

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

3 結(jié)束語

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,544評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,265評論 6 342
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,970評論 25 709
  • 消息隊列 Posix消息隊列 System V 消息隊列 共享內(nèi)存 臨界區(qū) 信號量 計數(shù)信號量 二值信號量 有名信...
    jdzhangxin閱讀 369評論 0 0
  • 起初,火不知道自己是火,以致打火機的噴吐把它嚇了一跳。它小心翼翼立在陌生的長方形物體上,左試試,右探探,不知怎樣才...
    九曲胡同閱讀 666評論 1 7

友情鏈接更多精彩內(nèi)容