原文位址: http://www.work100.net/training/monolithic-frameworks-junit.html 更多教程: 光束雲 - 免費課程
JUnit
請參照如上
章節導航
進行閱讀
1.TDD
TDD 是測試驅動開發(Test-Driven Development)的英文簡稱,是靈活開發中的一項核心實踐和技術,也是一種設計方法論。
TDD 的原理是在開發功能代碼之前,先編寫單元測試用例代碼,測試代碼确定需要編寫什麼産品代碼。TDD雖是靈活方法的核心實踐,但不隻适用于XP(Extreme Programming),同樣可以适用于其他開發方法和過程。
TDD 的基本思路就是通過測試來推動整個開發的進行,但測試驅動開發并不隻是單純的測試工作,而是把需求分析,設計,品質控制量化的過程。
TDD的重要目的不僅僅是測試軟體,測試工作保證代碼品質僅僅是其中一部分,而且是在開發過程中幫助客戶和程式員去除模棱兩可的需求。
TDD首先考慮使用需求(對象、功能、過程、接口等),主要是編寫測試用例架構對功能的過程和接口進行設計,而測試架構可以持續進行驗證。
2.JUnit簡介
JUnit 是用于編寫和運作可重複的自動化測試的開源測試架構,這樣可以保證我們的代碼按預期工作。JUnit 可廣泛用于工業和作為支架(從指令行)或IDE(如 IDEA)内單獨的 Java 程式。
JUnit 提供:
- 斷言測試預期結果。
- 測試功能共享通用的測試資料。
- 測試套件輕松地組織和運作測試。
- 圖形和文本測試運作。
JUnit 用于測試:
- 整個對象
- 對象的一部分 - 互動的方法或一些方法
- 幾個對象之間的互動(互動)
3.JUnit特點
- JUnit 是用于編寫和運作測試的開源架構。
- 提供了注釋,以确定測試方法。
- 提供斷言測試預期結果。
- 提供了測試運作的運作測試。
- JUnit 測試讓您可以更快地編寫代碼,提高品質
- JUnit 是優雅簡潔。它是不那麼複雜以及不需要花費太多的時間。
- JUnit 測試可以自動運作,檢查自己的結果,并提供即時回報。沒有必要通過測試結果報告來手動梳理。
- JUnit 測試可以組織成測試套件包含測試案例,甚至其他測試套件。
- Junit 顯示測試進度的,如果測試是沒有問題條形是綠色的,測試失敗則會變成紅色
4.執行個體
我們仍然以
hello-spring
項目進行代碼示範。
4.1.更新POM
修改
pom.xml
檔案,增加
junit:junit
依賴:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.work100.training.stage2</groupId>
<artifactId>hello-spring</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
4.2.建立測試類
在測試包下
src/test/java
建立一個名為
MyTest
的測試類,代碼如下:
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* <p>Title: MyTest</p>
* <p>Description: </p>
*
* @author liuxiaojun
* @date 2020-02-12 15:09
* ------------------- History -------------------
* <date> <author> <desc>
* 2020-02-12 liuxiaojun 初始建立
* -----------------------------------------------
*/
public class MyTest {
/**
* 執行測試方法前執行
*/
@Before
public void before() {
System.out.println("執行 before() 方法");
}
/**
* 執行測試方法後執行
*/
@After
public void after() {
System.out.println("執行 after() 方法");
System.out.println("-------------------------");
}
@Test
public void testSayHi() {
System.out.println("Hi Log4j");
}
@Test
public void testSayHello() {
System.out.println("Hello Log4j");
}
}
5.注解
描述 | |
---|---|
public void method() | 測試注釋訓示該公共無效方法它所附着可以作為一個測試用例。 |
| Before 注釋表示,該方法必須在類中的每個測試之前執行,以便執行測試某些必要的先決條件。 |
public static void method() | BeforeClass 注釋指出這是附着在靜态方法必須執行一次并在類的所有測試之前。 發生這種情況時一般是測試計算共享配置方法(如連接配接到資料庫)。 |
| After 注釋訓示,該方法在執行每項測試後執行(如執行每一個測試後重置某些變量,删除臨時變量等) |
| 當需要執行所有的測試在 JUnit 測試用例類後執行,AfterClass 注解可以使用以清理建立方法,(從資料庫如斷開連接配接)。 注意:附有此批注(類似于 BeforeClass)的方法必須定義為靜态。 |
| 當想暫時禁用特定的測試執行可以使用忽略注釋。 每個被注解為 @Ignore 的方法将不被執行。 |
6.斷言
6.1.什麼是斷言
斷言是程式設計術語,表示為一些布爾表達式,程式員相信在程式中的某個特定點該表達式值為真,可以在任何時候啟用和禁用斷言驗證,是以可以在測試時啟用斷言而在部署時禁用斷言。同樣,程式投入運作後,最終使用者在遇到問題時可以重新啟用斷言。
使用斷言可以建立更穩定、品質更好且 不易于出錯的代碼。當需要在一個值為 false 時中斷目前操作的話,可以使用斷言。單元測試必須使用斷言(Junit/JunitX)。
6.2.常用斷言方法
| 斷言兩個值相等。 值可能是類型有:int, short, long, byte, char or java.lang.Object。 第一個參數是一個可選的字元串消息 |
| 斷言一個條件為真 |
| 斷言一個條件為假 |
| 斷言一個對象不為空(null) |
| 斷言一個對象為空(null) |
| 斷言,兩個對象引用相同的對象 |
| 斷言,兩個對象不是引用同一個對象 |
| 斷言預期數組和結果數組相等。 數組的類型可能是:int, long, short, char, byte or java.lang.Object。 |
6.3.測試斷言效果
在之前的單元測試類中建立一個名為 testAssert 方法,代碼如下:
/**
* 測試斷言
*/
@Test
public void testAssert() {
String obj1 = "junit";
String obj2 = "junit";
String obj3 = "test";
String obj4 = "test";
String obj5 = null;
int var1 = 1;
int var2 = 2;
int[] arithmetic1 = {1, 2, 3};
int[] arithmetic2 = {1, 2, 3};
assertEquals(obj1, obj2);
assertSame(obj3, obj4);
assertNotSame(obj2, obj4);
assertNotNull(obj1);
assertNull(obj5);
assertTrue("為真", var1 == var2);
assertArrayEquals(arithmetic1, arithmetic2);
}
運作,檢視斷言效果:
執行 before() 方法
Hello Log4j
執行 after() 方法
-------------------------
執行 before() 方法
Hi Log4j
執行 after() 方法
-------------------------
執行 before() 方法
執行 after() 方法
-------------------------
java.lang.AssertionError: 為真
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.assertTrue(Assert.java:41)
at MyTest.testAssert(MyTest.java:71)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
7.執行個體源碼
執行個體源碼已經托管到如下位址:
- https://github.com/work100-net/training-stage2/tree/master/hello-spring https://github.com/work100-net/training-stage2/tree/master/hello-spring
- https://gitee.com/work100-net/training-stage2/tree/master/hello-spring https://gitee.com/work100-net/training-stage2/tree/master/hello-spring
上一篇:
Spring下一篇:
Log4j如果對課程内容感興趣,可以掃碼關注我們的或
公衆号
,及時關注我們的課程更新
QQ群
