├── Ankki.Api.Test.jmx ├── BT_Docker └── prometheus │ ├── .env │ ├── docker-compose.yml │ └── prometheus.yml ├── Dat ├── 登录信息.dat ├── 登录断言.dat └── 首页断言.dat ├── README.md ├── Startup_Linux.sh ├── Startup_Win.sh ├── 使用说明.txt └── 测试报告 └── 测试报告.xlsx /Ankki.Api.Test.jmx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | false 7 | true 8 | true 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | Thread_Num 19 | 10 20 | 线程并发数(thread_num,1) 21 | = 22 | 23 | 24 | Duration 25 | 60 26 | = 27 | 28 | 29 | < ------------------------------------------------------------------------------------------ 30 | ------------------------------------- 系统平台域名变量 ------------------------------ 31 | ------------------------------------------------------------------------------------------> 32 | = 33 | 34 | 35 | IP 36 | 172.19.5.160 37 | = 38 | 39 | 40 | Port 41 | 8443 42 | = 43 | 44 | 45 | Authorization 46 | 226e4a7d02d04b19afc5adf5c7efe68d 47 | = 48 | 49 | 50 | < ------------------------------------------------------------------------------------------ ------------------------------------- 性能监控平台域名变量 ------------------------------ ------------------------------------------------------------------------------------------> 51 | ------------------------------------- 性能监控平台域名变量 ------------------------------ 52 | ------------------------------------------------------------------------------------------> 53 | = 54 | 55 | 56 | Grafana_IP 57 | 172.19.5.240 58 | 性能监控平台(http://172.19.1.170:3000/d/b4kP_KoMzasadasd/jmeter-load-test-org-md-jmeter-influxdb2-visualizer-influxdb-v2-0-flux?orgId=1) 59 | = 60 | 61 | 62 | influxDB_HttpScheme 63 | http 64 | 监控数据库请求协议 65 | = 66 | 67 | 68 | influxDB_Host 69 | 172.19.5.240 70 | 监控数据库IP(http://172.19.1.170:8086) 71 | = 72 | 73 | 74 | InfluxDB_Port 75 | 8086 76 | 监控数据库端口(8086) 77 | = 78 | 79 | 80 | influxDB_Organization 81 | Ankki 82 | 监控数据库组织 83 | = 84 | 85 | 86 | InfluxDB_Bucket 87 | Jmeter 88 | 监控数据库名称 89 | = 90 | 91 | 92 | influxDB_Token 93 | ankki111111 94 | 监控数据库token 95 | = 96 | 97 | 98 | 99 | 100 | 101 | continue 102 | 103 | false 104 | -1 105 | 106 | ${Thread_Num} 107 | 1 108 | false 109 | ${Duration} 110 | 111 | true 112 | 113 | 114 | 115 | 116 | 117 | Content-Type 118 | application/json;charset=UTF-8 119 | 120 | 121 | authorization 122 | ${Authorization} 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | ${IP} 132 | ${Port} 133 | https 134 | UTF-8 135 | /protectObject?page=1&size=12&protectObjectName= 136 | GET 137 | true 138 | false 139 | true 140 | false 141 | 142 | 143 | 144 | 145 | 146 | 147 | $.code 148 | 0 149 | true 150 | false 151 | false 152 | true 153 | 154 | 155 | 156 | 157 | false 158 | 159 | saveConfig 160 | 161 | 162 | true 163 | true 164 | true 165 | 166 | true 167 | true 168 | true 169 | true 170 | false 171 | true 172 | true 173 | false 174 | false 175 | false 176 | true 177 | false 178 | false 179 | false 180 | true 181 | 0 182 | true 183 | true 184 | true 185 | true 186 | true 187 | true 188 | 189 | 190 | 191 | 192 | 193 | 194 | false 195 | 196 | saveConfig 197 | 198 | 199 | true 200 | true 201 | true 202 | 203 | true 204 | true 205 | true 206 | true 207 | false 208 | true 209 | true 210 | false 211 | false 212 | false 213 | true 214 | false 215 | false 216 | false 217 | true 218 | 0 219 | true 220 | true 221 | true 222 | true 223 | true 224 | true 225 | 226 | 227 | 228 | Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值 229 | Samples:表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100 230 | Average:平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,也可以以Transaction 为单位显示平均响应时间(单位:ms) 231 | Median:中位数,也就是 50% 用户的响应时间(单位:ms) 232 | 90% Line:90% 用户的响应时间(单位:ms) 233 | 95% Line:95% 用户的响应时间(单位:ms) 234 | 99% Line:99% 用户的响应时间(单位:ms) 235 | Min:最小响应时间(单位:ms) 236 | Max:最大响应时间(单位:ms) 237 | Error%:本次测试中出现错误的请求的数量/请求的总数 238 | Throughput:吞吐量(Request/Sec) 每秒多少请求,大多数情况(未有错误时)等于TPS,宏观上:TPS=并发数/响应时间(sample样本数)/(最后一个线程启动的时间+最后一个线程持续的时间-第一个线程启动的时间) 239 | KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec 240 | 241 | TPS:每秒事务数(TPS) 242 | QPS:每秒查询率(QPS) 243 | OPS:每秒响应请求数(OPS) 244 | PS:一个页面的一次访问形成一个tps;但每一次页面访问可能产生多次对服务器的请求,多次请求ops 245 | true 246 | 247 | 248 | 249 | false 250 | 251 | saveConfig 252 | 253 | 254 | true 255 | true 256 | true 257 | 258 | true 259 | true 260 | true 261 | true 262 | false 263 | true 264 | true 265 | false 266 | false 267 | false 268 | true 269 | false 270 | false 271 | false 272 | true 273 | 0 274 | true 275 | true 276 | true 277 | true 278 | true 279 | true 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | testName 290 | Test 291 | = 292 | 293 | 294 | nodeName 295 | Test-Node 296 | = 297 | 298 | 299 | runId 300 | R001 301 | = 302 | 303 | 304 | influxDBHttpScheme 305 | ${influxDB_HttpScheme} 306 | = 307 | 308 | 309 | influxDBHost 310 | ${influxDB_Host} 311 | = 312 | 313 | 314 | influxDBPort 315 | ${InfluxDB_Port} 316 | = 317 | 318 | 319 | influxDBToken 320 | ${influxDB_Token} 321 | = 322 | 323 | 324 | influxDBOrganization 325 | ${influxDB_Organization} 326 | = 327 | 328 | 329 | influxDBBucket 330 | ${InfluxDB_Bucket} 331 | = 332 | 333 | 334 | influxDBFlushInterval 335 | 4000 336 | = 337 | 338 | 339 | influxDBMaxBatchSize 340 | 2000 341 | = 342 | 343 | 344 | samplersList 345 | .* 346 | = 347 | 348 | 349 | useRegexForSamplerList 350 | true 351 | = 352 | 353 | 354 | recordSubSamples 355 | true 356 | = 357 | 358 | 359 | saveResponseBodyOfFailures 360 | true 361 | = 362 | 363 | 364 | 365 | org.md.jmeter.influxdb2.visualizer.InfluxDatabaseBackendListenerClient 366 | 367 | 368 | 369 | 370 | continue 371 | 372 | false 373 | 1 374 | 375 | 1 376 | 1 377 | false 378 | 379 | 380 | true 381 | 382 | 383 | 384 | 385 | 386 | Content-Type 387 | application/json;charset=UTF-8 388 | 389 | 390 | authorization 391 | !!d4ccbf8bcec04d1680f0737ec3ee2980 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | true 401 | websecadmin 402 | = 403 | true 404 | loginName 405 | 406 | 407 | true 408 | 4wq4Bztuq5cak5s+NYXGnw== 409 | = 410 | true 411 | password 412 | 413 | 414 | true 415 | 11Xe6UQMNqK1VU+HtTJJww== 416 | = 417 | true 418 | checkCode 419 | 420 | 421 | true 422 | 11Xe6UQMNqK1VU+HtTJJww== 423 | = 424 | true 425 | retValue 426 | 427 | 428 | 429 | 172.19.2.86 430 | 8443 431 | https 432 | UTF-8 433 | /user/login 434 | POST 435 | false 436 | false 437 | true 438 | false 439 | 440 | 441 | 442 | 443 | 444 | 445 | $.code 446 | 0 447 | true 448 | false 449 | false 450 | true 451 | 452 | 453 | 454 | 455 | true 456 | 457 | 458 | 459 | false 460 | { 461 | "size": null, 462 | "page": null, 463 | "start": null, 464 | "startTime": null, 465 | "endTime": null, 466 | "authorization": null, 467 | "userName": "", 468 | "keyword": null, 469 | "sensKey": null, 470 | "id": 40, 471 | "strategyName": "mobile", 472 | "appId": 1, 473 | "sensitiveTypeId": 1058, 474 | "accessUrl": "", 475 | "fieldName": "", 476 | "appName": "default", 477 | "sensitivetypeName": "WEB_mobile", 478 | "desensitizationAlgorithmName": "不脱敏", 479 | "desensitizationAlgorithmId": 2, 480 | "commOrException": 0, 481 | "appStrategyIdList": null, 482 | "updateTm": 1652427688000, 483 | "createTm": 1652174138000 484 | } 485 | = 486 | 487 | 488 | 489 | 172.19.2.86 490 | 8443 491 | https 492 | UTF-8 493 | /webdynamic/webstrategy-info/updateWebStrategyInfo 494 | PUT 495 | false 496 | false 497 | true 498 | false 499 | 500 | 501 | 502 | 503 | 504 | 505 | $.code 506 | 0 507 | true 508 | false 509 | false 510 | true 511 | 512 | 513 | 514 | 515 | true 516 | 517 | 518 | 519 | false 520 | { 521 | "size": null, 522 | "page": null, 523 | "start": null, 524 | "startTime": null, 525 | "endTime": null, 526 | "authorization": null, 527 | "userName": "", 528 | "keyword": null, 529 | "sensKey": null, 530 | "id": 40, 531 | "strategyName": "mobile", 532 | "appId": 1, 533 | "sensitiveTypeId": 1058, 534 | "accessUrl": "", 535 | "fieldName": "", 536 | "appName": "default", 537 | "sensitivetypeName": "WEB_mobile", 538 | "desensitizationAlgorithmName": "不脱敏", 539 | "desensitizationAlgorithmId": 11, 540 | "commOrException": 0, 541 | "appStrategyIdList": null, 542 | "updateTm": 1652430153000, 543 | "createTm": 1652174138000 544 | } 545 | = 546 | 547 | 548 | 549 | 172.19.2.86 550 | 8443 551 | https 552 | UTF-8 553 | /webdynamic/webstrategy-info/updateWebStrategyInfo 554 | PUT 555 | false 556 | false 557 | true 558 | false 559 | 560 | 561 | 562 | 563 | 564 | 565 | $.code 566 | 0 567 | true 568 | false 569 | false 570 | true 571 | 572 | 573 | 574 | 575 | 576 | continue 577 | 578 | false 579 | -1 580 | 581 | ${Thread_Num} 582 | 1 583 | true 584 | ${Duration} 585 | 586 | false 587 | 588 | 589 | 590 | false 591 | false 592 | 593 | 594 | 595 | 596 | 597 | IP 598 | 172.19.2.50 599 | 测试环境 600 | = 601 | 602 | 603 | Port 604 | 10086 605 | 端口 606 | = 607 | 608 | 609 | Page 610 | 1 611 | 页数 612 | = 613 | 614 | 615 | Size 616 | 60 617 | 条数 618 | = 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | false 627 | false 628 | 629 | 630 | 631 | 632 | 633 | 634 | true 635 | sysadmin 636 | = 637 | true 638 | username 639 | 640 | 641 | true 642 | 4wq4Bztuq5cak5s+NYXGnw== 643 | = 644 | true 645 | password 646 | 647 | 648 | true 649 | i/X2zqxiWZcJ2Dh24kfVGQ== 650 | = 651 | true 652 | checkCode 653 | 654 | 655 | true 656 | acff2ca2-9874-4836-a744-d720837aa1cf 657 | = 658 | true 659 | codeId 660 | 661 | 662 | 663 | ${IP} 664 | ${Port} 665 | http 666 | UTF-8 667 | /api/login 668 | POST 669 | false 670 | false 671 | true 672 | false 673 | 674 | 675 | 676 | 677 | 678 | 679 | $.code 680 | 0 681 | true 682 | false 683 | false 684 | true 685 | 686 | 687 | 688 | accessToken 689 | $.data.accessToken 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | false 699 | false 700 | 701 | 702 | 703 | 704 | 705 | Content-Type 706 | application/json;charset=UTF-8 707 | 708 | 709 | Authorization 710 | ${accessToken} 711 | 712 | 713 | 714 | 715 | 716 | true 717 | 718 | 719 | 720 | false 721 | { 722 | "current": 1, 723 | "size": ${Size} 724 | } 725 | = 726 | 727 | 728 | 729 | ${IP} 730 | ${Port} 731 | http 732 | UTF-8 733 | /api/user/list 734 | POST 735 | true 736 | false 737 | true 738 | false 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | Content-Type 748 | application/json 749 | 750 | 751 | accessToken 752 | Bearer ${accessToken} 753 | 754 | 755 | 756 | 757 | 758 | $.code 759 | 0 760 | true 761 | false 762 | false 763 | true 764 | 765 | 766 | 767 | 768 | 769 | false 770 | false 771 | 772 | 773 | 774 | 775 | 776 | Content-Type 777 | application/json;charset=UTF-8 778 | 779 | 780 | Authorization 781 | ${accessToken} 782 | 783 | 784 | 785 | 786 | 787 | true 788 | 789 | 790 | 791 | false 792 | { 793 | "current": 1, 794 | "size": ${Size} 795 | } 796 | = 797 | 798 | 799 | 800 | ${IP} 801 | ${Port} 802 | http 803 | UTF-8 804 | /api/system/operationLogs/pageList 805 | POST 806 | true 807 | false 808 | true 809 | false 810 | 811 | 812 | 813 | 814 | 815 | 816 | $.code 817 | 0 818 | true 819 | false 820 | false 821 | true 822 | 823 | 824 | 825 | 826 | 827 | 828 | false 829 | false 830 | 831 | 832 | 833 | 834 | 835 | IP 836 | 172.19.2.86 837 | 测试环境 838 | = 839 | 840 | 841 | Port 842 | 6080 843 | 端口 844 | = 845 | 846 | 847 | Page 848 | 1 849 | 页数 850 | = 851 | 852 | 853 | Size 854 | 60 855 | 条数 856 | = 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | false 865 | false 866 | 867 | 868 | 869 | 870 | 871 | 872 | true 873 | sysadmin 874 | = 875 | true 876 | username 877 | 878 | 879 | true 880 | 4wq4Bztuq5cak5s+NYXGnw== 881 | = 882 | true 883 | password 884 | 885 | 886 | true 887 | i/X2zqxiWZcJ2Dh24kfVGQ== 888 | = 889 | true 890 | checkCode 891 | 892 | 893 | true 894 | acff2ca2-9874-4836-a744-d720837aa1cf 895 | = 896 | true 897 | codeId 898 | 899 | 900 | 901 | ${IP} 902 | ${Port} 903 | http 904 | UTF-8 905 | /api/login 906 | POST 907 | false 908 | false 909 | true 910 | false 911 | 912 | 913 | 914 | 915 | 916 | 917 | $.code 918 | 0 919 | true 920 | false 921 | false 922 | true 923 | 924 | 925 | 926 | accessToken 927 | $.data.accessToken 928 | 929 | 930 | 931 | 932 | 933 | 934 | 935 | 936 | false 937 | false 938 | 939 | 940 | 941 | 942 | 943 | Content-Type 944 | application/json;charset=UTF-8 945 | 946 | 947 | Authorization 948 | ${accessToken} 949 | 950 | 951 | 952 | 953 | 954 | true 955 | 956 | 957 | 958 | false 959 | { 960 | "current": 1, 961 | "size": ${Size} 962 | } 963 | = 964 | 965 | 966 | 967 | ${IP} 968 | ${Port} 969 | http 970 | UTF-8 971 | /api/user/list 972 | POST 973 | true 974 | false 975 | true 976 | false 977 | 978 | 979 | 980 | 981 | 982 | 983 | 984 | 985 | Content-Type 986 | application/json 987 | 988 | 989 | accessToken 990 | Bearer ${accessToken} 991 | 992 | 993 | 994 | 995 | 996 | $.code 997 | 0 998 | true 999 | false 1000 | false 1001 | true 1002 | 1003 | 1004 | 1005 | 1006 | 1007 | false 1008 | false 1009 | 1010 | 1011 | 1012 | 1013 | 1014 | Content-Type 1015 | application/json;charset=UTF-8 1016 | 1017 | 1018 | Authorization 1019 | ${accessToken} 1020 | 1021 | 1022 | 1023 | 1024 | 1025 | true 1026 | 1027 | 1028 | 1029 | false 1030 | { 1031 | "current": 1, 1032 | "size": ${Size} 1033 | } 1034 | = 1035 | 1036 | 1037 | 1038 | ${IP} 1039 | ${Port} 1040 | http 1041 | UTF-8 1042 | /api/system/operationLogs/pageList 1043 | POST 1044 | true 1045 | false 1046 | true 1047 | false 1048 | 1049 | 1050 | 1051 | 1052 | 1053 | 1054 | $.code 1055 | 0 1056 | true 1057 | false 1058 | false 1059 | true 1060 | 1061 | 1062 | 1063 | 1064 | 1065 | 1066 | false 1067 | false 1068 | 1069 | 1070 | 1071 | 1072 | 1073 | IP 1074 | 172.19.2.86 1075 | 测试环境 1076 | = 1077 | 1078 | 1079 | Port 1080 | 6080 1081 | 端口 1082 | = 1083 | 1084 | 1085 | Page 1086 | 1 1087 | 页数 1088 | = 1089 | 1090 | 1091 | Size 1092 | 60 1093 | 条数 1094 | = 1095 | 1096 | 1097 | 1098 | 1099 | 1100 | 1101 | 1102 | false 1103 | false 1104 | 1105 | 1106 | 1107 | 1108 | 1109 | 1110 | true 1111 | sysadmin 1112 | = 1113 | true 1114 | username 1115 | 1116 | 1117 | true 1118 | 4wq4Bztuq5cak5s+NYXGnw== 1119 | = 1120 | true 1121 | password 1122 | 1123 | 1124 | true 1125 | i/X2zqxiWZcJ2Dh24kfVGQ== 1126 | = 1127 | true 1128 | checkCode 1129 | 1130 | 1131 | true 1132 | acff2ca2-9874-4836-a744-d720837aa1cf 1133 | = 1134 | true 1135 | codeId 1136 | 1137 | 1138 | 1139 | ${IP} 1140 | ${Port} 1141 | http 1142 | UTF-8 1143 | /api/login 1144 | POST 1145 | false 1146 | false 1147 | true 1148 | false 1149 | 1150 | 1151 | 1152 | 1153 | 1154 | 1155 | $.code 1156 | 0 1157 | true 1158 | false 1159 | false 1160 | true 1161 | 1162 | 1163 | 1164 | accessToken 1165 | $.data.accessToken 1166 | 1167 | 1168 | 1169 | 1170 | 1171 | 1172 | 1173 | 1174 | false 1175 | false 1176 | 1177 | 1178 | 1179 | 1180 | 1181 | Content-Type 1182 | application/json;charset=UTF-8 1183 | 1184 | 1185 | Authorization 1186 | ${accessToken} 1187 | 1188 | 1189 | 1190 | 1191 | 1192 | true 1193 | 1194 | 1195 | 1196 | false 1197 | { 1198 | "current": 1, 1199 | "size": ${Size} 1200 | } 1201 | = 1202 | 1203 | 1204 | 1205 | ${IP} 1206 | ${Port} 1207 | http 1208 | UTF-8 1209 | /api/user/list 1210 | POST 1211 | true 1212 | false 1213 | true 1214 | false 1215 | 1216 | 1217 | 1218 | 1219 | 1220 | 1221 | 1222 | 1223 | Content-Type 1224 | application/json 1225 | 1226 | 1227 | accessToken 1228 | Bearer ${accessToken} 1229 | 1230 | 1231 | 1232 | 1233 | 1234 | $.code 1235 | 0 1236 | true 1237 | false 1238 | false 1239 | true 1240 | 1241 | 1242 | 1243 | 1244 | 1245 | false 1246 | false 1247 | 1248 | 1249 | 1250 | 1251 | 1252 | Content-Type 1253 | application/json;charset=UTF-8 1254 | 1255 | 1256 | Authorization 1257 | ${accessToken} 1258 | 1259 | 1260 | 1261 | 1262 | 1263 | true 1264 | 1265 | 1266 | 1267 | false 1268 | { 1269 | "current": 1, 1270 | "size": ${Size} 1271 | } 1272 | = 1273 | 1274 | 1275 | 1276 | ${IP} 1277 | ${Port} 1278 | http 1279 | UTF-8 1280 | /api/system/operationLogs/pageList 1281 | POST 1282 | true 1283 | false 1284 | true 1285 | false 1286 | 1287 | 1288 | 1289 | 1290 | 1291 | 1292 | $.code 1293 | 0 1294 | true 1295 | false 1296 | false 1297 | true 1298 | 1299 | 1300 | 1301 | 1302 | 1303 | 1304 | 1305 | false 1306 | 1307 | saveConfig 1308 | 1309 | 1310 | true 1311 | true 1312 | true 1313 | 1314 | true 1315 | true 1316 | true 1317 | true 1318 | false 1319 | true 1320 | true 1321 | false 1322 | false 1323 | false 1324 | true 1325 | false 1326 | false 1327 | false 1328 | true 1329 | 0 1330 | true 1331 | true 1332 | true 1333 | true 1334 | true 1335 | true 1336 | 1337 | 1338 | 1339 | 1340 | 1341 | 1342 | false 1343 | 1344 | saveConfig 1345 | 1346 | 1347 | true 1348 | true 1349 | true 1350 | 1351 | true 1352 | true 1353 | true 1354 | true 1355 | false 1356 | true 1357 | true 1358 | false 1359 | false 1360 | false 1361 | true 1362 | false 1363 | false 1364 | false 1365 | true 1366 | 0 1367 | true 1368 | true 1369 | true 1370 | true 1371 | true 1372 | true 1373 | 1374 | 1375 | 1376 | Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值 1377 | Samples:表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100 1378 | Average:平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,也可以以Transaction 为单位显示平均响应时间(单位:ms) 1379 | Median:中位数,也就是 50% 用户的响应时间(单位:ms) 1380 | 90% Line:90% 用户的响应时间(单位:ms) 1381 | 95% Line:95% 用户的响应时间(单位:ms) 1382 | 99% Line:99% 用户的响应时间(单位:ms) 1383 | Min:最小响应时间(单位:ms) 1384 | Max:最大响应时间(单位:ms) 1385 | Error%:本次测试中出现错误的请求的数量/请求的总数 1386 | Throughput:吞吐量(Request/Sec) 每秒多少请求,大多数情况(未有错误时)等于TPS,宏观上:TPS=并发数/响应时间(sample样本数)/(最后一个线程启动的时间+最后一个线程持续的时间-第一个线程启动的时间) 1387 | KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec 1388 | 1389 | TPS:每秒事务数(TPS) 1390 | QPS:每秒查询率(QPS) 1391 | OPS:每秒响应请求数(OPS) 1392 | PS:一个页面的一次访问形成一个tps;但每一次页面访问可能产生多次对服务器的请求,多次请求ops 1393 | true 1394 | 1395 | 1396 | 1397 | false 1398 | 1399 | saveConfig 1400 | 1401 | 1402 | true 1403 | true 1404 | true 1405 | 1406 | true 1407 | true 1408 | true 1409 | true 1410 | false 1411 | true 1412 | true 1413 | false 1414 | false 1415 | false 1416 | true 1417 | false 1418 | false 1419 | false 1420 | true 1421 | 0 1422 | true 1423 | true 1424 | true 1425 | true 1426 | true 1427 | true 1428 | 1429 | 1430 | 1431 | true 1432 | 1433 | 1434 | 1435 | 1436 | 1437 | 1438 | testName 1439 | Test 1440 | = 1441 | 1442 | 1443 | nodeName 1444 | Test-Node 1445 | = 1446 | 1447 | 1448 | runId 1449 | R001 1450 | = 1451 | 1452 | 1453 | influxDBHttpScheme 1454 | ${influxDBHttpScheme} 1455 | = 1456 | 1457 | 1458 | influxDBHost 1459 | ${InfluxDB_IP} 1460 | = 1461 | 1462 | 1463 | influxDBPort 1464 | ${InfluxDB_Port} 1465 | = 1466 | 1467 | 1468 | influxDBToken 1469 | ${influxDB_Token} 1470 | = 1471 | 1472 | 1473 | influxDBOrganization 1474 | ${influxDB_Organization} 1475 | = 1476 | 1477 | 1478 | influxDBBucket 1479 | ${InfluxDB_Bucket} 1480 | = 1481 | 1482 | 1483 | influxDBFlushInterval 1484 | 4000 1485 | = 1486 | 1487 | 1488 | influxDBMaxBatchSize 1489 | 2000 1490 | = 1491 | 1492 | 1493 | samplersList 1494 | .* 1495 | = 1496 | 1497 | 1498 | useRegexForSamplerList 1499 | true 1500 | = 1501 | 1502 | 1503 | recordSubSamples 1504 | true 1505 | = 1506 | 1507 | 1508 | saveResponseBodyOfFailures 1509 | true 1510 | = 1511 | 1512 | 1513 | 1514 | org.md.jmeter.influxdb2.visualizer.InfluxDatabaseBackendListenerClient 1515 | 1516 | 1517 | 1518 | 1519 | 1520 | -------------------------------------------------------------------------------- /BT_Docker/prometheus/.env: -------------------------------------------------------------------------------- 1 | INFLUXDB_USERNAME=ankki 2 | INFLUXDB_PASSWORD=ankki111111 3 | INFLUXDB_ORG=Ankki 4 | INFLUXDB_BUCKET=Jmeter 5 | INFLUXDB_ADMIN_TOKEN=ankki111111 6 | 7 | GRAFANA_USERNAME=ankki 8 | GRAFANA_PASSWORD=ankki111111 9 | 10 | PROMETHEUS_USERNAME=ankki 11 | PROMETHEUS_PASSWORD=ankki111111 -------------------------------------------------------------------------------- /BT_Docker/prometheus/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.1' 2 | 3 | services: 4 | influxdb: 5 | image: influxdb:latest 6 | container_name: influxdb 7 | ports: 8 | - "8083:8083" 9 | - "8086:8086" 10 | - "8090:8090" 11 | volumes: 12 | - influxdb-storage:/var/lib/influxdb 13 | environment: 14 | - DOCKER_INFLUXDB_INIT_MODE=setup 15 | - DOCKER_INFLUXDB_INIT_USERNAME=${INFLUXDB_USERNAME} 16 | - DOCKER_INFLUXDB_INIT_PASSWORD=${INFLUXDB_PASSWORD} 17 | - DOCKER_INFLUXDB_INIT_ORG=${INFLUXDB_ORG} 18 | - DOCKER_INFLUXDB_INIT_BUCKET=${INFLUXDB_BUCKET} 19 | - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=${INFLUXDB_ADMIN_TOKEN} 20 | network_mode: "bridge" 21 | 22 | prometheus: 23 | image: prom/prometheus:latest 24 | container_name: prometheus 25 | hostname: prometheus 26 | restart: always 27 | volumes: 28 | - ./prometheus.yml:/etc/prometheus/prometheus.yml 29 | command: 30 | - '--config.file=/etc/prometheus/prometheus.yml' 31 | - '--web.external-url=http://localhost/prometheus' 32 | ports: 33 | - "9090:9090" 34 | environment: 35 | - PROMETHEUS_ADMIN_USER=${PROMETHEUS_USERNAME} 36 | - PROMETHEUS_ADMIN_PASSWORD=${PROMETHEUS_PASSWORD} 37 | network_mode: "bridge" 38 | 39 | node-exporter: 40 | image: quay.io/prometheus/node-exporter:latest 41 | container_name: node-exporter 42 | hostname: node-exporter 43 | restart: always 44 | ports: 45 | - "9100:9100" 46 | network_mode: "bridge" 47 | 48 | grafana: 49 | image: grafana/grafana:latest 50 | container_name: grafana 51 | hostname: grafana 52 | restart: always 53 | ports: 54 | - "3000:3000" 55 | volumes: 56 | - grafana-storage:/var/lib/grafana 57 | - ./grafana-provisioning/:/etc/grafana/provisioning/ 58 | depends_on: 59 | - prometheus 60 | environment: 61 | - GF_USERS_ALLOW_SIGN_UP=true 62 | - GF_SECURITY_ADMIN_USER=${GRAFANA_USERNAME} 63 | - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD} 64 | - DOCKER_INFLUXDB_INIT_ORG=${INFLUXDB_ORG} 65 | - DOCKER_INFLUXDB_INIT_BUCKET=${INFLUXDB_BUCKET} 66 | - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=${INFLUXDB_ADMIN_TOKEN} 67 | network_mode: "bridge" 68 | 69 | volumes: 70 | influxdb-storage: 71 | grafana-storage: -------------------------------------------------------------------------------- /BT_Docker/prometheus/prometheus.yml: -------------------------------------------------------------------------------- 1 | # Prometheus全局配置项 2 | global: 3 | scrape_interval: 15s # 设定抓取数据的周期,默认为1min 4 | evaluation_interval: 15s # 设定更新rules文件的周期,默认为1min 5 | scrape_timeout: 15s # 设定抓取数据的超时时间,默认为10s 6 | 7 | 8 | # scape配置 9 | scrape_configs: 10 | # job_name默认写入timeseries的labels中,可以用于查询使用 11 | - job_name: 'prometheus' 12 | scrape_interval: 15s # 抓取周期,默认采用global配置 13 | static_configs: 14 | - targets: ['172.19.5.240:9090'] # prometheus所要抓取数据的地址,即instance实例项 15 | 16 | - job_name: '172.19.5.240' 17 | scrape_interval: 8s 18 | static_configs: 19 | - targets: ['172.19.5.240:9100'] 20 | labels: 21 | instance: 172.19.5.240 22 | 23 | - job_name: '172.19.5.241' 24 | scrape_interval: 8s 25 | static_configs: 26 | - targets: ['172.19.5.241:9100'] 27 | labels: 28 | instance: 172.19.5.241 29 | 30 | - job_name: '172.19.5.160' 31 | scrape_interval: 8s 32 | static_configs: 33 | - targets: ['172.19.5.160:9100'] 34 | labels: 35 | instance: 172.19.5.160 36 | 37 | - job_name: 'cadvisor' 38 | static_configs: 39 | - targets: ['172.19.5.240:8899'] 40 | labels: 41 | instance: cadvisor 42 | 43 | - job_name: 'redis_exporter' 44 | static_configs: 45 | - targets: [ '172.19.5.240:9121' ] 46 | labels: 47 | instance: redis 48 | 49 | - job_name: 'mysql_exporter' 50 | static_configs: 51 | - targets: [ '172.19.5.240:9104' ] 52 | labels: 53 | instance: redis -------------------------------------------------------------------------------- /Dat/登录信息.dat: -------------------------------------------------------------------------------- 1 | 18688888888,1234 2 | 18688888889,1234 3 | 18688888887,1234 4 | 5 | 6 | -------------------------------------------------------------------------------- /Dat/登录断言.dat: -------------------------------------------------------------------------------- 1 | 18002 2 | 18002 3 | 18002 4 | 5 | 6 | -------------------------------------------------------------------------------- /Dat/首页断言.dat: -------------------------------------------------------------------------------- 1 | 18688888888 2 | 18688888889 3 | 18688888887 4 | 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 欢迎查阅Apache JMeter(性能自动化测试框架体系) 2 | ![](https://testerhome.com/uploads/photo/2018/fdeb14b5-6163-4adb-b1e0-d11f3209639b.png!large) 3 | 4 | - **JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测 试但后来扩展到其他测试领域** 5 | - 可用于压力测试及性能测试,数据库测试,Java程序的测试,HTTP及FTP测试,Web Service测试等等 6 | - 可用于对静态的和动态的资源(文件,Servlet,Perl脚本,java 对象,数据库和查询,FTP服务器等等)的性能进行测试 7 | - 可用于对服务器、网络或对象模拟巨大的负载,来在不同压力类别下测试它们的 强度和分析整体性能 8 | - 可用于对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果 9 | 10 | ### 源码地址: 11 | Gitee地址:https://gitee.com/hagyao520/JMeter.git 12 | GitHub地址:https://github.com/hagyao520/JMeter.git 13 | 14 | ### 框架介绍: 15 | - Jmeter + Grafana + InfluxDB2.x + Prometheus + Node_Exporter + Dat + Excel + Jenkins 16 | - 使用 JMeter 作为性能测试工具,负责压力测试和负载测试 17 | - 使用 Grafana 作为WEB可视化平台,拥有丰富的指标仪表盘和图形编辑器 18 | - 使用 Influxdb 作为一个开源的分布式时序、时间和指标数据库,使用go语言编写,无需外部依赖 19 | - 使用 Prometheus 作为系统监控和报警系统 20 | - 使用 Node_Exporter 作为性能数据采集工具 21 | - 使用 Dat 作为数据参数化文件,以供JMeter调用 22 | - 使用 Excel 作为测试报告数据管理工具,方便统计数据,进行数据分析生成报表 23 | - 使用 Jenkins 作为自动化持续集成平台,方便自动编译,自动打包,自动运行测试脚本,邮件发送测试报告 24 | 25 | ### 主要特性: 26 | 1. 能够对HTTP和FTP服务器进行压力和性能测试, 也可以对任何数据库进行同样的测试(通过JDBC) 27 | 2. 完全的可移植性和100%纯java,高可扩展性 28 | 3. 完全 Swing 和轻量组件支持(预编译的JAR使用 javax.swing.*)包 29 | 4. 完全多线程 框架允许通过多个线程并发取样和 通过单独的线程组对不同的功能同时取样 30 | 5. 精心的GUI设计允许快速操作和更精确的计时 31 | 6. 缓存和离线分析/回放测试结果 32 | 7. 可链接的取样器允许无限制的测试能力,具有提供动态输入到测试的功能(包括Javascrīpt) 33 | 8. 各种负载统计表和可链接的计时器可供选择 34 | 9. 数据分析和可视化插件提供了很好的可扩展性以及个性化 35 | 10. 支持脚本变成的取样器(在1.9.2及以上版本支持BeanShell) 36 | 37 | ### 环境配置: 38 | 1. [JDK11](https://blog.lupf.cn/articles/2022/03/09/1646814446354.html) 39 | 2. [Jmeter](https://jmeter.apache.org/download_jmeter.cgi) 40 | 3. [Grafana](https://grafana.com/) 41 | 4. [InfluxDB2.x](https://docs.influxdata.com/influxdb/v2.0/install/) 42 | 5. [Prometheus](https://prometheus.io/download/) 43 | 6. [Node_Exporter](https://prometheus.io/download/#node_exporter) 44 | 7. [Jenkins](https://jenkins.io) 45 | 46 | ### 测试实例: 47 | - JMeter里面的元件很多,逻辑控制器,配置元件,定时器,Sampler,监听器等等,先给出一个实例,慢慢了解元件的使用方法。测试一个网站,我们至少需要:用户,发送请求,查看结果这三个过程 48 | 49 | ### 一、添加线程组 50 | - 在“测试计划”上右键,选择“添加”---“Thread Users”---“线程组”,如下图所示: 51 | ![](https://testerhome.com/uploads/photo/2018/139621bd-695a-4642-b253-4d6d2bd709cb.png!large) 52 | 53 | - 其中,对我们有影响的参数是线程数(设置发送请求的用户数目),Ramp-up period: 每个请求发生的总时间间隔,单位是秒,循环次数(请求发生的重复次数)。如果我们需要JMeter模拟五个请求者(也就是五个线程),每个请求者连续请求两次,则如下图设置: 54 | ![](https://testerhome.com/uploads/photo/2018/5b9902cd-1887-463c-9308-7f7005119640.png!large) 55 | 56 | ### 二、添加请求 57 | - 我们要访问一个网页,比如是百度首页,则是http请求,则添加http请求,在线程组上右键---“添加”---“Sampler”---“HTTP请求” 58 | ![](https://testerhome.com/uploads/photo/2018/b80fe452-ab06-491f-8a6a-05ad5313870f.png!large) 59 | 60 | - http请求的属性值中“Web服务器名称或IP”填写www.baidu.com就可以了:如下图所示: 61 | ![](https://testerhome.com/uploads/photo/2018/044f2c11-2e84-496e-8d5b-a7c477f928d9.png!large) 62 | 63 | ### 三、加监视器 64 | - 监视器的种类很多,根据自己的需要添加,我们选择“查看结果树”。在线程组上右键---“添加”---“监视器”---“查看结果树”,如下图所示: 65 | ![](https://testerhome.com/uploads/photo/2018/f3fdf349-5904-472e-877e-99f2125c64c4.png!large) 66 | 67 | ### 四、运行 68 | ![](https://testerhome.com/uploads/photo/2018/69c35bd4-34d7-4119-ab43-e88aef394c3c.png!large) 69 | ![](https://testerhome.com/uploads/photo/2018/bcaab82d-a6de-46a4-994a-2daf6f06e6e8.png!large) 70 | - 运行完毕后,即可查看结果 71 | 72 | ### 五、测试报告: 73 | - 测试报告分为四种,前三种是Jmeter自带的聚合报告,图形结果,表格结果,最后一种是Excel做的数据分析表 74 | 75 | #### [聚合报告](https://testerhome.com/uploads/photo/2018/2d3eef8f-f60c-4cd3-8f9d-3059ab66a29d.png!large) 76 | ![](https://testerhome.com/uploads/photo/2018/2d3eef8f-f60c-4cd3-8f9d-3059ab66a29d.png!large) 77 | 78 | #### [图形结果](https://testerhome.com/uploads/photo/2018/46b55170-bc6d-468d-b072-e808929f42a2.png!large) 79 | ![](https://testerhome.com/uploads/photo/2018/46b55170-bc6d-468d-b072-e808929f42a2.png!large) 80 | 81 | #### [表格结果](https://testerhome.com/uploads/photo/2018/c56237e0-b7a2-4470-9d86-97584d9549ab.png!large) 82 | ![](https://testerhome.com/uploads/photo/2018/c56237e0-b7a2-4470-9d86-97584d9549ab.png!large) 83 | 84 | #### [Excel报表](https://testerhome.com/uploads/photo/2018/2f9f5a75-95ec-43da-936f-db4d050f7f5e.png!large) 85 | ![](https://testerhome.com/uploads/photo/2018/2f9f5a75-95ec-43da-936f-db4d050f7f5e.png!large) 86 | ![](https://testerhome.com/uploads/photo/2018/5233bb37-1b8c-4c8b-81ba-19419f6d855a.png!large) 87 | - Excel做的数据分析表,更加美观,清晰明朗 88 | 89 | ### 六、监控平台: 90 | #### [Linux服务器监控](https://testerhome.com/uploads/photo/2022/19c0a176-4203-438c-8feb-4dcee497f1e7.png!large) 91 | ![](https://testerhome.com/uploads/photo/2022/19c0a176-4203-438c-8feb-4dcee497f1e7.png!large) 92 | 93 | #### [Jmeter性能监控](https://testerhome.com/uploads/photo/2022/6f3ab68e-9b3a-4e3c-823b-3c0ff077c077.png!large) 94 | ![](https://testerhome.com/uploads/photo/2022/6f3ab68e-9b3a-4e3c-823b-3c0ff077c077.png!large) 95 | 96 | 97 | ### 七、Jnekins持续集成: 98 | ![](https://testerhome.com/uploads/photo/2018/184cfd76-e1f2-4e5d-9832-ad3043a83c98.png!large) 99 | ![](https://testerhome.com/uploads/photo/2018/e415b91f-83ce-4dd0-8779-d05691713baf.png!large) 100 | - 搭建Jenkins环境,具体请参考: https://blog.csdn.net/wuxuehong0306/article/details/50016547 101 | - 配置Jenkins自动化持续集成项目,即可实现远程服务器自动(构建,编译,打包)运行脚本,发送邮件测试报告等 102 | 103 | ### 八、感谢: 104 | 非常感谢您花费时间阅读,祝您在这里记录、阅读、分享愉快! 105 | 欢迎留言评论,有问题也可以联系我或者加群交流.... 106 | 107 | 作者 :[@刘智King](http://shang.qq.com/email/stop/email_stop.html?qq=1306086303&sig=a1c657365db7e82805ea4b2351081fc3ebcde159f8ae49b1&tttt=1) 108 | QQ :1306086303 109 | Email:hagyao520@163.com -------------------------------------------------------------------------------- /Startup_Linux.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | #---FUNCTION----------------------------------------------------------------------------------------------------------- 4 | # NAME: 性能自动化 5 | # DESCRIPTION: 脚本入口函数 6 | #---------------------------------------------------------------------------------------------------------------------- 7 | 8 | function __echo_info() { 9 | echo "`date +'%F %T'` - [INFO] : $*" 10 | } 11 | 12 | run() { 13 | ls -l 14 | 15 | # Windows需要在系统变量中添加Jmeter根目录的位置,如下 16 | # JMETER_HOME="D:\Program\Jmeter\apache-jmeter-5.4.1" 17 | # %JMETER_HOME%\bin 18 | 19 | # Linux需要在系统变量中定义jmeter根目录的位置,如下 20 | export PATH=/home/Ankki.Jmeter.Test/Jmeter/apache-jmeter-5.4.1/bin:$PATH 21 | 22 | # 压测脚本模板中设定的压测时间应为60秒 23 | export jmx_template="Ankki.Api.Test" #压测jmx名称 24 | export suffix=".jmx" 25 | export jmx_template_filename="$jmx_template${suffix}" 26 | export os_type="Linux" 27 | 28 | __echo_info "---------> 自动化压测开始 <---------" 29 | rm -rf TestReport 30 | 31 | # 压测并发数列表 32 | thread_number_array=(10 20 40 60 80) 33 | # thread_number_array=(1000 2000 3000 4000 5000 6000 7000 8000 10000) 34 | # thread_number_array=(100000 200000 300000 400000 500000 600000 700000 800000 1000000) 35 | for num in "${thread_number_array[@]}" 36 | do 37 | __echo_info "当前并发数: ${num}" 38 | # 生成对应压测线程的jmx文件 39 | export jmx_filename="${jmx_template}_$num${suffix}" 40 | export jtl_filename="test_$num.jtl" 41 | 42 | cp ${jmx_template_filename} ${jmx_filename} 43 | __echo_info "生成jmx压测脚本 ${jmx_filename}" 44 | 45 | if [[ "${os_type}" == "Mac" ]]; then 46 | sed -i "" "s/thread_num/${num}/g" ${jmx_filename} 47 | else 48 | sed -i "s/thread_num/${num}/g" ${jmx_filename} 49 | fi 50 | 51 | if [[ "${num}" > 0 ]]; then 52 | mkdir -p TestReport/${jmx_template}/${num} 53 | # JMeter 静默压测 54 | __echo_info "jmeter -n -t ${jmx_filename} -l ${jtl_filename} -e -o TestReport/${jmx_template}/${num}" 55 | jmeter -n -t ${jmx_filename} -l ${jtl_filename} -e -o TestReport/${jmx_template}/${num} 56 | else 57 | jmeter -n -t ${jmx_filename} -l ${jtl_filename} -e -o TestReport/${jmx_template} 58 | fi 59 | 60 | rm -f ${jmx_filename} ${jtl_filename} 61 | done 62 | 63 | __echo_info "---------> 自动化压测全部结束 <---------" 64 | } 65 | 66 | run || exit 1 -------------------------------------------------------------------------------- /Startup_Win.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | #---FUNCTION----------------------------------------------------------------------------------------------------------- 4 | # NAME: 性能自动化 5 | # DESCRIPTION: 脚本入口函数 6 | #---------------------------------------------------------------------------------------------------------------------- 7 | 8 | function __echo_info() { 9 | echo "`date +'%F %T'` - [INFO] : $*" 10 | } 11 | 12 | run() { 13 | ls -l 14 | 15 | # Windows需要在系统变量中添加Jmeter根目录的位置,如下 16 | # JMETER_HOME="D:\Program\Jmeter\apache-jmeter-5.4.1" 17 | # %JMETER_HOME%\bin 18 | 19 | # Linux需要在系统变量中定义jmeter根目录的位置,如下 20 | # export PATH=/home/Ankki.Jmeter.Test/Jmeter/apache-jmeter-5.4.1/bin:$PATH 21 | 22 | # 压测脚本模板中设定的压测时间应为60秒 23 | export jmx_template="Ankki.Api.Test" #压测jmx名称 24 | export suffix=".jmx" 25 | export jmx_template_filename="$jmx_template${suffix}" 26 | export os_type="Win" 27 | 28 | __echo_info "---------> 自动化压测开始 <---------" 29 | rm -rf TestReport 30 | 31 | # 压测并发数列表 32 | thread_number_array=(10 20 40 60 80) 33 | # thread_number_array=(1000 2000 3000 4000 5000 6000 7000 8000 10000) 34 | # thread_number_array=(100000 200000 300000 400000 500000 600000 700000 800000 1000000) 35 | for num in "${thread_number_array[@]}" 36 | do 37 | __echo_info "当前并发数: ${num}" 38 | # 生成对应压测线程的jmx文件 39 | export jmx_filename="${jmx_template}_$num${suffix}" 40 | export jtl_filename="test_$num.jtl" 41 | 42 | cp ${jmx_template_filename} ${jmx_filename} 43 | __echo_info "生成jmx压测脚本 ${jmx_filename}" 44 | 45 | if [[ "${os_type}" == "Win" ]]; then 46 | sed -i "s/thread_num/${num}/g" ${jmx_filename} 47 | else 48 | sed -i "" "s/thread_num/${num}/g" ${jmx_filename} 49 | fi 50 | 51 | if [[ "${num}" > 0 ]]; then 52 | mkdir -p TestReport/${jmx_template}/${num} 53 | # JMeter 静默压测 54 | __echo_info "jmeter -n -t ${jmx_filename} -l ${jtl_filename} -e -o TestReport/${jmx_template}/${num}" 55 | jmeter -n -t ${jmx_filename} -l ${jtl_filename} -e -o TestReport/${jmx_template}/${num} 56 | else 57 | jmeter -n -t ${jmx_filename} -l ${jtl_filename} -e -o TestReport/${jmx_template} 58 | fi 59 | 60 | rm -f ${jmx_filename} ${jtl_filename} 61 | done 62 | 63 | __echo_info "---------> 自动化压测全部结束 <---------" 64 | } 65 | 66 | run || exit 1 -------------------------------------------------------------------------------- /使用说明.txt: -------------------------------------------------------------------------------- 1 | 软件包下载: 2 | 地址:http://172.19.5.222:8081/Ankki.Jmeter.Test/Ankki.Jmeter.Test.zip 3 | 4 | #----------------------------------------------- Windows系统使用说明 --------------------------------------------------------# 5 | 1.创建目录 D:\Program\Jmeter 6 | 1.1 解压Ankki.Jmeter.Test.zip到当前目录 7 | 1.2 进入Ankki.Jmeter.Test\JDK\Win目录 8 | 1.3 解压jdk-11.0.15.zip到C:\Program Files\Java目录 9 | 10 | 1.4 进入Ankki.Jmeter.Test\Jmeter目录 11 | 1.5 解压apache-jmeter-5.4.1.zip到当前目录 12 | 13 | 2.打开系统环境变量配置,添加Java系统变量 14 | 变量名:JAVA_HOME 15 | 变量值:C:\Program Files\Java\jdk-11.0.15 16 | 变量名:CLASSPATH 17 | 变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%Ant_HOME%\lib 18 | 变量名:JAVA_TOOL_OPTIONS 19 | 变量值:-Dfile.encoding=UTF-8 20 | 变量名:path 21 | 追加变量值:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 22 | 23 | 3.打开系统环境变量配置,添加Jmeter系统变量 24 | 变量名:JMETER_HOME 25 | 变量值:D:\Program\Jmeter\apache-jmeter-5.4.1 26 | 变量名:path 27 | 追加变量值:%JMETER_HOME%\bin 28 | 29 | 4.查看Java版本号 30 | java -version 31 | 32 | 5.查看Jmeter版本号 33 | jmeter -v 34 | 35 | 6.打开Grafana平台 36 | 地址:http://172.19.5.240:3000 37 | 账号: ankki 38 | 密码: ankki111111 39 | 40 | Linux性能监控: 41 | http://172.19.5.240:3000/d/xfpJB9FGz/1-node-exporter-for-prometheus-dashboard-en-20201010?orgId=1&refresh=5s 42 | 43 | Linux性能监控: 44 | http://172.19.5.240:3000/d/frankletzz/jmeter-report-influxdb2-0?orgId=1 45 | 46 | 7.修改脚本,设置并发量 47 | 编辑: Startup_Win.sh 48 | 搜索: thread_number_array 49 | 添加: (10 20 40 60 80),多并发用空格隔开 50 | 51 | 8.运行脚本,查看监控数据 52 | cmd Startup_Win.sh 53 | 54 | #----------------------------------------------- Linux系统使用说明 --------------------------------------------------------# 55 | 1.上传Ankki.Jmeter.Test.zip压缩包到 home 目录 56 | 1.1 cd /home 57 | 1.2 unzip -o Ankki.Jmeter.Test.zip -d Ankki.Jmeter.Test 58 | 59 | 1.3 cd /home/Ankki.Jmeter.Test/JDK/Linux 60 | 1.4 tar -zxvf jdk-11.0.15_linux-x64_bin.tar.gz 61 | 62 | 1.5 cd /home/Ankki.Jmeter.Test/Jmeter 63 | 1.6 unzip -o apache-jmeter-5.4.1.zip -d apache-jmeter-5.4.1 64 | 65 | 1.7 cd /home/Ankki.Jmeter.Test 66 | 1.7 chmod -R 777 /home/Ankki.Jmeter.Test 67 | 68 | 2.配置java环境变量,运行以下命令 69 | vi /etc/profile 70 | 71 | 3.复制以下命令,粘贴到/etc/profile,其中路径根据自己电脑路径修改 72 | export JAVA_HOME=/home/Ankki.Jmeter.Test/JDK/Linux/jdk-11.0.15 73 | export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib 74 | export PATH=$JAVA_HOME/bin:$PATH 75 | 76 | export JMETER_HOME=/home/Ankki.Jmeter.Test/Jmeter/apache-jmeter-5.4.1 77 | export PATH=$JMETER_HOME/bin:$PATH 78 | export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJmeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$CLASSPATH 79 | 80 | 4.重置配置文件 81 | source /etc/profile 82 | 83 | 5.查看Java版本号 84 | java -version 85 | 86 | 6.查看Jmeter版本号 87 | jmeter -v 88 | 89 | 7.打开Grafana平台 90 | 地址:http://172.19.5.240:3000 91 | 账号: ankki 92 | 密码: ankki111111 93 | 94 | Linux性能监控: 95 | http://172.19.5.240:3000/d/xfpJB9FGz/1-node-exporter-for-prometheus-dashboard-en-20201010?orgId=1&refresh=5s 96 | 97 | Linux性能监控: 98 | http://172.19.5.240:3000/d/frankletzz/jmeter-report-influxdb2-0?orgId=1&from=now-5m&to=now&refresh=5s 99 | 100 | 8.修改脚本,设置并发量 101 | vi Startup_Win.sh 102 | 搜索: thread_number_array 103 | 添加: (10 20 40 60 80),多并发用空格隔开 104 | 105 | 9.运行脚本,查看监控数据 106 | ./Startup_Linux.sh -------------------------------------------------------------------------------- /测试报告/测试报告.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hagyao520/JMeter/c142b90381ac4a35a4ddb463c49ae18e5dc44450/测试报告/测试报告.xlsx --------------------------------------------------------------------------------