CodeReview技巧和规范

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 What-什么是CodeReview? CodeReview,即代码评审,是白盒测试中,静态测试的一种方法,通过阅读代码,提出代码层面的缺陷。 Why-为什么做CodeReview? 测试左移:在测试前就发现代码缺陷。 明确测试范围:根据需求文档和代码,对齐测试范围,防止研发夹带本次需求范围外的代码上线。 提升代码能力:学习研发优秀的编程技术。 深入原理:了解系统内部结构及实现。 发现隐藏缺陷:能发现某些极端场景下的问题或概率性问题。 减少测试研发周期占比:节省用例执行个数,尤其多个同类异常梳理,不用执行类似用例,CodeReview一行代码即可。 Who-谁适合做CodeReview? CodeReview需要三大门槛: ①熟悉编程语言,Java/Python/Go等。 ②熟悉编程规范,《阿里巴巴XXX编码规范》、《华为XXX编码规范》、《京东XXX编码规范》。 ③了解需求、架构和设计,需求文档/架构图/设计文档。 达到门槛才适合做CodeReview。 When-什么时候做CodeReview? 提测前,通过Code Diff Review,自己走读代码或者参与研发代码评审会议均可, 发现功能缺陷时,通过走查代码定位代码原因,并分析是否有关联缺陷。 修复缺陷时,阅读研发commit记录,检查是否引入新缺陷。 上线前,通过merge范围检查是否有夹带代码,为了测试改动的临时代码是否恢复。 Where-在哪里做CodeReview? 线上仓库(如Gitlab),适合于修改点单一,不需要查看上下文信息就能找到缺陷。直接在网页端评审代码且发表comment。 本地仓库(如IDEA),适合于修改点较多,需要查看上下文信息(变量或方法跳转到定义或使用之处)。在本地找到缺陷后在线上发表comment。 How-CodeReview如何上手? 准备:了解需求、架构和设计;学习编程语言;学习代码规范; 实践:坚持CodeReview,记录缺陷,定期总结。如果看代码找缺陷比较困难,可以先从发现功能缺陷后,定位代码原因入手。 常见CR缺陷: 除数为0、整数溢出、精度损失; 可能死循环; 在finally程序块中关闭或者释放资源; 异常未处理或提示不明确(没有catch异常,集合等没有判空和长度为0); 公式计算错误; 字符串对比不能用==,使用equals; 数组可能越界; 传递引用错误; 类型转换错误; 条件范围选择错误; 重点检查项: 一致性检查:是否需求相关;是否和方案设计一致;代码风格、日志规范、异常处理等是否和统一规范一致; 完整性检查:服务层是否包含了所有业务功能;数据层是否包含所有需要的数据和操作; 正确性检查:计算逻辑等业务逻辑是否正确;变量是否被正确定义和使用;代码是否符合制定的标准; 可修改性检查:代码涉及到常量是否易于修改,比如使用配置,定义为常量类等;建议业务方法只有一个出口和一个入口(异常处理除外);重要公共方法是否有交叉注释说明;重要的对外方法修改后影响多个下游接口; 可预测性检查:变量初始化;方法稳定性;代码是否存在死循环;代码无穷递归检查; 健壮性检查:代码是否采取措施避免运行时错误(如数组边界溢出、被零除、值越界、堆栈溢出等) 高可用性检查:是否有预案(降级开发、限流配置、兜底策略);补偿方案是否合理; 结构性检查:程序的每个功能是否都作为一个可辨识的代码块存在; 可理解性检查:是否使用到不明确或不必要的复杂代码;代码中的算法是否符合开发文档中描述的数学模型;每个变量都定义了合法的取值范围; 可验证性检查:代码功能是否便于测试;单元测试覆盖度是否足够; 可追溯性检查:代码是否包括一个修订历史记录,记录中对代码的修改和原因都有记录; 编码规范: 《阿里巴巴Java开发手册》 最新版本:黄山版(2022.2.3发布) https://github.com/alibaba/p3c

Django匆匆一眼却解答了多年疑惑

Django 是 Python 的 一款 Web 开发框架,另外还有 Tornado,Flask,Twisted。为什么我要选择学 Django?原因很简单,上家公司来了个网易的测开,就是用 Django 开发的测试平台。

EasyPytest测试平台开发日志之系统设计

EasyPytest测试平台,帮你高效管理Pytest测试用例。

