Java用JUnit進(jìn)行單元測(cè)試

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

1 最原始的寫法

1.1 準(zhǔn)備

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

1.2 下載

這里我們需要下載兩個(gè)東西:

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 編寫測(cè)試類

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

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 運(yùn)行測(cè)試

使用命令行:

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 測(cè)試失敗的情況

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

}

重新編譯龟劲,運(yùn)行測(cè)試。結(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的單元測(cè)試轴或。我們進(jìn)行單元測(cè)試肯定不會(huì)這么麻煩昌跌。但是要知道,我們使用任何框架或者編輯器照雁,他們?cè)诒澈笞龅氖虑榇蟾乓簿褪沁@些蚕愤。那接下來,仍然手工來做一個(gè)使用Gradle構(gòu)建的Java工程的測(cè)試寫法囊榜。

2 對(duì)使用Gradle構(gòu)建的Java項(xiàng)目進(jìn)行單元測(cè)試

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

估計(jì)审胸,即使是使用過Gradle構(gòu)建的人亥宿,也很少有人手動(dòng)使用grad

2.1.1 準(zhǔn)備

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

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

在這個(gè)文件夾下面創(chuàng)建一個(gè)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)建一個(gè)文件曙求,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文件夾,這個(gè)就是使用gradle構(gòu)建出的內(nèi)容堰氓。我們可以看到有class和jar文件挤渐。那么我們?nèi)ミ\(yùn)行一下試一試。

我們看到双絮,輸出3浴麻,正是我們程序預(yù)期的結(jié)果。OK這樣我們就使用gradle構(gòu)建好了一個(gè)最基礎(chǔ)的Java工程了囤攀。接下來為我們的工程添加測(cè)試文件软免。

2.2 使用JUnit進(jìn)行單元測(cè)試

2.2.1 添加依賴

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

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
  testCompile 'junit:junit:4.12'
}

2.2.2 添加單元測(cè)試代碼

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)頁中顯示測(cè)試結(jié)果榛泛,100%通過蝌蹂。那么我們?cè)囈辉嚊]有通過的情況。

2.2.4 測(cè)試失敗情況

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

import java.lang.String;

public class Calculator{

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

    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)建:

我們可以看到失敗了挟鸠。然后它提示我們有一個(gè)報(bào)告文件叉信。那么我們就去看看這個(gè)報(bào)告文件。

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

3 結(jié)束語

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

自己也剛剛學(xué)習(xí)單元測(cè)試拧抖。如果有什么不對(duì)的地方還請(qǐng)斧正煤搜!學(xué)識(shí)尚淺,還望大家多多指教唧席!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末擦盾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子淌哟,更是在濱河造成了極大的恐慌迹卢,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徒仓,死亡現(xiàn)場(chǎng)離奇詭異腐碱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)掉弛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門症见,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人狰晚,你說我怎么就攤上這事筒饰。” “怎么了壁晒?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵瓷们,是天一觀的道長。 經(jīng)常有香客問我,道長谬晕,這世上最難降的妖魔是什么碘裕? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮攒钳,結(jié)果婚禮上帮孔,老公的妹妹穿的比我還像新娘。我一直安慰自己不撑,他們只是感情好文兢,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著焕檬,像睡著了一般姆坚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上实愚,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天兼呵,我揣著相機(jī)與錄音,去河邊找鬼腊敲。 笑死击喂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碰辅。 我是一名探鬼主播懂昂,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼乎赴!你這毒婦竟也來了忍法?” 一聲冷哼從身側(cè)響起潮尝,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤榕吼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后勉失,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體羹蚣,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年乱凿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了顽素。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徒蟆,死狀恐怖胁出,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情段审,我是刑警寧澤全蝶,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響抑淫,放射性物質(zhì)發(fā)生泄漏绷落。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一始苇、第九天 我趴在偏房一處隱蔽的房頂上張望砌烁。 院中可真熱鬧,春花似錦催式、人聲如沸函喉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽函似。三九已至,卻和暖如春喉童,著一層夾襖步出監(jiān)牢的瞬間撇寞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工堂氯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蔑担,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓咽白,卻偏偏與公主長得像啤握,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晶框,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

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