1. 程式人生 > 程式設計 >應用效能測試神器 Gatling,你用過嗎?

應用效能測試神器 Gatling,你用過嗎?

在應用程式上線之前,有多少人做過效能測試?

估計大部分開發者更多地關注功能測試,並且會提供一些單元測試和整合測試的用例。然而,有時候效能漏洞導致的影響比未發現的業務漏洞更嚴重,因為效能漏洞影響的是整個系統,而不僅僅是一個業務程式。

可能你們很多人聽過 JMeter ,但是今天將介紹有競爭力的解決方案 —— Gatling 。它能生成豐富多彩的報告,包含測試案例中收集的所有指標。該功能似乎比 JMeter 更好。

在討論 Gatling 之前,先了解下理論知識,效能測試的兩種型別,負載測試和壓力測試:

  • 負載測試(Load Testing):負載測試是一種主要為了測試軟體系統是否達到需求檔案設計的目標,譬如軟體在一定時期內,最大支援多少併發使用者數,軟體請求出錯率等,測試的主要是軟體系統的效能。
  • 壓力測試(Stress Testing):壓力測試主要是為了測試硬體系統是否達到需求檔案設計的效能目標,譬如在一定時期內,系統的cpu利用率,記憶體使用率,磁碟I/O吞吐率,網路吞吐量等,壓力測試和負載測試最大的差別在於測試目的不同。

Gatling 簡介

Gatling 是一個功能強大的負載測試工具。它是為易用性、可維護性和高效能而設計的。

開箱即用,Gatling 帶有對 HTTP 協議的出色支援,使其成為負載測試任何 HTTP 伺服器的首選工具。由於核心引擎實際上是協議不可知的,所以完全可以實現對其他協議的支援,例如,Gatling 目前也提供JMS 支援。

只要底層協議(如 HTTP)能夠以非阻塞的方式實現,Gatling 的架構就是非同步的。這種架構可以將虛擬使用者作為訊息而不是專用執行緒來實現。因此,執行數千個併發的虛擬使用者不是問題。

Gatling 快速入門實踐

1、建立 Spring Boot 應用,提供 RESTful API,以供測試

https://github.com/ChinaSilence/gatling-test.git

如果有自己測試的 Web 應用可以忽略本步驟!

2、啟動資料庫

Github 中的示例程式碼依賴了 PostgresSQL,所以要先啟動資料庫,最簡單的方式當然是用 Docker 咯:

docker run -d \
  --name postgres \
  -e POSTGRES_DB=gatling \
  -e POSTGRES_USER=gatling \
  -e POSTGRES_PASSWORD=gatling123 \
  -p 5432:5432 \
  postgres複製程式碼

3、在 IDEA 中安裝 scala 環境

安裝 scala 外掛

安裝 scala SDK

4、編寫效能測試指令碼

每一個 Gatling 測試都要繼承 Simulation 類,在裡面你可以使用Gatling Scala DSL 來宣告一個場景列表。這裡的目標是執行 30 個客戶端,同時傳送 1000 次請求。首先,客戶端通過呼叫 POST /persons 方法將新增資料到資料庫中;然後,嘗試通過呼叫 GET /persons/{id} 方法使用 id 來查詢資料。

class ApiGatlingSimulationTest extends Simulation {

  val scn = scenario("AddAndFindPersons").repeat(1000,"n") {
    exec(
      http("AddPerson-API")
        .post("http://localhost:8080/persons")
        .header("Content-Type","application/json")
        .body(StringBody("""{"firstName":"John${n}","lastName":"Smith${n}","birthDate":"1980-01-01","address": {"country":"pl","city":"Warsaw","street":"Test${n}","postalCode":"02-200","houseNo":${n}}}"""))
        .check(status.is(200))
    ).pause(Duration.apply(5,TimeUnit.MILLISECONDS))
  }.repeat(1000,"n") {
    exec(
      http("GetPerson-API")
        .get("http://localhost:8080/persons/${n}")
        .check(status.is(200))
    )
  }

  setUp(scn.inject(atOnceUsers(30))).maxDuration(FiniteDuration.apply(10,"minutes"))

}複製程式碼

5、執行 Spring Boot 應用

6、執行測試指令碼

配置 Maven 外掛引數

    <build>
        <plugins>
            <plugin>
                <groupId>io.gatling</groupId>
                <artifactId>gatling-maven-plugin</artifactId>
                <version>${gatling-plugin.version}</version>
                <configuration>
                    <!-- 測試指令碼 -->
                    <simulationClass>com.anoyi.test.ApiGatlingSimulationTest</simulationClass>
                    <!-- 結果輸出地址 -->
                    <resultsFolder>/Users/admin/code/gatling</resultsFolder>
                </configuration>
            </plugin>
        </plugins>
    </build>複製程式碼

執行測試

mvn gatling:execute複製程式碼

7、檢視測試報告

全域性報告

單個介面明細報告