FastAPI官方教程太棒了(上)

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Python第三流行的Web框架 在2020年的Python开发者调查结果中,有这样一段话:“FastAPI在此次调查迭代中首次被引为选项,表现为Python第三流行的Web框架。” FastAPI创立于2018年12月,不到2年就成为仅次于Flask和Django的第三流行的Web框架。而又经过了一年发展来到2022年,虽然2021年Python开发者调查结果还没有出来,但是从GitHub的star来看,Flask 58.7k,Django 63.6k,FastAPI 44.2k,这个差距缩得越来越小。 FastAPI特性 这里就不做机器翻译了,大家看下原文: 我说下我选择FastAPI的理由:首先就是HttpRunner集成了FastAPI,有大佬背书,相信这个框架足以优秀。其次是注解,用多了SpringBoot以后,越来越喜欢注解,层次清晰。对于前后端分离项目来说,Flask虽然非常精简却又自带了Jinja模板引擎,Django虽然是百宝箱却又显得太重,而FastAPI介于两者之间,就是一个纯粹的后端应用。并且FastAPI是基于Starlette框架的,集成了实用功能比如类型检查、OpenAPI(Swagger)等等,这跟我基于pytest框架做tep测试工具的理念很相似。 安装 对Python版本要求是3.6+。 先安装FastAPI: pip install fastapi 再安装ASGI服务器,比如Uvicorn: pip install "uvicorn[standard]" 也可以同时安装fastapi和uvicorn: pip install "fastapi[all]" 运行 写个main.py文件: from typing import Optional from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Optional[str] = None): return {"item_id": item_id, "q": q} 在命令行输入启动应用: uvicorn main:app --reload main是Python模块名。 app是app = FastAPI()。 --reload在代码变化时自动重启服务器。 打开浏览器访问: http://127.0.0.1:8000/items/5?q=somequery 就能看到JSON响应: {"item_id": 5, "q": "somequery"} 访问: http://127.0.0.1:8000/docs 就能看到Swagger接口文档: pydantic pydantic是一个数据验证的库,FastAPI使用它来做模型校验。比如: ...

Flask一分钟Mock一个API

如果安装了Python,并且安装了Flask:

2026-01-01 · 2 分钟 · 289 字 · 测试开发刚哥 · Python生态 · #Flask

HttpRunner3源码剖析__init__文件干了些啥

大家好,我是刚哥。

