Brian的雜記
  • Introduction
  • Brian's 雜記
    • My Awesome API
    • FB 大頭貼
    • 硬體雜記
    • PHP
    • project
      • 模擬器
      • WAMP
    • WinMerge
    • 雜記
      • LINQ
      • 方法
      • Grid View
      • namespace
      • global
      • 物件導向
      • Excel
      • VS2017
      • single sign on
      • Master
      • Https
      • 憑證
      • 略過憑證不符
      • NLog
      • 團隊開發
      • .NET Core
      • 共用網路上的芳鄰
      • 爬蟲
      • NPOI
      • RSS
      • 多執行緒
      • 記憶體回收
      • 密碼學
        • BCrypt
        • AES
      • 主機環境建置
      • Session
      • Error
      • IIS 相關
      • 無障礙相關
      • 介面
        • 影像地圖
      • telnet
        • smtp
      • nslookup
      • 協助客戶解決問題
      • 驗證欄位
      • 網站管理
      • 工具整理
    • 正規表示法
    • 影像處理
    • IntelliJ Idea
    • 觀念
      • Clean Code
        • 命名
        • 函式
        • 註解
        • 編排
        • 物件及資料結構
        • 錯誤處理
        • 邊界
        • 單元測試
        • 類別
      • Java 程式風格
      • Design Pattern
        • 單例模式
      • 同步
      • 畫圖
        • ER-Model
        • 類別圖
        • Use Case
        • 有限狀態機
      • 資料 API 文件 分析
      • CORS & SSL
      • 利用DISC幫助溝通
      • OAS
    • 檔案上傳
      • FileStore
      • App Engine
      • Google Storage
    • OAuth vs Open ID
    • MIME
    • 虛擬桌面
    • 待看資料
    • Selenium
    • CDN
    • HTTP
    • 編碼
    • 2nd-ML100Days
      • jupyter
    • 微服務
      • 設計
        • 1 ~ 5
        • 6
        • 7
        • 8
        • 9
    • Gradle
    • Maven
    • Error
    • 批次檔 BAT
    • Kurento
    • WebSocket & WebRTC
  • 需求面能力
    • User Story
  • Google Cloud Platform
    • Compute Engine
  • Python
    • 基本語法
    • Pandas
    • 套件
    • Matplotlib
    • Encoder
    • jupyter
  • Java
    • Java
      • File
      • Exception
      • 物件導向觀念
      • 加密
      • HTTP
      • 集合
      • Stream()
      • Web
      • ResultSet
      • JDK6
      • JDK8
    • 讀取、複寫MP3 Tag
    • Log4j2
    • Servlet
      • 容器
    • JSP
    • JBOSS
    • JWT
    • PreparedStatement
    • Error
    • Spring
      • Spring Boot
        • @Value
        • Build
      • RequestParameter
      • Error
      • Autowired
      • JPA
      • FeignClient
      • WebSocket
      • thymeleaf
      • Security
      • Test
      • Scheduled
      • Redirect
    • IntelliJ
  • Linux
    • Linux
    • Shell Script
    • Cygwin(在Windows執行Linux指令)
  • 前端
    • HTML
      • Link
    • CSS
      • Position
      • padding color
      • display
    • JS
      • jQuery
        • Select2
      • fancybox
      • ES6
      • 效能
      • GoogleMap API
        • Marker
        • InfoWindow
      • 事件
      • CKEditor
      • TGOS
      • JSON
      • QRcode
      • 核心概念
        • 物件 變數 型別
          • number
          • String
          • boolean
          • null & undefined
          • Symbol
        • JS 物件概念
        • 深入理解JS 函式物件
        • 更多ES2015/ES6 全新語言特性
      • Promise
    • 效果應用
  • 資料庫
    • 注意事項
    • MariaDB
    • MySQL
      • inner join 和 join
      • 字串比對
      • 倒數資料
    • SQL
      • DDL 資料定義語言
      • DML 資料操縱語言
      • DCL 資料控制語言
      • TCL 交易控制語言
      • T-SQL
      • CTE
      • JOIN
    • Oracle
    • MSSQL 操作
      • 新增使用者
      • SQL 指令
      • Sequence
    • 差異比較
    • MyBatis
    • Workbench 操作
    • SQL Injection
  • 版本控制
    • Gitlab
      • sign up
      • sign in
      • add project
      • add members
    • SourceGit
      • install
    • SmartGit
      • install
      • operate
      • git 操作雜記
    • TortoiseGit
    • Git
    • TFS
    • SVN
  • Test
    • 軟體測試原則
    • 演算法
    • XMind
      • install
    • Jenkins
      • 建置
    • HTTPie
    • Postman
    • 測試驅動開發
    • 撰寫測試的觀念
    • 測試框架
    • IoC & DI
    • 隔絕相依性的方式
    • JUnit
    • NUnit
    • 習慣
    • 虛設常式
  • Angular
    • hello world
    • ng-options
    • ES6
    • Build & Conponect
    • HttpClient
    • 部署
  • ASP.NET Web Form
    • Chapter 2
      • 2-1
        • 小東西
    • 略過請求驗證
  • Go
