实施 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 复制代码
plus:在执行上述命名时找不到 gatling 项目框架,所以接下来会通过 IDEA 直接创建 Maven 项目。
IntelliJ 创建一个新的 Maven 项目,添加基础架构的坐标和版本号,可以参考 Maven 官网。如下图所示:
给项目命名为 gatling-framework,如下图所示:
点击 Next:
当你使用 IntelliJ 打开项目时,你会看到默认创建了许多文件和文件夹:
resources 目录下包含了:
bodies 文件夹用保存请求的 Payload,比如各种请求的请求模板。
data 文件夹用来保存测试数据,比如 CSV 文件等。
除了上面提到的两个文件夹外,还有 gatling.conf、logback.xml 和 recorder.confg 文件,在本文中不会涉及。
Gatling Archetype 同时创建了 3 个 Scala Object,在创建完测试用例之后,通过执行 Engine Object 来执行测试。
另外,我们还将创建四个 packages,分别是 config、request、scenarios 和 simulations。
Config Package
在 config 包下,创建 Scala Object Config,这个 Object 将会存储各种项目的配置信息,如应用的 URL 地址,默认的用户等等。
点击 New,选择 Scala Class:
输入名称,选择 Object:
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) } 复制代码
至此,你的整个项目结构应该如下图所示:
我们还需要修改 pom.xml,添加 maven gatling plugin
<plugin> <groupId>io.gatling</groupId> <artifactId>gatling-maven-plugin</artifactId> <version>3.0.0</version> </plugin> 复制代码
执行 Engine Object 就可以运行测试:
控制台输出运行的信息以及报告保存的位置:
报告如下图所示: