性能测试之 Gatling

作者: Anoyi | 来源:发表于2018-01-21 12:58 被阅读1626次

    在应用程序上线之前,有多少人做过性能测试?

    估计大部分开发者更多地关注功能测试,并且会提供一些单元测试和集成测试的用例。然而,有时候性能漏洞导致的影响比未发现的业务漏洞更严重,因为性能漏洞影响的是整个系统,而不仅仅是一个业务进程。

    可能你们很多人听过 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、查看测试报告

    全局报告

    单个接口明细报告

    相关文章

      网友评论

      • 科学Jia:30个客户端,同时1000次请求?难道意思是说30个线程模拟了1000个用户请求?还是说30个客户端就是30个线程,每个线程重复1000次?
        Anoyi:后者
      • 隔世虫洞:确实不错,受教了
      • 百鬼涅槃:楼主你好强啊,你能把这个做成一个系列么,我也是做测试的啊
        Anoyi:@百鬼涅槃 可是我不是做测试的呀:cry:
      • 瑾檀yuying:咦,段九,看到封面就进来了:joy::joy::joy:尽管不懂你说的东西。
        Anoyi:@瑾檀yuying 你好,段久的小迷妹 :grin:
      • Holy俊杰:推荐一个一直使用的性能测试工具,分布式的,基于 Python,输出 HTML 格式:
        Locust - A modern load testing framework
        Anoyi:@池边树下 加特林
        池边树下:中文名卢卡斯~_~
        Anoyi:@Holy俊杰 :+1:
      • e17ee46b843a:收藏啦😄
        Anoyi:@sanbrother six six six
      • dcd72632cb19:受教了。[/强]
        顺便请问你这个idea界面是什么主题?
        Anoyi:@cshuig sublime2 的主题

      本文标题:性能测试之 Gatling

      本文链接:https://www.haomeiwen.com/subject/nutxaxtx.html