單元測(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è)東西:
我這里下載了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í)尚淺,還望大家多多指教唧席!