nGrinder接口性能测试指南

1.nGrinder 环境准备主要包含(JDK1.8.152 以上版本 和nGrinder安装包)已经有一键部署安装包具体下载地址如下:链接: https://pan.baidu.com/s/1Ip3kvju2nia1jXvtBDlTeA 提取码: jxxv ,或者扫二维码下载 “nGrinderServer.tar.gz”

image-20210602094514454 image-20210601234825911

2.将下载后的文件上传至Jenkins部署机器(用于压测)指定目录下,如 /home/ghuser(执行 sudo su 获取root权限)

执行 tar -xvzf nGrinderServer.tar.gz && cd nGrinderServer && sh ./Autoinstall.sh

安装完成后 通过执行 ps -ef|grep “tomcat” 确认nGrinder 服务是否安装成功;如下图

image-20210525145356860

执行ss -tnlp |grep 80 如下图-安装成功

image-20210525145719158

备注:1.一键安装包会试图安装Agent,因目前在本次Demo环境会安装失败,请安装下面步骤手动安装(非root用户,通过sudo su 获取roo’t 权限;

2.默认Tomcat端口为80端口,如果冲突,Tomcat应该会启动失败,通过/nGrinderServer/apache-tomcat-9.0.36/conf/server.xml 配置文件修改为可用端口,如下图所示image-20210525150121578

端口修改后,执行 nGrinderServer/nGrinderStart.sh脚本重新启动nGrinder,启动成功后检查方法同上面

image-20210525145842889

3.启动成功后,通过本地浏览器访问(demo)

如: http://jenkins部署机器IP或域名(如果端口不是80,请带上指定端口)

出现如下页面,输入用户名和密码,默认为admin/admin

image-20210525145035859

登录成功后

image-20210525151146568

4.检查Agent是否安装成功,如下图所示

image-20210525151308512

5.安装Agent

a.修改 /home/ghuser/nGrinderServer/ngrinder-agent/__agent.conf 中的agent.controller_host参数,如本机域名地址:”“krbumatp.chinanorth2.cloudapp.chinacloudapi.cn” 如下图所示,修改成功后,保存并退出;

image-20210525154809549

b.启动Agent cd /home/ghuser/nGrinderServer/ngrinder-agent && sh ./run_agent_bg.sh
c.执行 jps 或者ps -ef|grep java 查看Agent是否启动成功

image-20210525155733556

image-20210525155810786

d.agent 安装启动成功;

image-20210525155918292

6.接口压测脚本开发

a.按下图操作创建压测脚本

image-20210525160149992

image-20210525160749129

b.本次样例:

image-20210525160955920

C.点击“Create” 按钮后,进入下面脚本编辑和调试页面

image-20210525161750233

d.脚本参数完成后-通过“validate” 进行脚本调试和验证,脚本验证成功后,才能进行创建场景进行压测

image-20210525161919899

e.创建场景,按下图操作

image-20210525162029811

image-20210525163333294

f.根据上图将场景创建完毕后,点击 “SAVA and Start” 按钮,如下图所示,(选择立即执行)

image-20210525163613306

g.压测场景启动成功后,如下图所示,会显示执行时间,TPS,响应时间等信息

image-20210525163744027

h.场景执行成功结束后,如下图所示,可以点击“detailed Report” 查看详细报告

image-20210525163843145

i详细报告如下:

image-20210525163938169

附件:本次样例脚本:
  1. import static net.grinder.script.Grinder.grinder
  2. import static org.junit.Assert.*
  3. import static org.hamcrest.Matchers.*
  4. import net.grinder.script.GTest
  5. import net.grinder.script.Grinder
  6. import net.grinder.scriptengine.groovy.junit.GrinderRunner
  7. import net.grinder.scriptengine.groovy.junit.annotation.BeforeProcess
  8. import net.grinder.scriptengine.groovy.junit.annotation.BeforeThread
  9. // import static net.grinder.util.GrinderUtils.* // You can use this if you're using nGrinder after 3.2.3
  10. import org.junit.Before
  11. import org.junit.BeforeClass
  12. import org.junit.Test
  13. import org.junit.runner.RunWith
  14. import org.ngrinder.http.HTTPRequest
  15. import org.ngrinder.http.HTTPRequestControl
  16. import org.ngrinder.http.HTTPResponse
  17. import org.ngrinder.http.cookie.Cookie
  18. import org.ngrinder.http.cookie.CookieManager
  19. /**
  20. * A simple example using the HTTP plugin that shows the retrieval of a single page via HTTP.
  21. *
  22. * This script is automatically generated by ngrinder.
  23. *
  24. * @author admin
  25. */
  26. @RunWith(GrinderRunner)
  27. class TestRunner {
  28. public static GTest test
  29. public static HTTPRequest request
  30. public static Map<String, String> headers = [:]
  31. public static List<Cookie> cookies = []
  32. @BeforeProcess
  33. public static void beforeProcess() {
  34. HTTPRequestControl.setConnectionTimeout(300000)
  35. test = new GTest(1, "krbumatp1060.chinanorth2.cloudapp.chinacloudapi.cn")
  36. request = new HTTPRequest()
  37. // Set header data
  38. headers.put("Content-Type", "application/json")
  39. grinder.logger.info("before process.")
  40. }
  41. @BeforeThread
  42. public void beforeThread() {
  43. test.record(this, "test")
  44. grinder.statistics.delayReports = true
  45. grinder.logger.info("before thread.")
  46. }
  47. @Before
  48. public void before() {
  49. request.setHeaders(headers)
  50. CookieManager.addCookies(cookies)
  51. grinder.logger.info("before. init headers and cookies")
  52. }
  53. @Test
  54. public void test() {
  55. //接口报文参数定义可以根据测试需求进行参数化
  56. def body = "{\"name\":\"Test云智慧Devops${grinder.runNumber}\",\"description\":\"湘菜-鲁菜-粤菜${grinder.runNumber}\"}"
  57. HTTPResponse response = request.POST("http://krbumatp1060.chinanorth2.cloudapp.chinacloudapi.cn:5001/api/foodcategory", body.getBytes())
  58. if (response.statusCode == 301 || response.statusCode == 302) {
  59. grinder.logger.warn("Warning. The response may not be correct. The response code was {}.", response.statusCode)
  60. } else {
  61. assertThat(response.statusCode, is(200))
  62. }
  63. }
  64. }