Powered by GitBook
On this page
  • JUnit
  • 前置準備
  • 第一個測試案例
  • 共通事件
  • 3A原則
  • Assertj-core 可讀性更好的Assert套件 (jdk8)
  • 硬斷言和軟斷言

Was this helpful?

  1. Test

JUnit

Previous隔絕相依性的方式NextNUnit

Last updated 1 year ago

Was this helpful?

JUnit

前置準備

參考資料:()

下載套件:

junit.jar & hamcrest-core.jar()

第一個測試案例

參考資料:()

共通事件

參考資料:()

name

static

說明

BeforeClass

O

整個開始前執行一次

每個case前都會執行一次

After

X

每個case後都會執行一次

AfterClass

O

整個測試案例跑完會執行一次

3A原則

在使用@Test註解的方法,即測試案例內編寫:

Arrange:初始化目標物件(待測類別)、初始化相依物件、方法參數、預期結果(excepted)

Act:調用目標物件及欲測試的方法

Assert:驗證實際結果(actual)是否符合預期結果

@Test
public void getDirNameTest() {
    // 1. Arrange
    Main m = new Main();
    String src = "./music";
    String excepted = "music";

    // 2. Act
    String actual = m.getDirName(src);

    // 3. Assert
    assertThat(actual).isEqualTo(excepted);}

(3A的另外一種描述方式 建造-操作-檢查 BUILD-OPERATE-CHECK)

Assertj-core 可讀性更好的Assert套件 (jdk8)

ERROR Code:

java: cannot access java.util.function.Predicate
  class file for java.util.function.Predicate not found

經查詢 Predicate 是JDK8新增的項目,根據GitHub內所言

Note that AssertJ 3.x requires at least Java 8 and AssertJ 2.x requires at least Java 7.

雖然教學文章內是使用 Assertj 3.8.0 ,但我目前只能嘗試JDK7,故接下來皆是改用 2.9.1 的版本。

硬斷言和軟斷言

軟斷言範例:

    @Test
    public void Case4(){
        int actual1 = 5;
        String actual2 = "10";

        SoftAssertions softAssertions = new SoftAssertions();

        softAssertions.assertThat(actual1).isLessThan(4);

        softAssertions.assertThat(actual2).isEqualTo("11");

        softAssertions.assertAll();
    }

要記得執行最後一行 .assertAll() 才會執行斷言。

注意事項

當我們寫測試的時候,我們必須遵守這樣的原則:

不應在測試方法中加入業務邏輯,不要造成維護上的困難 確保我們的測試易於讀寫

但使用軟斷言: 可能把業務邏輯加入到測試案例中,這會使得讀者的注意力會從測試本質,轉移到實現細節上,也就是說變得難以閱讀。 並且因為業務邏輯加入,當單一狀態的改變時,造成相關的測試也都需要進行變更,這造成維護上的困難。

所以一般情況下是不使用的好...

自訂斷言

Exception

使用 JUnit 去捕捉,就類似用一個大的 try .. catch 包住這整個Test

@Test(excepted = FileNotFoundException.class)
public void someTest() throws Exception {
    //do something..
}

但是上述這個寫法的缺點,在於有可能並不是我們期望的那一行所噴的錯,有可能是其他行噴的,但我們無法察覺。

使用 AssertJ 編寫斷言

前置條件:此系統必須是 Java 8

AssertJ提供了org.assertj.core.api.Assertions.catchThrowable()方法來捕捉異常

@Test
public void example_Exception() {
    Throwable throwable = catchThrowable(()-> throwException());

    assertThat(throwable)
            .isExactlyInstanceOf(Exception.class)
            .hasMessageContaining("Magic");
}

private void throwException() throws Exception {
    throw new Exception("Magic");
}

參考資料:()

Github:()

3.8.0 jar下載點:

2.9.1 jar下載點:

參考文章:()

參考資料:()

參考資料:()

https://www.jetbrains.com/help/idea/create-tests.html
https://github.com/junit-team/junit4/wiki/Download-and-Install
http://www.java2s.com/Tutorials/Java/JUnit/0040__JUnit_HelloWorld.htm
https://ithelp.ithome.com.tw/articles/10192896
https://ithelp.ithome.com.tw/articles/10193175
https://github.com/joel-costigliola/assertj-core
http://central.maven.org/maven2/org/assertj/assertj-core/3.8.0/
https://jar-download.com/artifacts/org.assertj/assertj-core/2.9.1/source-code
https://ithelp.ithome.com.tw/articles/10193404
https://ithelp.ithome.com.tw/articles/10193640
https://stackoverflow.com/questions/31423643/try-catch-in-a-junit-test