japi项目需求分析阶段

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 项目简介 japi项目,是一个接口自动化平台开发项目,由【交流群】招人共建,基于JMeter,参考MeterSphere,以学习为目的,完成一个SpringBoot+Vue技术栈的纯粹的接口自动化平台开发。 项目成员 经过"填写人员分工表"以后,最终有38人参与了本次项目: 刚哥、布鲁、嘉宥、守正、大刚、风雨、奉孝、大姚、畅月、渔夫、小禹、钰琪、天湖、迷龙、肥涵、胖子、局长、呼呼、明亮、安宁、木棉、番茄、玥玥、哈瑞、虚竹、十五、阿新、卡罗、大白、库昊、左右、小涌、古风、玉洁、小韩、小卷、千凝、昆明。 随着项目进行,后续“提交学习总结”等环节层层递进,真正留下来的项目成员,会在GitHub的README中署名。 在填表时收集了大家的历史经验,这里汇总整理了一下,供参考: “Vue+Django写过测试平台;SpringBoot写过后端应用;Python小工具开发;Python+Pytest+Requests搭建接口自动化框架;Python+Unittest或Pytest自动化测试框架搭建及脚本开发;各类开源自动化测试平台搭建,如:HttpRunnerManager、流马、Yapi、Sonic等;js+Django2实现UI自动化测试平台;使Testng框架进行接口测试;Vue+fastapi写过测试平台;python+selenium UI自动化;python+httprunner,接口文档解析自动生成字段校验用例;python+RobotFramework做过UI;Java做过单元测试,熟悉基础语法;学过JavaSE,JavaEE,实战经验不多;Python Pyqt GUI工具开发;Python 接口自动化、APP自动化框架设计及编码;独立负责主导Python+Locust性能测试;三方库和标准库:unittest、pytest、appium、selenium、request、httprunner;画过简单的html、css;App UI自动化框架搭建:pytest+appium+allure+jenkins接口自动化框架搭建:pytest+request+allure+jenkins二次开发及维护过flask+vue接口测试平台;二次开发及维护过springboot+angularUI测试平台;Pytest+Playwright UI自动化脚本编写;” 我总结了几个关键字:Vue、Django、SpringBoot、Flask、FastAPI、ElementUI、RobotFramework、脚本开发、工具开发、平台开发、接口自动化、UI自动化、APP自动化。 项目计划 招募,人员分工,需求分析,设计,编码,测试,上线。 由于是以学习为目的,加上都是业余时间投入,也有其他事情要忙,所以该项目不会像真正项目那样,设置里程碑和交付节点,会给足够的学习时间,战线拉得比较长,过程大于结果。 需求分析 MeterSphere官方给出的功能列表,接口自动化相关的模块有接口定义和接口自动化。 接口定义包括以下功能: 在线添加并编辑接口定义; 以树状形式展示项目的模块及对应接口; 支持HTTP、Dubbo、SQL、TCP类型接口请求; 支持通过MeterSphere Json、Postman、Swagger 等多种格式文件快速导入接口,Swagger可通过URL定时同步; 支持接口快捷调试; 根据接口定义快速配置HTTP、TCP协议Mock服务; API列表、CASE列表、文档模式多种模式灵活切换; 接口页面API、TEST、CASE、MOCK多种操作灵活切换; 测试环境信息管理功能; 单接口用例支持引用环境; 支持正则匹配、jsonpath、xpath等多种类型的断言规则; 支持正则匹配、jsonpath、xpath等多种类型的参数提取; 支持BeanShell、Python、Groovy、JavaScript等多种语言的前后置脚本; 支持前置SQL、后置SQL; 支持上传并引用自定义Jar包; 支持查看接口及用例变更历史; 手动执行、定时任务、Jenkins插件触发等多种执行方式; API、CASE一键复制; CASE一键创建性能测试; 接口定义依赖关系设置; 接口自动化包括以下功能: 创建多接口串联的场景化测试; 从接口列表中快速导入接口或接口用例; 跨项目的场景引用功能; 客户端SSL证书认证配置; 场景用例支持引用环境; 支持条件、循环、事务、等待等多种类型的控制器; 支持正则匹配、jsonpath、xpath等多种类型的断言规则; 支持正则匹配、jsonpath、xpath等多种类型的参数提取; 支持BeanShell、Python、Groovy、JavaScript等多种语言的前后置脚本; 场景变量提供多种类型; 提供Mock数据和JMeter变量表达式; 环境配置增加区分模块、路径两种方式添加域名; 增加全局前置脚本、全局后置脚本; 基于插件机制实现其他协议; 支持上传并引用自定义Jar包; 支持查看场景用例变更历史; 手动执行、定时任务、Jenkins插件触发等多种执行方式; 串行、并行两种批量执行方式自由选择; 支持指定测试资源池远程执行; 可多场景串行、并行执行; 场景一键创建性能测试; 场景一键复制; 场景批量执行可自由选择独立报告或集合报告; 场景一键添加到测试计划; 除此之外还有: ...

2026-01-01 · 1 分钟 · 72 字 · 测试开发刚哥 · 原创项目 · #Japi

java+appium+安卓模拟器实现app自动化Demo

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 环境搭建 据说,很多人都被繁琐的环境搭建给吓到了。 是的,确实,繁琐。 node.js 下载地址: https://nodejs.org/en/download/ cmd 输入 node -v,出现下图说明成功: JDK 下载地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 百度一下“配置Java”,配置环境变量。 cmd 输入 java -version,出现下图说明成功: Android SDK 下载地址: https://www.androiddevtools.cn/ 百度一下"配置Android SDK环境变量"。 cmd 输入 adb,出现下图说明成功: Appium Desktop 下载地址: https://github.com/appium/appium-desktop/releases 或 https://testerhome.com/topics/680 Maven 下载地址: http://maven.apache.org/download.cgi 百度一下“ maven环境配置”。 cmd 输入 mvn -version,出现下图说明成功: IntelliJ IDEA 下载地址: http://www.jetbrains.com/idea/ 安卓模拟器 下载地址: https://www.yeshen.com/ 把 Android SDK 目录下 \platform-tool 的 adb.exe 拷贝。 打开 Nox\bin 目录,粘贴替换 adb.exe。 打开模拟器。 ...

