Ant+JMeter+WebDriverAgent 游记

本文介绍了一种结合使用Ant、JMeter和WebDriverAgent进行移动应用自动化测试的方法。作者分享了如何安装配置这些工具,创建JMeter脚本以支持WebDriverAgent的查询,并利用Ant脚本执行测试及生成报告。

转载地址:https://testerhome.com/topics/5331


0. 前言

上周末看到了一篇 WebDriverAgent 踩坑记 , 把我导向了一个月前的 WebDriverAgent 简介 ,才看到我在那的评论被回复了。说起来我的提醒被匿名用户刷屏没看到,现在看到了就打算填个坑,小试一下。 而最近 Ant + JMeter + * 的模式有点火,于是我也来凑个热闹,多加一个 Ant。本文从社区里的其他文章里面吸收了不少经验,列在文中,感谢社区。

1. 安装

Ant, JMeter 都不需要安装,解压即用,非常方便。好消息是JMeter3发布,最实用的莫过于 jsonpath 了,提取json的response就方便多了。
WebDriverAgent的安装也是比较简单的,安装官网https://github.com/facebook/WebDriverAgent README 即可,或者参看https://testerhome.com/topics/4904 。记录一下我遇到的几个小问题:
* 直接 brew install carthage 的时候提示我需要 XCode7.3 ,搜索下载 carthage.pkg 安装成功解决了。
* 下载完WebDriverAgent项目后,执行xcodebuild命令提示找不到模拟器,手动启动了模拟器仍然不行,最后只好在XCode里面打开项目选择执行,就成功了。成功一次之后,以后就都可以用命令启动了,我写成了start.sh,方便使用。
* 编译的过程中提示未知的编译选项 -Wno-double-promotion,打开WebDriverAgent/XCTWebDriverAgentLib/Commands/FBCustomCommands.m文件,去掉了最后的-Wno-double-promotion选项,就这样解决了。

2. JMeter脚本

我把 https://github.com/facebook/WebDriverAgent/wiki/Queries 里面提到的内容都转化成了取样器,放在“工作台”中了,需要的用什么方法只要复制一个出来改改就能用。xml文件太长就不放代码了直接在尾部下载去吧。

被测端选用了Appium提供的TestApp,简单地跑了几个加法和一个Alert,也算走了一遍流程。有几点说明的:
* 将HOST、PORT、bundleId等全局的配置放到了顶部方便修改和调整
* WebDriverAgent需要的Header Content-Type: application/json直接放在的一个全局的请求头管理器里面了,后面不用再理会
* HTTP请求大部分是一样的,除了数据和URI以及部分超时设置,所以也做成全局的HTTP请求默认值了
* 断言成功用正则判断响应里面status=0,有个坑就是如果查找元素失败,返回空数组但状态还是0,需要注意
* 如果已经安装TestApp,用bundleId启动就好,否则直接用*.app来制定,切换取样器即可
* 在setUp线程启动App获得session后,为了跨线程传递session,用BeanShell将它放进了properties里了,可以在tearDown线程进行关闭
* 启动App的过程有点长,需要将HTTP请求的read时间设置长一点避免超时
* 本来应该使用csv来管理测试数据的,但为了少带文件并且涉及路径,这里用forEach代替了。应该用csv+循环控制器才是好的实现

3. Ant脚本和结果style文件

从下列文章里直接借鉴(抄袭)来的:
Jenkins+Jmeter+Ant 接口持续集成 https://testerhome.com/topics/5186
jmeter 报告扩展样式优化 (接口版+性能版) https://testerhome.com/topics/5252
对 Jenkins+ANT+Jmeter 接口测试的实践 https://testerhome.com/topics/5262
修改点:
* 增加了clean过程,否则多次执行会将新结果append到旧结果中,造成混乱
* 保持JMeter本身环境的纯净,不修改JMeter目录下的任何配置,而是将执行过程中的properties直接写到了build.xml中

<?xml version="1.0" encoding="UTF-8"?>

