為 java 開發者設計的效能測試框架,用於壓測+測試報告生成

老马啸西风發表於2024-03-18

擴充閱讀

junit5 系列教程

基於 junit5 實現 junitperf 原始碼分析

Auto generate mock data for java test.(便於 Java 測試自動生成物件資訊)

Junit performance rely on junit5 and jdk8+.(java 效能測試框架。壓測+測試報告生成。)

junitperf

junitperf 是一款為 java 開發者設計的效能測試框架。

為什麼使用?

  • 可以和 Junit5 完美契合。

  • 使用簡單,便於專案開發過程中的測試實用。

  • 提供擴充,使用者可進行自定義開發。

特性

  • 支援 I18N

  • 支援多種報告生成方式,支援自定義

  • Junt5 完美支援,便於 Java 開發者使用

快速開始

專案依賴

  • jdk1.8 及其以上版本

  • Junit5 及其以上版本

maven 匯入

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>junitperf</artifactId>
    <version>2.0.7</version>
</dependency>

入門案例

入門案例地址

  • 使用例子
public class HelloWorldTest {

    @JunitPerfConfig(duration = 1000)
    public void helloTest() throws InterruptedException {
        Thread.sleep(100);
        System.out.println("Hello Junit5");
    }

}

配置說明

測試註解指定

@JunitPerfConfig

指定測試時的屬性配置。(必填項)

屬性 說明 型別 預設值 備註
threads 執行時使用多少執行緒執行 int 1
warmUp 準備時間 long 0 單位:毫秒
duration 執行時間 long 60_000(1分鐘) 單位:毫秒
latencyStatistics 統計實現 StatisticsCalculator DefaultStatisticsCalculator
reporter 報告實現 Reporter ConsoleReporter

使用如下:

public class JunitPerfConfigTest {

    /**
     * 2個執行緒執行。
     * 準備時間:1000ms
     * 執行時間: 2000ms
     * @throws InterruptedException if any
     */
    @JunitPerfConfig(threads = 2, warmUp = 1000, duration = 2000)
    public void junitPerfConfigTest() throws InterruptedException {
        System.out.println("junitPerfConfigTest");
        Thread.sleep(200);
    }

}

各種報告的實現

這裡主要是對於效能測試統計的輸出方式
支援以下方式:

方式 案例
預設方式 DefaultReporterTest
命令列 ConsoleReporterTest
HTML HtmlReporterTest
組合方式 MultiReporterTest
自定義方式 DefineReporterTest

@JunitPerfRequire

指定測試時需要達到的要求。(選填項)

屬性 說明 型別 預設值 備註
min 最佳的執行耗時 float -1 最快的執行耗時如果高於這個值,則視為失敗。單位:毫秒
max 平均的執行耗時 float -1 最壞的執行耗時如果高於這個值,則視為失敗。單位:毫秒
average 平均的執行耗時 float -1 平均的執行耗時如果高於這個值,則視為失敗。單位:毫秒
timesPerSecond 每秒的最小執行次數 int 0 如果低於這個最小執行次數,則視為失敗。
percentiles 對於執行耗時的限定 String[] {} percentiles={"20:220", "30:250"}。20% 的資料執行耗時不得超過 220ms;30% 的資料執行耗時不得超過 250ms;

使用如下:

public class JunitPerfRequireTest {
    /**
     * 配置:2個執行緒執行。準備時間:1000ms。執行時間: 2000ms。
     * 要求:最快不可低於 210ms, 最慢不得低於 250ms, 平均不得低於 225ms, 每秒執行次數不得低於 4 次。
     * 20% 的資料不低於 220ms, 50% 的資料不得低於 230ms;
     *
     * @throws InterruptedException if any
     */
    @JunitPerfConfig(threads = 2, warmUp = 1000, duration = 2000)
    @JunitPerfRequire(min = 210, max = 250, average = 225, timesPerSecond = 4, percentiles = {"20:220", "50:230"})
    public void junitPerfConfigTest() throws InterruptedException {
        System.out.println("junitPerfConfigTest");
        Thread.sleep(200);
    }

}

報告方式

命令列方式

大致如下:

[INFO] [2020-06-16 20:05:53.618] [c.g.h.j.e.HelloWorldTest.helloTest] - Started at:  2020-06-16 20:05:52.512
[INFO] [2020-06-16 20:05:53.619] [c.g.h.j.e.HelloWorldTest.helloTest] - Invocations:  9
[INFO] [2020-06-16 20:05:53.620] [c.g.h.j.e.HelloWorldTest.helloTest] - Success:  9
[INFO] [2020-06-16 20:05:53.620] [c.g.h.j.e.HelloWorldTest.helloTest] - Errors:  0
[INFO] [2020-06-16 20:05:53.621] [c.g.h.j.e.HelloWorldTest.helloTest] - Thread Count:  1
[INFO] [2020-06-16 20:05:53.623] [c.g.h.j.e.HelloWorldTest.helloTest] - Warm up:  0ms
[INFO] [2020-06-16 20:05:53.623] [c.g.h.j.e.HelloWorldTest.helloTest] - Execution time:  1000ms
[INFO] [2020-06-16 20:05:53.624] [c.g.h.j.e.HelloWorldTest.helloTest] - Throughput:  9/s (Required: -1/s) - PASSED
[INFO] [2020-06-16 20:05:53.625] [c.g.h.j.e.HelloWorldTest.helloTest] - Memory cost:  16byte
[INFO] [2020-06-16 20:05:53.635] [c.g.h.j.e.HelloWorldTest.helloTest] - Min latency:  100.191414ms (Required: -1.0ms) - PASSED
[INFO] [2020-06-16 20:05:53.635] [c.g.h.j.e.HelloWorldTest.helloTest] - Max latency:  105.2382ms (Required: -1.0ms) - PASSED
[INFO] [2020-06-16 20:05:53.636] [c.g.h.j.e.HelloWorldTest.helloTest] - Avg latency:  101.43268ms (Required: -1.0ms) - PASSED

HTML 方式

頁面如下:

後期會進行樣式調整。

HTML 形式

指定方法執行順序

說明

方法的執行順序會影響到最終的報告顯示順序。

如果你想嚴格指定同一個類方法的執行順序,推薦使用 Test Execution Order 的方式。

@TestMethodOrder 需要 junit5 在 5.4 及其以後版本

示例程式碼

參考 OrderedHtmlTest

對於 junit4 的支援

引入 jar

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>junitperf</artifactId>
    <version>1.0.3</version>
</dependency>

相關文件

junit4 相關使用

相關文章