目录[-]

目录:

  1. Jmeter常用技巧
  2. 环境配置(Java、Jmeter、ant)
  3. 环境配置(Jenkins)

 

 

———————————————————————————————————————————

1、Jmeter常用技巧

取一个简单的案例,其中包括:HTTP信息头管理器、HTTP请求默认值、用户定义的变量、beanshell 预处理程序、beanshell 取样器、常数吞吐量定时器,下面依次解释各组件的作用

在真正介绍之前,需要解释“作用域”,这个可以说是Jmeter很重要的一个属性,可简单理解为全局变量、局部变量

  • 当部分组件如“HTTP请求头管理器”,放置在“测试计划”里,那它就是全局变量
  • 如果放在“线程组”里,就是局部变量
  • 如果同时存在全局变量和局部变量,以“局部变量”为准,但是如果全局变量包含局部变量没有的属性,也会同时生效
  1. HTTP信息头管理器:
    1. 也就是HTTP请求头,以字典格式存在
  2. HTTP请求默认值:
    1. 填写一次后,不用每一次都在“取样器—HTTP请求”中添加属性,节省劳动力
  3. 用户定义的变量 
  4. beanshell 预处理程序、beanshell 取样器、beanShell 后置处理程序,这三个放在一起说明
    1. beanshell 预处理程序,第一句:读取XfacSn的值;第二句:写入变量名 XfacSn ,问题来了,第一句读取的值是从哪里来的?
      String XfacSn = props.get("XfacSn");    
      
      vars.put("XfacSn",XfacSn);
    2. 先说结论,数据来源于:后置处理器,包括 JSON提取器、政策表达式提取器、beanshell 后置处理器等等,它们需要把变量,写入到局部变量里,而props.get()就是读取局部变量
    3. 那么后置处理器,是如何把一个变量,变成局部变量?第一句,获取JSON PATH获取到的值,bsh.args[0]就是获取第一个匹配到的值,而第二句这一长段语句,就是将“局部变量”转换为“全局变量“,之前我们说过,每个线程组里都是局部变量,现在这一句转换全局变量,就可以提供给其他线程组使用,比如:登录模块,单独有一个线程组,写完将cookies或者token写入到全局变量,以供其他线程组调用
    4. beanshell 取样器:
    5. 它既然是一个取样器,就遵守执行顺序,从上到下,顺序执行,支持beanshell语法(参考java语法),比如下图,设计了好几个日期,因为在做订单时,需要用到日期,在这里统一维护
    6. 定时器:
      1. 定时器比较简单,常用的就2个,固定定时器/随机定时器、Synchronizing Timer,第二个定时器专门用于性能测试,可理解为类似loadrunner的集合点,集中并发
    7. 监听器
      1. 常用“查看结果树”、“断言结果”,性能测试常用“聚合报告”、“jp@gc一系列“组件
    8. 整体逻辑,要执行一整套操作,一定有先后顺序,比如第二个接口,需要第一个接口的返回值作为入参,第一个接口,将XfacName、XfacSn,从相应结果取出并赋值一个变量名
    9. 在后续的接口,就可以直接调用变量名
    10. 还有一些其他可用的操作,比如IF判断语句,如下图

——————————————————————————————————————

