代码覆盖率从 0 到 100 的入门实践
JaCoCo 全称是Java Code Coverage,Java 代码覆盖率,广泛运用于各种测试平台对 Java 代码的全量覆盖率和增量覆盖率进行统计,分析代码行差异,度量单元测试效果。Jacoco 也是精准测试的技术实现手段之一。
JaCoCo 全称是Java Code Coverage,Java 代码覆盖率,广泛运用于各种测试平台对 Java 代码的全量覆盖率和增量覆盖率进行统计,分析代码行差异,度量单元测试效果。Jacoco 也是精准测试的技术实现手段之一。
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 什么是 HAR 包? HAR(HTTP Archive format),是一种JSON格式的存档格式文件,通用扩展名为 .har。 HAR 包是 JSON 格式的,打开后,重点关注entries里面的request和response,包含了请求和响应信息。 流量录制 怎么获取 HAR 包呢?可以网上搜索方法,浏览器 F12、抓包工具(Charles、Proxyman 等)都可以将 HTTP 请求导出为 HAR 包。 生产级别的流量录制很复杂,想要了解的话可以参考阿里开源项目:https://github.com/alibaba/jvm-sandbox-repeater 回放对比 本文重点介绍在导出 HAR 包后,怎么通过 Python 来实现回放对比。 使用介绍 一、将 HAR 包转换为 pytest 用例 har_file 为 har 包路径,profile 配置开启回放,调用 Har.har2case()方法将 HAR 包转换为 pytest 用例。 转换后会生成: demo_test.py 与 HAR 同名的 pytest 用例文件 demo-replay-diff 对比结果目录,暂时为空 sqlite.db 存储 HAR 包响应数据,标记为 expect 二、执行 pytest 用例 from tep.libraries.Diff import Diff from tep.libraries.Sqlite import Sqlite def test(HTTPRequestKeyword, BodyKeyword): var = {'caseId': '023f387db398504889e0afb8dd1bc99d', 'requestOrder': 1, 'diffDir': '/Users/wanggang424/Desktop/PycharmProjects/tep/tests/demo/case/har/demo-replay-diff'} url = "https://postman-echo.com/get?foo1=HDnY8&foo2=34.5" headers = {'Host': 'postman-echo.com', 'User-Agent': 'HttpRunnerPlus', 'Accept-Encoding': 'gzip'} ro = HTTPRequestKeyword("get", url=url, headers=headers) # user_defined_var = ro.response.jsonpath("$.jsonpath") assert ro.response.status_code < 400 Sqlite.record_actual((ro.response.text, var["caseId"], var["requestOrder"], "GET", "https://postman-echo.com/get?foo1=HDnY8&foo2=34.5"), var) url = "https://postman-echo.com/post" headers = {'Host': 'postman-echo.com', 'User-Agent': 'Go-http-client/1.1', 'Content-Length': '28', 'Content-Type': 'application/json; charset=UTF-8', 'Cookie': 'sails.sid=s%3Az_LpglkKxTvJ_eHVUH6V67drKp0AGWW-.PidabaXOnatLRP47hVyqqepl6BdrpEQzRlJQXtbIiwk', 'Accept-Encoding': 'gzip', 'sails.sid': 's%3Az_LpglkKxTvJ_eHVUH6V67drKp0AGWW-.PidabaXOnatLRP47hVyqqepl6BdrpEQzRlJQXtbIiwk'} body = r"""{"foo1":"HDnY8","foo2":12.3}""" ro = BodyKeyword(body) # ro = BodyKeyword(body, {"$.jsonpath": "value"}) body = ro.data ro = HTTPRequestKeyword("post", url=url, headers=headers, json=body) # user_defined_var = ro.response.jsonpath("$.jsonpath") assert ro.response.status_code < 400 Sqlite.record_actual((ro.response.text, var["caseId"], var["requestOrder"], "POST", "https://postman-echo.com/post"), var) url = "https://postman-echo.com/post" headers = {'Host': 'postman-echo.com', 'User-Agent': 'Go-http-client/1.1', 'Content-Length': '20', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Cookie': 'sails.sid=s%3AS5e7w0zQ0xAsCwh9L8T6R7QLYCO7_gtD.r8%2B2w9IWqEIfuVkrZjnxzm2xADIk34zKAWXRPapr%2FAw', 'Accept-Encoding': 'gzip', 'sails.sid': 's%3AS5e7w0zQ0xAsCwh9L8T6R7QLYCO7_gtD.r8%2B2w9IWqEIfuVkrZjnxzm2xADIk34zKAWXRPapr%2FAw'} ro = HTTPRequestKeyword("post", url=url, headers=headers, data=body) # user_defined_var = ro.response.jsonpath("$.jsonpath") assert ro.response.status_code < 400 Sqlite.record_actual((ro.response.text, var["caseId"], var["requestOrder"], "POST", "https://postman-echo.com/post"), var) Diff.make(var["caseId"], var["diffDir"]) 执行时会记录实际请求响应,存入 sqlite 数据库,标记为 actual。 ...
连续调用两次,第一次提交成功,第二次会被驳回——串行重复,系统是防住了的。
在对安卓进行测试时,我们需要把 apk 传到安卓机上,对请求抓包,同时监控应用日志。本文就来讲讲具体操作。
在 HttpRunner3 的示例代码中,发送 HTTP 请求的代码是这样写的:
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 运行文件 JMeter 下载地址为: https://jmeter.apache.org/download_jmeter.cgi 最新版本为 5.4.1,依赖于 Java8+,下载后无需安装,解压即用。解压后的目录和文件如下: bin 二进制文件目录,包括配置文件、启动文件、启动 jar 包、示例脚本。比如 Windows 和 Linux 系统的两个启动脚本: docs API 离线帮助文档。 extras 辅助功能,可用于 Ant、Jenkins 集成。 lib lib 根目录下存放 JMeter 基础 jar 包,lib/ext 目录下存放第三方或自定义扩展 jar 包。 licenses 证书文本文件。 printable_docs 离线帮助文档。 LICENSE 证书说明。 NOTICE 版权声明。 README 简介。 测试计划 JMeter 以图形界面方式启动后,首先映入眼帘的是左侧的 TestPlan,测试计划: JMeter 的 UI 界面只能同时编辑一个测试计划,如果想再编辑另外一个测试计划,必须再打开一个 JMeter 界面。这是因为测试计划对应的是.jmx 文件!不同的.jmx 文件只能在不同的界面中编辑。 JMeter 界面是通过组件拖拽的方式来编写脚本的,脚本的根目录是测试计划。根节点只能有一个,作为根节点,测试计划很适合来做全局配置,比如在 User Defined Variables 处添加键值对格式的全局变量。 测试计划是默认节点,JMeter 还有另外一个不可缺少的次节点:Thread Group,线程组。 多线程 性能测试工具的目的是用少量电脑产生成百上千个并发请求。多进程和多线程正好能用来实现这个需求,书上有句关于进程和线程的至理名言:“进程是操作系统分配资源的最小单位,线程是程序执行的最小单位”。该如何理解呢?前一句的意思是说,每个应用程序都有对应的进程,按照进程来分配资源,可以使得资源利用最大化,避免浪费。后一句的理解得从一个故事讲起,很久以前,进程拿着资源找 CPU 执行。CPU 一看进程太大,说我处理不了。进程只能拆成多个线程给 CPU,不但能执行了,还能在线程之间灵活切换。 ...
注解(Annotations)是 JUnit 的标志性技术,本文就来对它的 20 个注解,以及元注解和组合注解进行学习。
大家好,我是刚哥。
在 Shell 执行pytest -h可以看到 pytest 的命令行参数有这 10 大类,共 132 个
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 一、引言 黑盒测试犹如案发现场,只能根据表象推断事件经过。 代码评审即深入调查,挖掘蛛丝马迹的线索,揭示背后的真相。 “They think I am hiding in the shadows, but I am the shadows.” 二、黑盒测试与白盒测试的区别 黑盒测试存在一些局限性: 可能无法发现与系统实现相关的问题 可能无法覆盖所有的测试场景 测试效率较低,比如准备物料、模拟场景 强依赖需求文档,如果文档不全,测试会漏 对于测试人员来说,可以在代码评审阶段,通过白盒测试改进测试的质量和效率。 三、代码评审的定义和意义 代码评审,Code Review(CR),是一种通过检查代码来提高代码质量的过程。 对于测试人员来说,参与代码评审,可以尽量提前发现问题,减少修复代价,提高效能。 四、代码评审的形式 多人讨论 组织会议,研发牵头讲解代码,架构和测试参与,讨论交流。这是最普遍的一种形式。 Code Diff 查看 Code Diff,可以借助 Gitlab 或 IDEA,比较分支差异或版本差异。 对比时机: 提测前和测试中,自行走查代码 发现缺陷,定位代码原因 修复缺陷后,评估影响范围 上线前,是否夹带代码 精准测试 评估测试用例的代码覆盖率,查漏补缺,Jacoco 的 on-the-fly 模式支持动态收集代码覆盖率数据。 五、代码评审的方法 面向业务,面向业务,面向业务。重要的事情说三遍。 刚开始做代码评审,很容易把注意力集中在找代码规范问题上面,比如命名不规范、注释不清楚、代码实现冗长等。这些问题不是测试人员关注的重点,需要由研发团队或代码扫描工具来解决。 在做 Code Diff 时,也没必要把每个文件、每行代码的意思搞懂,比如研发对代码结构做了调整,在 diff 时要梳理清楚的话,ROI 会非常低,因为既消耗时间,又发现不了问题。 那该怎么做代码评审呢? 关注业务: 跟需求文档比较,哪些需求是遗漏的,哪些代码是补充的,哪些代码是夹带的 关注核心业务代码逻辑,使用条件覆盖、路径覆盖等方法设计测试用例 优化测试用例,针对代码实现考虑异常、边界、幂等、并发等场景 代码评审要求测试人员具备代码能力,理解编程语言,掌握软件设计,熟悉代码结构和架构,多与开发同学交流,共同优化代码质量。 六、代码评审的实际案例 1、空指针异常 ...