堪比JMeter的.Net压测工具 - Crank 进阶篇

测试工具 创建于:2022-04-14
  1. 前言   入门篇我们已经成功运行hello.benchmarks.yml并输出
测试结果,本篇我们就hello.benchmarks.yml、以及运行的
shell脚本详细解读下其中的含义。   
2. 剖析hello.benchmarks.yml
  2.1. job   在hello.benchmarks.yml中我们定义了一个新的job:
server,并指定了仓库信息 ( 远程仓库 ):       repository:https://github.com/doddgu/crank.git # 仓库源       branchOrCommit:sample # 分支       project: samples/hello/hello.csproj # 项目

  并通过import导入了bombardier.yml,其中定义了另外一个job: bombardier,并指定了仓库信息 ( 远程仓库 ):   BOMBARDIER         repository: https://github.com/doddgu/crank.git         branchOrCommit: sample         project: src/Microsoft.Crank.Jobs.Bombardier/Microsoft.Crank.Jobs.Bombardier.csproj         sourceKey: bombardier # 服务器使用它来重用相同的源文件夹。         noBuild: true # 定义 SourceKey时,指示是否仍应进行构建

  
2.2. scenarios   在hello.benchmarks.yml中我们定义了场景: hello,并为此场景指定了两个任务:   
·第一个任务名为application,使用的是项目server   
· 第二个任务名为load,并指定使用项目bombardier   
2.3. variables 变量   
·在bombardier.yml中    
-定义了全局变量: headers、presetHeaders(预设header)     
定义了局部变量: connections、warmup、duration、requests、rate、transport、serverScheme等等   
· 在hello.benchmarks.yml中为load定义了局部变量serverPort、path  
 2.4. profiles 配置   在hello.benchmarks.yml中我们:   
· 定义了配置local   
· 并指定了局部变量: serverAddress = localhost   
· 为任务application、load指定了部署作业的endpoint 是 http://localhost:5010 (指定执行任务的Agent地址)   
2.5. arguments 参数   在bombardier.yml中与variables同级的配置: arguments,此参数是在启动job后传递的参数,其中定义的全局参数、局部参数信息也都是为构建完整的参数做准备,bombardier真实的参数信息是: <div>  LANGUAGE-FSHARP</div><div>  -c {{connections}} -w {{warmup}} -d {{duration}} -n {{requests}} --insecure -l {% if rate != 0 %} --rate {{ rate }} {% endif %} {% if transport %} --{{ transport}} {% endif %} {{headers[presetHeaders]}} {% for h in customHeaders %}{% assign s = h | split : ':' %}--header \"{{ s[0] }}: {{ s[1] | strip }}\" {% endfor %} {% if serverUri == blank or serverUri == empty %} {{serverScheme}}://{{serverAddress}}:{{serverPort}}{{path}} {% else %} {{serverUri}}:{{serverPort}}{{path}} {% endif %} {% if bodyFile != blank and bodyFile != empty %} -f {{bodyFile}} {% endif %}  {% if verb != blank and verb != empty %} -m {{verb}} {% endif %}</div>   
3. 改造hello.benchmarks.yml   改造hello.benchmarks.yml,不考虑重用,最原始的代码如下   LANGUAGE-YAML   variables:     headers:       none: ''       plaintext: '--header "Accept: text/plain,text/html;q=0.9,application/xhtml+xml;q=0.9,application/xml;q=0.8,*/*;q=0.7" --header "Connection: keep-alive"'       html: '--header "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" --header "Connection: keep-alive"'       json: '--header "Accept: application/json,text/html;q=0.9,application/xhtml+xml;q=0.9,application/xml;q=0.8,*/*;q=0.7" --header "Connection: keep-alive"'       connectionclose: '--header "Connection: close"'     presetHeaders: none   jobs:     bombardier:       source:         repository: https://github.com/dotnet/crank.git         branchOrCommit: main         project: src/Microsoft.Crank.Jobs.Bombardier/Microsoft.Crank.Jobs.Bombardier.csproj         sourceKey: bombardier         noBuild: true       readyStateText: Bombardier Client       waitForExit: true       variables:         connections: 256         warmup: 15         duration: 15         requests: 0         rate: 0         transport: fasthttp # | http1 | http2         serverScheme: http         serverAddress: localhost         serverPort: 5000         path:          bodyFile: # path or url for a file to use as the body content         verb: # GET when nothing is specified         customHeaders: [ ] # list of headers with the format: '<name1>: <value1>', e.g. [ 'content-type: application/json' ]       arguments: "-c {{connections}} -w {{warmup}} -d {{duration}} -n {{requests}} --insecure -l {% if rate != 0 %} --rate {{ rate }} {% endif %} {% if transport %} --{{ transport}} {% endif %} {{headers[presetHeaders]}} {% for h in customHeaders %}{% assign s = h | split : ':' %}--header \"{{ s[0] }}: {{ s[1] | strip }}\" {% endfor %} {% if serverUri == blank or serverUri == empty %} {{serverScheme}}://{{serverAddress}}:{{serverPort}}{{path}} {% else %} {{serverUri}}:{{serverPort}}{{path}} {% endif %} {% if bodyFile != blank and bodyFile != empty %} -f {{bodyFile}} {% endif %}  {% if verb != blank and verb != empty %} -m {{verb}} {% endif %}"       onConfigure:          # - job.timeout = Number(job.variables.duration) + Number(job.variables.warmup) + 10;           endpoints:          - http://localhost:5010          server:       source:         repository: https://github.com/doddgu/crank         branchOrCommit: sample         project: samples/hello/hello.csproj       readyStateText: Application started.       endpoints:          - http://localhost:5010   scenarios:     hello:       application:         job: server       load:         job: bombardier         variables:           serverPort: 5000           path: /

  
4. 解读crank shell   之前我们通过shell执行:   
·crank --config hello.benchmarks.yml --scenario hello --profile local --load.framework net5.0 --application.framework net5.0   其中crank 是固定的、代表:Crank Controller   --config:固定的配置,指执行哪个yml配置,每次仅能指定一个yml配置   --scenario:固定的配置,设置场景是hello   --profile:固定的配置,非必选,可多次设置,指定当前Crank命令申请的配置是local,使用local下配置的所有信息   --load.framework: 格式:<任务名>.framework,为任务load指定framework的运行框架版本是net5.0、--application.framework同理   
· 改造hello.benchmarks.yml,因为移除了profile,所以执行: crank --config hello.yml --scenario hello --load.framework net5.0 --application.framework net5.0 即可   
5. 疑问   
·为什么启动crank时要增加--application.framework net5.0?
    -安装crank要求必须有net5.0的环境,所以指定net5.0不需要再单独安装框架环境   
· 为什么启动crank时不指定framework时默认是netcore3.1呢?
    - 使用记事本打开hello.csproj、Microsoft.Crank.Jobs.Bombardier.csproj 即可了解   
· scenarios节点下application以及load两个节点名称可以更换吗?只能有两个节点?
    - 节点名称不固定,可以更换,也没有限制必须是两个节点,具体多少个节点根据自己的需要来


  
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理

权威发布,测试选择不纠结!第15届软件测试行业报告,直击行业发展,把握未来方向!

原文地址:http://www.51testing.com/?action-viewnews-itemid-5099530

免责声明:本文来源于互联网,版权归合法拥有者所有,如有侵权请公众号联系管理员

* 本站提供的一些文章、资料是供学习研究之用,如用于商业用途,请购买正版。

发表于:2022-4-14 09:55 作者:Crank 来源:博客园