<project name="ant-jmeter-test" default="all" basedir=".">
    <!-- 需要改成自己本地的 Jmeter 目录-->  
    <property name="jmeter.home" value="D:/Program Files/apache-jmeter-3.0" />
    <!-- 声明要运行的脚本。"*.jmx"指包含此目录下的所有jmeter脚本-->
    <property name="jmeter.testplans.dir" value="E:/ant_jmeter_wda/testplans" />
    <!-- jmeter生成jtl格式的结果报告的路径--> 
    <property name="jmeter.result.jtl.dir" value="E:/ant_jmeter_wda/results" />
    <!-- jmeter生成html格式的结果报告的路径-->
    <property name="jmeter.result.html.dir" value="E:/ant_jmeter_wda/results" />
    <!-- jmeter生成html格式的结果报告的模板--> 
    <property name="jmeter.result.style.dir" value="E:/ant_jmeter_wda/style" />
    <!-- 生成的报告的前缀-->  
    <property name="ReportName" value="TestReport" />
    <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/report.jtl" />
    <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/report-details.html" />        
    <property name="lib.dir" value="${jmeter.home}/lib"/>

    <path id="xslt.classpath">
        <fileset dir="${lib.dir}" includes="xalan-*.jar"/>
        <fileset dir="${lib.dir}" includes="serializer-*.jar"/>
    </path>

    <target name="all">
        <antcall target="clean" />
        <antcall target="run" />
        <antcall target="report" />
        <antcall target="xslt-report" />
    </target>

    <target name="clean">
        <delete file="${jmeter.result.jtlName}"/>
    </target>

    <target name="run">
        <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />
        <jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}">
            <testplans dir="${jmeter.testplans.dir}" includes="*.jmx" />

            <property name="jmeter.save.saveservice.output_format" value="xml"/>
            <property name="jmeter.save.saveservice.response_data" value="true"/>
            <property name="jmeter.save.saveservice.samplerData" value="true"/>
            <property name="jmeter.save.saveservice.responseHeaders" value="true"/>
            <property name="jmeter.save.saveservice.requestHeaders" value="true"/>
            <property name="jmeter.save.saveservice.encoding" value="true"/>
            <property name="jmeter.save.saveservice.url" value="true"/>
            <property name="jmeter.save.saveservice.filename" value="true"/>
            <property name="jmeter.save.saveservice.hostname" value="true"/>
            <property name="jmeter.save.saveservice.thread_counts" value="true"/>
            <property name="jmeter.save.saveservice.sample_count" value="true"/>
            <property name="jmeter.save.saveservice.idle_time" value="true"/>
            <property name="jmeter.save.saveservice.assertion_results" value="all"/>
            <property name="jmeter.save.saveservice.bytes" value="true"/>
            <property name="file_format.testlog" value="${format}"/>
            <property name="jmeter.save.saveservice.response_data.on_error" value="${funcMode}"/>

        </jmeter>
    </target>

    <target name="xslt-report">
        <tstamp><format property="report.datestamp" pattern="yyyy/MM/dd HH:mm"/></tstamp>
        <xslt
            classpathref="xslt.classpath"
            force="true"
            in="${jmeter.result.jtlName}"
            out="${jmeter.result.html.dir}/report-summary.html"
            style="${jmeter.result.style.dir}/jmeter-results-detail-report_21.xsl">
            <param name="dateReport" expression="${report.datestamp}"/>
        </xslt>
    </target>

    <target name="report">
        <xslt classpathref="xslt.classpath"
            force="true"
            in="${jmeter.result.jtlName}"
            out="${jmeter.result.htmlName}"
            style="${jmeter.result.style.dir}/jmeter-results-shanhe-me.xsl">
            <!-- 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 --> 
            <param name="showData" expression="${show-data}"/>
        </xslt>
        <copy todir="${jmeter.result.html.dir}">
            <fileset dir="${jmeter.home}/extras">
                <include name="collapse.png" />
                <include name="expand.png" />
            </fileset>
        </copy>
    </target>
</project>