2、环境配置

  1. 下载并配置 Java 环境,下载jdk:

    https://www.oracle.com/java/technologies/javase-downloads.html

  2. 配置 java 环境
    1. 系统变量—新建 JAVA_HOME,值:jdk安装完全路径
    2. 系统变量—path,添加:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
    3. 系统变量—新建CLASSPATH,值:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
    4. cmd环境下, 输入 java-version,如果可以返回java版本号,证明java环境安装正确
  3. 下载并安装Jmeter
    1. 下载地址,本案例使用的是3.0版本,现在最新已经出到5.0了,高版本兼容低版本:https://jmeter.apache.org/download_jmeter.cgi
    2. 系统变量—新建JMETER_HOME,值:Jmeter安装路径
    3. 系统变量—CLASSPATH,添加:

      %JMETER_HOME\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib\logkit-2.0.jar

    4. 打开文件夹  F:\apache-jmeter-3.0\bin(比如安装路径在这里),点击 jmeter.bat,如果运行成功,证明java环境配置没有问题,可以正常使用
    5. 打开文件 F:\apache-jmeter-3.0\bin\jmeter.properties ,修改以下文件
      sampleresult.default.encoding=UTF-8    #修改编码方式,避免中文乱码
      jmeter.save.saveservice.output_format=xml    #修改导出报告格式为xml
      language=zh_CN    #修改jmeter界面样式,改成默认中文显示,每一个修改后,都要去掉前面的#注释符号
    6. F:\apache-jmeter-3.0\extras\ant-jmeter-1.1.1.jar   这个而文件放到antlib目录下
  4. 配置 ant
    1. 下载地址:http://ant.apache.org/
    2. 系统变量—新建ANT_HOME,值:安装路径如 E:\apache-ant-1.10.5-bin
    3. 系统变量—path,添加:%ANT_HOME%\bin
    4. 系统变量—classpath,添加:%ANT_HOME%\lib
    5. 下载3个包:ant-jmeter-1.1.1.jar、activation.jar、mail.jar,放在lib目录下
    6. cmd运行,输入 ant -version ,配置成功后如下图
  5. 创建 build.xml,它的作用是配置需要报告生成的数据内容、报告名称等内容,这个文件可以在网上下载。将build.xml放在需要测试的jmeter脚本同目录,如图
  6. 现在的路径是:F:\apache-jmeter-4.0\demo ,新建一个report文件夹,在report文件夹里,新建2个文件夹:jtl和html,这两个文件夹的作用是:
    • jtl:ant命令生成的jtl格式的测试报告
    • html:ant命令生成的html格式的测试报告
  7. F:\apache-jmeter-3.0\extras\ 目录下的 jmeter.results.shanhe.me.xsl 是Jmeter'默认的html报告格式,可以下载一个更美观功能更前大的替代

  8. cmd运行,cd进入到 F:\apache-jmeter-3.0\demo 输入 ant ,如果提示BUILD SUCCESSFUL,证明ant和Jmeter环境搭建成功,测试报告就生成在report文件夹里

  9.  

    查看生成的html报告怎么显示:

—————————————————————————————————————

3、环境配置(Jenkins)

  1. 下载 Jenkins 并搭建本地环境:http://mirrors.jenkins-ci.org/
  2. 安装后,网页中打开的连接是:http://www.localhost:8080

如果 Jenkins 无法自启动,使用下面方法:

  1. 进入 Jenkins 安装目录,找到 Jenkins.war 文件,在该目录下,cmd环境 java -jar jenkins war 命令启动,如果不在该目录下,会提示 Error:Unable to access jarfile jenkins war
  2. 如果端口冲突,进入目录:C:\Program Files (x86)\Jenkins\jenkins.xml 修改端口
  3. 使用 netstat -ano|findstr "8080" 查看端口占用情况
  4. 如果被占用,可以用 taskkill -PID <进程号> -F
  5. 重启,直接在浏览器输入:http://localhost:8080/restart
  6. 关闭,直接在浏览器输入:http://localhost:8080/exit

现在已经进入 Jenkins 页面了,Java和Jenkins安装可以看之前的教程。下面描述ant、jmeter的相关内容:

  1. Jenkins 安装 ant plugin HTML Publisher plugin 两个插件
  2. 如果下载速度很慢,进入 Jenkins—Plugin Manager,切换到 Advance(高级)修改最下方的I站点URL:

    http://updates.jenkins.io/update-center.json  如下图所示

  3. 如果效果不明显,进入网站手动下载安装插件:http://updates.jenkins-ci.org/download/plugins/
  4. 全局工具配置,添加 JDK Ant 的安装路径
  5. 配置系统,配置 ANT 的几个环境变量
  6. 新建一个“自由风格(Free Style)”的任务
  7. 进入工程后,点击“配置”,构建环境,如下图,最关键的“Targets”,它是与本地ANT执行的模板文件的模块名对应,如果写的不对,那还是读不到本地对应文件
  8. 命令,Execute Windows batch command  它的作用是,执行windows命令,执行py文件,上面的步骤是通过Ant启动Jmeter,在生成Jmeter测试报告之后,就到了py发挥作用了
  9. 构建后操作,添加发送邮件的路径,但是如果py文件写了邮件逻辑,就可以不用配置
  10. 定是构建,构建触发器,可以规定什么时候让测试任务运行,这里的定时构建,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. 下图这个构建触发器,就是每天商务11点运行一次
  12. 其他注意事项:
    • 关闭360安全卫士,它有可能杀掉 Jenkins 进程
  13. 选中项目,点击“立即构建”
  14. 构建完成后,会有2个提示灯,蓝色代表success,红色代表fail,点击可查看报错详情信息,有可能是脚本报错导致的失败
  15. 控制台输出如下
  16. 生成的Jmeter测试报告样式如下
  17. 邮件发送成功后,如下图
  18. 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()
  19. 需要搞清楚一点的是,这封邮件是从哪里发送到哪里,我现在这个示例,是从腾讯邮件,发送到企业专用邮件isesol.com,password这个字段的值,不是腾讯邮箱登录密码,而是授权码(也可以叫安全密码),并且发送邮件的客户端需要开启POP3/STMP服务,这些都是在邮箱里开启服务。

 

 

 

END