目录[-]
目录:
- Jmeter常用技巧
- 环境配置(Java、Jmeter、ant)
- 环境配置(Jenkins)
———————————————————————————————————————————
1、Jmeter常用技巧
取一个简单的案例,其中包括:HTTP信息头管理器、HTTP请求默认值、用户定义的变量、beanshell 预处理程序、beanshell 取样器、常数吞吐量定时器,下面依次解释各组件的作用
在真正介绍之前,需要解释“作用域”,这个可以说是Jmeter很重要的一个属性,可简单理解为全局变量、局部变量
- 当部分组件如“HTTP请求头管理器”,放置在“测试计划”里,那它就是全局变量
- 如果放在“线程组”里,就是局部变量
- 如果同时存在全局变量和局部变量,以“局部变量”为准,但是如果全局变量包含局部变量没有的属性,也会同时生效
- HTTP信息头管理器:
- 也就是HTTP请求头,以字典格式存在
- 也就是HTTP请求头,以字典格式存在
- HTTP请求默认值:
- 填写一次后,不用每一次都在“取样器—HTTP请求”中添加属性,节省劳动力
- 填写一次后,不用每一次都在“取样器—HTTP请求”中添加属性,节省劳动力
- 用户定义的变量
- beanshell 预处理程序、beanshell 取样器、beanShell 后置处理程序,这三个放在一起说明
- beanshell 预处理程序,第一句:读取XfacSn的值;第二句:写入变量名 XfacSn ,问题来了,第一句读取的值是从哪里来的?
String XfacSn = props.get("XfacSn"); vars.put("XfacSn",XfacSn); - 先说结论,数据来源于:后置处理器,包括 JSON提取器、政策表达式提取器、beanshell 后置处理器等等,它们需要把变量,写入到局部变量里,而props.get()就是读取局部变量
- 那么后置处理器,是如何把一个变量,变成局部变量?第一句,获取JSON PATH获取到的值,bsh.args[0]就是获取第一个匹配到的值,而第二句这一长段语句,就是将“局部变量”转换为“全局变量“,之前我们说过,每个线程组里都是局部变量,现在这一句转换全局变量,就可以提供给其他线程组使用,比如:登录模块,单独有一个线程组,写完将cookies或者token写入到全局变量,以供其他线程组调用
- beanshell 取样器:
- 它既然是一个取样器,就遵守执行顺序,从上到下,顺序执行,支持beanshell语法(参考java语法),比如下图,设计了好几个日期,因为在做订单时,需要用到日期,在这里统一维护
- 定时器:
- 定时器比较简单,常用的就2个,固定定时器/随机定时器、Synchronizing Timer,第二个定时器专门用于性能测试,可理解为类似loadrunner的集合点,集中并发
- 定时器比较简单,常用的就2个,固定定时器/随机定时器、Synchronizing Timer,第二个定时器专门用于性能测试,可理解为类似loadrunner的集合点,集中并发
- 监听器
- 常用“查看结果树”、“断言结果”,性能测试常用“聚合报告”、“jp@gc一系列“组件
- 常用“查看结果树”、“断言结果”,性能测试常用“聚合报告”、“jp@gc一系列“组件
- 整体逻辑,要执行一整套操作,一定有先后顺序,比如第二个接口,需要第一个接口的返回值作为入参,第一个接口,将XfacName、XfacSn,从相应结果取出并赋值一个变量名
- 在后续的接口,就可以直接调用变量名
- 还有一些其他可用的操作,比如IF判断语句,如下图
- beanshell 预处理程序,第一句:读取XfacSn的值;第二句:写入变量名 XfacSn ,问题来了,第一句读取的值是从哪里来的?
——————————————————————————————————————
2、环境配置
- 下载并配置 Java 环境,下载jdk:
https://www.oracle.com/java/technologies/javase-downloads.html
- 配置 java 环境
- 系统变量—新建 JAVA_HOME,值:jdk安装完全路径
- 系统变量—path,添加:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
- 系统变量—新建CLASSPATH,值:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
- cmd环境下, 输入 java-version,如果可以返回java版本号,证明java环境安装正确
- 下载并安装Jmeter
- 下载地址,本案例使用的是3.0版本,现在最新已经出到5.0了,高版本兼容低版本:https://jmeter.apache.org/download_jmeter.cgi
- 系统变量—新建JMETER_HOME,值:Jmeter安装路径
- 系统变量—CLASSPATH,添加:
%JMETER_HOME\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib\logkit-2.0.jar
- 打开文件夹 F:\apache-jmeter-3.0\bin(比如安装路径在这里),点击 jmeter.bat,如果运行成功,证明java环境配置没有问题,可以正常使用
- 打开文件 F:\apache-jmeter-3.0\bin\jmeter.properties ,修改以下文件
sampleresult.default.encoding=UTF-8 #修改编码方式,避免中文乱码 jmeter.save.saveservice.output_format=xml #修改导出报告格式为xml language=zh_CN #修改jmeter界面样式,改成默认中文显示,每一个修改后,都要去掉前面的#注释符号 - 将F:\apache-jmeter-3.0\extras\ant-jmeter-1.1.1.jar 这个而文件放到ant的lib目录下
- 配置 ant
- 下载地址:http://ant.apache.org/
- 系统变量—新建ANT_HOME,值:安装路径如 E:\apache-ant-1.10.5-bin
- 系统变量—path,添加:%ANT_HOME%\bin
- 系统变量—classpath,添加:%ANT_HOME%\lib
- 下载3个包:ant-jmeter-1.1.1.jar、activation.jar、mail.jar,放在lib目录下
- cmd运行,输入 ant -version ,配置成功后如下图
- 创建 build.xml,它的作用是配置需要报告生成的数据内容、报告名称等内容,这个文件可以在网上下载。将build.xml放在需要测试的jmeter脚本同目录,如图
- 现在的路径是:F:\apache-jmeter-4.0\demo ,新建一个report文件夹,在report文件夹里,新建2个文件夹:jtl和html,这两个文件夹的作用是:
- jtl:ant命令生成的jtl格式的测试报告
- html:ant命令生成的html格式的测试报告
-
F:\apache-jmeter-3.0\extras\ 目录下的 jmeter.results.shanhe.me.xsl 是Jmeter'默认的html报告格式,可以下载一个更美观功能更前大的替代
-
cmd运行,cd进入到 F:\apache-jmeter-3.0\demo 输入 ant ,如果提示BUILD SUCCESSFUL,证明ant和Jmeter环境搭建成功,测试报告就生成在report文件夹里
-
查看生成的html报告怎么显示:
—————————————————————————————————————
3、环境配置(Jenkins)
- 下载 Jenkins 并搭建本地环境:http://mirrors.jenkins-ci.org/
- 安装后,网页中打开的连接是:http://www.localhost:8080
如果 Jenkins 无法自启动,使用下面方法:
- 进入 Jenkins 安装目录,找到 Jenkins.war 文件,在该目录下,cmd环境 java -jar jenkins war 命令启动,如果不在该目录下,会提示 Error:Unable to access jarfile jenkins war
- 如果端口冲突,进入目录:C:\Program Files (x86)\Jenkins\jenkins.xml 修改端口
- 使用 netstat -ano|findstr "8080" 查看端口占用情况
- 如果被占用,可以用 taskkill -PID <进程号> -F
- 重启,直接在浏览器输入:http://localhost:8080/restart
- 关闭,直接在浏览器输入:http://localhost:8080/exit
现在已经进入 Jenkins 页面了,Java和Jenkins安装可以看之前的教程。下面描述ant、jmeter的相关内容:
- Jenkins 安装 ant plugin 和 HTML Publisher plugin 两个插件
- 如果下载速度很慢,进入 Jenkins—Plugin Manager,切换到 Advance(高级)修改最下方的I站点URL:
- 如果效果不明显,进入网站手动下载安装插件:http://updates.jenkins-ci.org/download/plugins/
- 全局工具配置,添加 JDK 和 Ant 的安装路径
- 配置系统,配置 ANT 的几个环境变量
- 新建一个“自由风格(Free Style)”的任务
- 进入工程后,点击“配置”,构建环境,如下图,最关键的“Targets”,它是与本地ANT执行的模板文件的模块名对应,如果写的不对,那还是读不到本地对应文件
- 命令,Execute Windows batch command 它的作用是,执行windows命令,执行py文件,上面的步骤是通过Ant启动Jmeter,在生成Jmeter测试报告之后,就到了py发挥作用了
- 构建后操作,添加发送邮件的路径,但是如果py文件写了邮件逻辑,就可以不用配置
- 定是构建,构建触发器,可以规定什么时候让测试任务运行,这里的定时构建,0 11 * * * 代表的是每天11点自动跑一次
第一个参数,代表分钟,取值0~59
第二个参数,代表小时,取值0~23
第三个参数,代表天,取值1-31
第四个参数,代表月,取值1-12
第五个参数,代表周,取值0~7,0和7都是星期天
如果1天想构建两次,H 11,14 * * * 代表早上11点跑一次,下午14点跑一次,这种写法比较好
H 8 * * 1-5 这样就是每周1-5,早上8点运行一次 - 下图这个构建触发器,就是每天商务11点运行一次
- 其他注意事项:
- 关闭360安全卫士,它有可能杀掉 Jenkins 进程
- 选中项目,点击“立即构建”
- 构建完成后,会有2个提示灯,蓝色代表success,红色代表fail,点击可查看报错详情信息,有可能是脚本报错导致的失败
- 控制台输出如下
- 生成的Jmeter测试报告样式如下
- 邮件发送成功后,如下图
- py文件代码如下
# 优化代码 # -*- coding: utf-8 -*- import os import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.application import MIMEApplication from typing import List def get_latest_file(directory: str) -> str: """获取指定目录中最新的文件""" if not os.path.exists(directory): raise FileNotFoundError(f"目录不存在: {directory}") files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))] if not files: raise FileNotFoundError(f"目录中没有文件: {directory}") # 使用os.path.getmtime获取文件修改时间进行排序 files.sort(key=lambda f: os.path.getmtime(os.path.join(directory, f)), reverse=True) latest_file = files[0] print(f'最新生成的报告文件名是: {latest_file}') full_path = os.path.join(directory, latest_file) print(f'完整路径是: {full_path}') return full_path, latest_file def count_test_results(file_path: str) -> tuple: """统计测试结果中的成功和失败数量""" success_count = 0 fail_count = 0 try: with open(file_path, 'r', encoding='utf-8') as html_file: for line in html_file: success_count += line.count('<div class="success">') fail_count += line.count('<div class="failure">') except IOError as e: raise Exception(f"读取文件失败: {e}") return success_count, fail_count def send_email(file_path: str, filename: str, success_count: int, fail_count: int) -> None: """发送测试结果邮件""" # 邮件配置 username = 'liangjun@isesol.com' password = 'Fv3nS7m965' smtp_server = 'smtp.exmail.qq.com' # 收件人列表 recipients = ['liangjun@isesol.com'] # 可添加更多收件人 # 准备邮件内容 total_count = success_count + fail_count msg_result = '测试通过' if fail_count == 0 else '测试失败' email_content = f""" {msg_result} 脚本总数: {total_count}个 成功: {success_count}个 失败: {fail_count}个 """ # 创建邮件 msg = MIMEMultipart() msg['Subject'] = f'Isesol_BIZ autotest result, 成功:{success_count}个, 失败:{fail_count}个' msg['From'] = username msg['To'] = ', '.join(recipients) # 添加文本内容 text_part = MIMEText(email_content, 'plain', 'utf-8') msg.attach(text_part) # 添加附件 try: with open(file_path, 'rb') as f: attachment = MIMEApplication(f.read()) attachment.add_header('Content-Disposition', 'attachment', filename=filename) msg.attach(attachment) except IOError as e: print(f"警告: 无法添加附件: {e}") # 发送邮件 try: with smtplib.SMTP(smtp_server) as client: client.login(username, password) client.sendmail(msg['From'], recipients, msg.as_string()) print(f'邮件发送成功!请去邮箱: {", ".join(recipients)} 查看') except smtplib.SMTPRecipientsRefused: print('收件人被拒绝') except smtplib.SMTPAuthenticationError: print('认证错误:请检查用户名和授权码') except smtplib.SMTPSenderRefused: print('发件人被拒绝') except smtplib.SMTPException as e: print(f'邮件发送失败: {e}') except Exception as e: print(f'发生未知错误: {e}') def main(): """主函数""" try: # 第一步:找到最新的报告文件 result_dir = r'F:\apache-jmeter-3.0\demo\report\html' file_path, filename = get_latest_file(result_dir) # 第二步:统计测试结果 success_count, fail_count = count_test_results(file_path) # 第三步:发送邮件 send_email(file_path, filename, success_count, fail_count) except Exception as e: print(f"程序执行出错: {e}") # 这里可以添加错误处理逻辑,如发送错误通知等 if __name__ == "__main__": main() - 需要搞清楚一点的是,这封邮件是从哪里发送到哪里,我现在这个示例,是从腾讯邮件,发送到企业专用邮件isesol.com,password这个字段的值,不是腾讯邮箱登录密码,而是授权码(也可以叫安全密码),并且发送邮件的客户端需要开启POP3/STMP服务,这些都是在邮箱里开启服务。
END