Postman竟然还能录制流量
大家好,我是刚哥。
大家好,我是刚哥。
在Shell执行pytest -h可以看到pytest的命令行参数有这10大类,共132个
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 概览 脚手架: 目录: 用例代码: """ 测试登录到下单流程,需要先启动后端服务 """ test_data = { "查询SKU": { "skuName": "电子书" }, "添加购物车": { "skuId": 123, "skuNum": 2 }, "下单": { "orderId": 222, "payAmount": "0.2" }, "支付": { "skuId": 123, "price": 0.1, "skuNum": 2, "totalPrice": 0.2 }, } case_vars = dict() def test(http, login_headers, file_data): # 搜索商品 url = file_data["domain"] + "/api/tasks/mock/searchSku" body = test_data["查询SKU"] response = http("get", url=url, headers=login_headers, params=body) assert response.status_code < 400 case_vars["skuId"] = response.jsonpath("$.skuId") case_vars["skuPrice"] = response.jsonpath("$.price") # 添加购物车 url = file_data["domain"] + "/api/tasks/mock/addCart" body = test_data["添加购物车"] body["skuId"] = case_vars["skuId"] response = http("post", url=url, headers=login_headers, json=body) assert response.status_code < 400 case_vars["skuNum"] = response.jsonpath("$.skuNum") case_vars["totalPrice"] = response.jsonpath("$.totalPrice") # 下单 url = file_data["domain"] + "/api/tasks/mock/order" body = test_data["下单"] body["skuId"] = case_vars["skuId"] body["price"] = case_vars["skuPrice"] body["skuNum"] = case_vars["skuNum"] body["totalPrice"] = case_vars["totalPrice"] response = http("post", url=url, headers=login_headers, json=body) assert response.status_code < 400 case_vars["orderId"] = response.jsonpath("$.orderId") # 支付 url = file_data["domain"] + "/api/tasks/mock/pay" body = test_data["支付"] body["orderId"] = case_vars["orderId"] response = http("post", url=url, headers=login_headers, json=body) assert response.status_code < 400 assert response.jsonpath("$.success") == "true" 页面下载脚手架 启动平台前后端服务后,从页面下载脚手架,平台会拉取开源项目tep-project最新代码,打成压缩包,生成下载文件,弹窗下载。 ...
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Flask是什么 如果说Django是一个开箱即用的自带完善功能的Web框架,那么Flask就是一个只提供基础结构的微型框架。这一点从它的GitHub源码就能看出端倪: 它的核心代码就只有这么多。微型意味着Flask本身只提供了简单的核心的功能,但它具备了强大的可扩展性。比如,它不会强制你使用某个ORM框架,而是把选择权交给你,让你自己决定集成哪个扩展。 无论如何,都应该学习一下Flask,因为它让你从零开始,了解一个Web框架是如何诞生的: 安装Flask Flask需要Python3.6及以上才能使用,最新的async异步支持需要Python3.7及以上。 安装Flask前可以先创建一个虚拟环境,这样相关的包都放在这个虚拟环境中。 Mac用户: ## 创建 $ mkdir myproject $ cd myproject $ python3 -m venv venv ## 激活 $ . venv/bin/activate Windows用户: ## 创建 > mkdir myproject > cd myproject > py -3 -m venv venv ## 激活 > venv\Scripts\activate 然后就通过pip安装Flask即可: $ pip install Flask Hello World Flask是一个Web框架,更准备的说是一个提供接口的后端服务,只需要5行代码就能实现一个接口: from flask import Flask app = Flask(__name__) @app.route("/") def hello_world(): return "<p>Hello, World!</p>" 截止到目前,还没见过哪个Web框架是这么玩的,有点颠覆对Web框架的认知,印象中的Web框架都是有点庞大的,Flask却很轻巧的就实现了。 运行后会在控制台输出: > set FLASK_APP=hello > flask run * Running on http://127.0.0.1:5000/ 浏览器访问http://127.0.0.1:5000/就会看到Hello, World!字样。 ...
unittest和pytest是Python的2个强大的测试框架,经常用来做UI自动化或接口自动化。unittest是PyCharm的默认集成工具,也是我们大多数人入门自动化的首选框架。pytest提供了更丰富的功能,相对的上手难度也要高一点。如果学了pytest后,想快速用pytest写项目,用于工作实践,那么可以试试我写的这款测试工具:tep,try easy pytest。
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 一、引言 黑盒测试犹如案发现场,只能根据表象推断事件经过。 代码评审即深入调查,挖掘蛛丝马迹的线索,揭示背后的真相。 “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、空指针异常 import org.mybatis.spring.SqlSessionTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { private final SqlSessionTemplate sqlSessionTemplate; @Autowired public UserService(SqlSessionTemplate sqlSessionTemplate) { this.sqlSessionTemplate = sqlSessionTemplate; } public void getUserById(String userId) { User user = sqlSessionTemplate.selectOne("com.example.mapper.UserMapper.getUserById", userId); System.out.println(user.getName()); // 可能导致空指针异常 } } 如果取到的 user 对象为空,就会导致空指针异常。 ...
多线程,通道,读写锁(单写多读),随机(洗牌),是本文涉及的主要知识点。
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Pairwise算法是什么 对于以下测试场景: 浏览器:M,O,P 操作平台:W(windows),L(linux),i(ios) 语言:C(chinese),E(english) 该如何设计功能测试用例呢? 根据数学统计分析,73%的缺陷(单因子是35%,双因子是38%)是由单因子或2个因子相互作用产生的。19%的缺陷是由3个因子相互作用产生的。也就是说,大多数的bug都是条件的两两组合造成的。 Pairwise算法是L. L. Thurstone在1927年首先提出来的,他是美国的一位心理统计学家。Pairwise算法基于两两组合,过滤出性价比高的用例集。它的思路是:如果某一组用例的两两组合结果,在其他组合中均出现,就删除该组用例,从而精简用例。 对于上述测试场景,可以通过笛卡尔积设计18条两两组合的测试用例: 1,M W C 2,M W E 3,M L C 4,M L E 5,M I C 6,M I E 7,O W C 8,O W E 9,O L C 10,O L E 11,O I C 12,O I E 13,P W C 14,P W E 15,P L C 16,P L E 17,P I C 18,P I E 对于第18条用例P I E来说,两两组合是PI ,PE ,IE,PI在17号,PE在16号,IE在12号出现过,所以第18条用例可以过滤掉。按照这个算法继续过滤,最终剩下9条用例: ...
不管测试平台有没有实际用处,具备测试平台开发能力,是测试开发工程师的必备技能之一。 测试平台的实际收益有多少,仁者见仁智者见智,这是一个辩证问题。测试平台开发能力是否具备,一清二楚,这是一个现实问题。我们能做的只有提高自己,解决现实问题。
错误码不分层的接口,你只能靠 msg 断言,改个文案用例就跑失败。返回快照的字段返回了实时,数据就无法核对上。