4. 执行结果展示

Ant执行界面

手机端动作

结果摘要(右上角可跳转到详情)

结果详情

5. 下载

文件很小,整个jpg也才41K所以就直接这样上传了。
里面有一个python文件可以用来解析base64的截屏。
testplans里面有一个TestPlan.jmx1,用的是东哥的服务,重命名去掉最后的1也可以执行,拿去玩吧。


在自动化部署和测试领域,使用 **Jenkins**、**Ant** 和 **JMeter** 三者结合是一种非常常见的方案,能够实现接口测试、性能测试以及持续集成的完整流程。JMeter 负责测试脚本的执行,Ant 用于构建和生成测试报告,而 Jenkins 负责调度和持续集成流程。 ### Jenkins 与 JMeter 的集成 Jenkins 作为持续集成工具,可以通过调用 JMeter 的命令行模式执行测试脚本。JMeter 支持非 GUI 模式运行,这种方式在自动化测试中非常高效,避免了图形界面带来的性能消耗。测试脚本的执行命令如下: ```bash jmeter -n -t <test_script_path> -l <result_log_file> -e -o <report_output_directory> ``` 其中: - `-n` 表示以非 GUI 模式运行 JMeter; - `-t` 指定测试脚本路径; - `-l` 生成测试结果日志文件(.jtl 文件); - `-e` 和 `-o` 用于在测试完成后生成 HTML 报告并输出到指定目录 [^3]。 ### AntJMeter 的集成 Ant 是一个基于 Java 的构建工具,可以用于自动化执行 JMeter 测试任务并生成测试报告。通过编写 `build.xml` 文件,可以定义一系列任务来启动 JMeter 测试、收集测试结果并生成报告。以下是一个典型的 Ant 任务定义示例: ```xml <target name="run-tests"> <exec executable="jmeter" dir="${jmeter.dir}" osfamily="unix"> <arg line="-n -t ${jmeter.script} -l ${jmeter.result.jtl} -e -o ${jmeter.result.html.dir}" /> </exec> </target> ``` 在 Windows 系统上,可以使用 `osfamily="windows"` 来指定平台,确保脚本正确执行 [^2]。Ant 还可以通过 XSLT 转换 JMeter 生成的 .jtl 文件,生成更友好的 HTML 报告,便于查看测试结果 [^4]。 ### Jenkins 与 Ant 的集成 Jenkins 可以直接调用 Ant 的 `build.xml` 文件来执行测试任务。在 Jenkins 的任务配置中,可以通过 "Execute Shell" 或 "Execute Windows batch command" 执行 Ant 命令,例如: ```bash ant run-tests ``` Jenkins 会在指定的工作空间中执行 Ant 脚本,运行 JMeter 测试并生成报告。测试完成后,Jenkins 还可以通过邮件插件将测试报告发送给相关人员 [^3]。 ### 持续集成与自动化测试流程 完整的自动化测试流程如下: 1. 开发人员提交代码到版本控制系统(如 Git); 2. Jenkins 监听到代码变更,触发构建任务; 3. Jenkins 调用 Ant 执行 JMeter 测试脚本; 4. JMeter 以非 GUI 模式运行测试,生成 .jtl 文件并生成 HTML 报告; 5. Jenkins 收集测试结果,通过插件(如 HTML Publisher Plugin)发布测试报告; 6. Jenkins 通过邮件插件将测试结果发送给相关人员 [^1]。 ### 环境配置与注意事项 - **JMeter 安装**:确保 JMeter 已正确安装,并且环境变量配置正确; - **Ant 安装**:确保 Ant 已安装,并且 `build.xml` 文件配置正确; - **Jenkins 插件**:安装必要的 Jenkins 插件,如 Email Extension Plugin、HTML Publisher Plugin 等; - **测试脚本管理**:将 JMeter 测试脚本存储在版本控制中,便于 Jenkins 拉取和执行; - **报告生成路径**:确保 AntJMeter 的报告输出路径正确,并且 Jenkins 有权限访问这些目录 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值