Gatling + Maven 从零实现性能测试

448 阅读3分钟

实施 Gatling 性能测试项目的最佳方式是什么?

当我们设计一个框架的时候,可维护性和可扩展性是我们考虑的非常重要的两个因素。

在本文中,我们将展示如何创建使用 Gatling 和 Maven 从 0 创建一个性能测试项目。

Gatling + Maven 的测试框架

前置条件

在开始前,你应在你本地安装完成以下几个工具:

  • Java 1.8
  • Maven 3.5
  • IntelliJ IDE 中的 Scala 插件

首先我们使用 maven 命令创建一个 gatling 风格的基础项目

mvn archetype:generate -DarchetypeGroupId=io.gatling.highcharts -DarchetypeArtifactId=gatling-highcharts-maven-archetype

image.png

plus:在执行上述命名时找不到 gatling 项目框架,所以接下来会通过 IDEA 直接创建 Maven 项目。

IntelliJ 创建一个新的 Maven 项目,添加基础架构的坐标和版本号,可以参考 Maven 官网。如下图所示:

image.png

image.png

给项目命名为 gatling-framework,如下图所示:

image.png

点击 Next:

image.png

当你使用 IntelliJ 打开项目时,你会看到默认创建了许多文件和文件夹:

image.png

resources 目录下包含了:

bodies 文件夹用保存请求的 Payload,比如各种请求的请求模板。

data 文件夹用来保存测试数据,比如 CSV 文件等。

除了上面提到的两个文件夹外,还有 gatling.conf、logback.xml 和 recorder.confg 文件,在本文中不会涉及。

Gatling Archetype 同时创建了 3 个 Scala Object,在创建完测试用例之后,通过执行 Engine Object 来执行测试。

另外,我们还将创建四个 packages,分别是 config、request、scenarios 和 simulations。

image.png

Config Package

在 config 包下,创建 Scala Object Config,这个 Object 将会存储各种项目的配置信息,如应用的 URL 地址,默认的用户等等。

点击 New,选择 Scala Class:

image.png

输入名称,选择 Object:

image.png

Config Object 的代码如下:

object Config {
    
    val app_url = "http://example-app.com"
    
    val users = Integer.getInteger("users",10).toInt
    val rampUp = Integer.getInteger("rampup", 1).toInt
    val throughput = Integer.getInteger("throughput",100).toInt

}

Request Package

requests 包则是用来存储各种不同的请求,如我们可以创建一个请求来获取认证的 token,其他请求就可以使用获取到的 token 来进行创建用户等操作。

这些是发送到不同地址的独立请求。

GetTokenRequest

import io.gatling.http.Predef._
import io.gatling.core.Predef._
import com.testexcellence.config.Config.app_url


object GetTokenRequest {
    
    val get_token = http("RequestName").get(app_url + "/token")
        .check(status is 200)
        .check(jsonPath("$..token").saveAs("token"))

}

CreateUserRequest

object CreateUserRequest {

    val sentHeaders = Map("Authorization" -> "bear ${token}")
    
    val create_user = exec(http("Create User Request")
        .post(app_url + "/users")
        .headers(sentHeaders)
        .formParam("name", "John")
        .formParam("password", "John5P4ss")
        .check(status is 201)
        .check(regex("Created").exists))
    
}

Scenarios Package

Scenario package 保存各种业务场景,比如,要创建一个用户,我们首先必须获得一个 token,然后将该 token 当做请求头发送请求来创建用户。本例中我们使用第一个请求的响应作为到第二个请求的头。这种“请求链”在 API 测试中非常常见。

CreateUserSecnario

import com.testexcellence.requests.{CreateUserRequest, GetTokenRequest}
import io.gatling.core.Predef.scenario

object CreateUserSecnario {
    
    val crateUserScenario = scenario("Create User Scenario")
        .exec(GetTokenRequest.get_token)
        .exec(CreateUserRequest.create_user)

}

Simulations Package

最后,我们在 Simulations Package 中创建一个 Simulation。您可以将 Simulations 当做不同的测试负载。例如,我们可以进行正常负载模拟或峰值模拟的性能测试

Simulation 必须是 Scala Class,并且必须继承 Gatling 的 Simulation 类。

CreateUserSecnario

import com.testexcellence.scenarios.CreateUserScenario
import io.gatling.core.Predef.Simulation
import com.testexcellence.config.Config.users
import io.gatling.core.Predef._


class CreateUserSimulation extends Simulation{
    
    private val createUserExec = CreateUserScenario.createUserScenario
            .inject(atOnceUsers(users))
    
    setUp(createUserExec)
    
}

至此,你的整个项目结构应该如下图所示:

image.png

我们还需要修改 pom.xml,添加 maven gatling plugin

<plugin>
    <groupId>io.gatling</groupId>
    <artifactId>gatling-maven-plugin</artifactId>
    <version>3.0.0</version>
</plugin>

执行 Engine Object 就可以运行测试:

image.png

控制台输出运行的信息以及报告保存的位置:

image.png

报告如下图所示:

image.png

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

本文翻译自 devqa.io/gatling-mav… ,并在原文基础上进行了部分更新。