手搓python接口自动化框架

📅 发布时间:2026/8/12 16:09:31
手搓python接口自动化框架
目录手搓python接口自动化框架第一步创建标准目录结构这是框架的骨架第二步核心代码今天必须敲进去第三步立刻执行感受工业级框架的爽感第四步把“硬编码”干掉引入数据驱动手搓python接口自动化框架第一步创建标准目录结构这是框架的骨架打开你的PyCharm建立一个项目名字就叫 InterfaceAutoFramework目录结构必须严格按照下面这样InterfaceAutoFramework/├── common/ # 公共封装层核心发动机│ ├──init.py│ ├── http_client.py # 封装Requests处理Session和重试│ └── logger.py # 日志记录方便甩锅给后端├── config/ # 配置层绝不写死在代码里│ ├──init.py│ └── settings.py # 环境地址、超时时间、账号密码├── data/ # 数据层存放JSON/YAML测试数据│ └── test_data.json├── testcases/ # 测试用例层按模块划分│ ├──init.py│ └── test_demo.py├── utils/ # 工具层辅助函数比如加密、随机数│ ├──init.py│ └── common_utils.py├── reports/ # 报告和日志输出目录├── conftest.py # Pytest全局钩子最重要└── requirements.txt # 依赖包清单第二步核心代码今天必须敲进去写入 requirements.txt只装这3个别装多余的requests2.31.0 pytest8.2.0 pyyaml6.0.1写入 config/settings.py环境隔离importosclassConfig:BASE_URLhttps://httpbin.org# 先用这个公开接口练手TIMEOUT10RETRY_TIMES3# 以后如果环境切换只需要改这里或者读环境变量写入 common/http_client.py这是你30年功力的体现必须封装Session和重试importrequestsfromrequests.adaptersimportHTTPAdapterfromurllib3.util.retryimportRetryfromconfig.settingsimportConfigclassHttpClient:def__init__(self):self.sessionrequests.Session()# 经典重试机制遇到503、502等自动重试3次retryRetry(totalConfig.RETRY_TIMES,backoff_factor0.5,status_forcelist[502,503,504])adapterHTTPAdapter(max_retriesretry)self.session.mount(http://,adapter)self.session.mount(https://,adapter)defsend_request(self,method,endpoint,**kwargs): 统一发送请求自带超时和日志后面再加 urlConfig.BASE_URLendpoint kwargs.setdefault(timeout,Config.TIMEOUT)# 这是关键把请求的Request和Response存下来方便断言失败时查看print(f【请求】:{method.upper()}{url}参数:{kwargs.get(params)}Body:{kwargs.get(json)})responseself.session.request(methodmethod.upper(),urlurl,**kwargs)print(f【响应】: 状态码{response.status_code}, Body:{response.text[:200]}...)# 只打200字符returnresponse写入 testcases/test_demo.py你的第一个真正的“数据驱动”用例importpytestfromcommon.http_clientimportHttpClient# 从Pytest的夹具里拿client后面conftest里会全局注册deftest_get_request(http_client): 场景Get请求断言返回结果中的url包含我们请求的地址 responsehttp_client.send_request(GET,/get,params{name:老张})# 断言1状态码这是基本盘assertresponse.status_code200# 断言2核心业务断言取JSON里的字段resp_jsonresponse.json()assertresp_json.get(args,{}).get(name)老张# 断言3包含断言验证我们拼的url是否准确asserthttpbininresp_json.get(ur在这里插入代码片l)print(✅ 所有断言通过)写入根目录下的 conftest.pyPytest的依赖注入免去重复new对象importpytestfromcommon.http_clientimportHttpClientpytest.fixture(scopefunction)# scopefunction 表示每个用例都拿新session互不干扰defhttp_client():将http_client注入到每一个测试用例中returnHttpClient()第三步立刻执行感受工业级框架的爽感在你的终端Terminal里执行以下命令# 1. 安装依赖pipinstall-rrequirements.txt# 2. 运行用例-v 显示详细信息-s 显示print打印的内容pytest-v-stestcases/test_demo.py如果看到绿色 PASSED恭喜你你的框架地基打好了第四步把“硬编码”干掉引入数据驱动你现在代码里的 params{“name”: “老张”} 是写死的。真正的框架绝不能这样。1.在 data/test_data.json 里写{get_params:[{name:张三,age:18},{name:李四,age:25}]}2.改造 test_demo.py改成importpytestimportjsonpytest.mark.parametrize(test_data,json.load(open(data/test_data.json))[get_params])deftest_get_request_data_driven(http_client,test_data):responsehttp_client.send_request(GET,/get,paramstest_data)assertresponse.json()[args][name]test_data[name]