JavaWeb开发基础7个Web术语解析

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 7个Web术语 Website: static vs dynamic HTTP HTTP Requests GET vs POST Servlet Container Server: Web vs Application Content Type Website: static vs dynamic 网站内容包括文本、图片、音频、视频,通过URL来访问。网站分为静态网站和动态网站。 静态网站 静态网站是用HTML编写的,所有内容都包含在网页内,就像是打印出来的一样。 动态网站 动态网站分为客户端和服务端,内容是可以动态变化的,可以根据用户请求动态更新网页内容。服务端语言有Servlet、ASP.NET等。 HTTP HTTP是Hypertext Transfer Protocol缩写,超文本传输协议,位于OSI网络分层模型的应用层(第七层)。 超文本(Hypertext)是一种文本形式,它不仅包含普通的文本内容,还包含了可以链接到其他文本或资源的元素。这些链接通常称为“超链接”(Hyperlinks)。超文本的概念由Ted Nelson在1960年代提出,并在万维网(World Wide Web)的发展中得到了广泛应用。 HTTP具有以下特点: media independent:支持任何类型的媒体内容 connectionless:无连接,客户端发送请求后,就断开了连接 stateless:无状态,服务端不会保留客户端请求的状态,不知道谁是谁 HTTP是基于TCP/IP协议的,通过TCP建立可靠连接。为什么说HTTP是无连接的,但又是基于TCP可靠连接的?如果想要可靠地传输数据,那么就必须要有稳定可靠的连接,保证数据不丢失,这个连接就是TCP连接。HTTP正是通过TCP连接来发送和接收数据的。 在HTTP/1.0中,每次请求都会建立一个新的TCP连接,完成请求后立即关闭连接。在HTTP/1.1中,引入了持久连接,允许多个请求/响应在同一个TCP连接上进行,但每个请求/响应对话仍然是独立的。HTTP/1.1是持久连接,那么还能叫做无连接吗?是的,仍然是无连接。持久连接是通过 Connection: keep-alive 头部实现的,允许连接在一段时间内保持打开状态,不需要重新建立和关闭连接。无连接的本质是每个请求/响应对话都是独立的,强调的是独立。 HTTP Requests HTTP请求是客户端发送给服务端的请求,包含以下内容: The Request-line(请求行) The analysis of source IP address, proxy and port(源信息) The analysis of destination IP address, protocol, port and host(目标信息) The Requested URI (Uniform Resource Identifier)(链接) The Request method and Content(方法和内容) The User-Agent header(请求头) The Connection control header(请求头) The Cache control header(请求头) 可以在浏览器中通过F12开发者工具,查看HTTP请求信息。 ...

Java新一代单元测试框架JUnit5速览

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 为什么学JUnit5 Java技术栈的单元测试框架有两个:JUnit和TestNG,有种说法是TestNG比JUnit更强大,学TestNG就够了,但是当我打开GitHub看到star的时候,犹豫了: JUnit TestNG 相差了足足有3K之多。带着这个困惑,我在网上查阅了一番资料,原来JUnit5相较于JUnit4有了重大升级,已经包含了TestNG的所有功能。为了坚定我学JUnit的想法,我咨询了身边做Java开发的朋友,开发写UT都是用的JUnit。这两个理由足以让我开始对JUnit5的学习。 JUnit5是什么 跟之前的JUnit有所不同,JUnit5由三个子项目的模块组成: JUnit5 = JUnit Platform + JUnit Jupiter + JUnit Vintage JUnit Platform 在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入。提供了从命令行启动平台的Console Launcher,和支持JUnit4环境的JUnit4 based Runner。IDE一般都集成了JUnit Platform,比如IntelliJ IDEA。 JUnit Jupiter JUnit5新特性,结合了新的programming model和extension model,以便于在JUnit5中编写测试和扩展。提供了在平台上运行基于Jupiter测试的TestEngine。 JUnit Vintage 提供了在平台上运行基于JUnit3和JUnit4测试的TestEngine,照顾老的项目。 JUnit5新特性 使用JUnit Jupiter写测试 示例代码: import static org.junit.jupiter.api.Assertions.assertEquals; import example.util.Calculator; import org.junit.jupiter.api.Test; class MyFirstJUnitJupiterTests { private final Calculator calculator = new Calculator(); @Test void addition() { assertEquals(2, calculator.add(1, 1)); } } 注意这个导包的路径org.junit.jupiter.api,Jupiter就是JUnit5的新特性。 ...