一、写在前面
第一周搞定了手工测试的基础理论和用例设计,第二周正式进入自动化测试的大门。
第二周核心内容: 用 Python 写接口自动化测试,覆盖 GET/POST 请求、pytest 用例组织、参数化测试和 HTML 报告生成。
这周的学习目标很明确:从最基础的发请求开始,到用 pytest 组织用例,再到生成 HTML 测试报告,一步步把完整流程跑通。有第一周的测试理论打底,这周学起来相对顺利,重点是把代码写对、把环境跑通。
二、Day1|Python基础语法回顾与requests库入门
第一天先把Python基础过了一遍,重点是后面写测试会用到的语法:变量、列表、字典、条件判断、循环、函数、异常处理。
2.1 核心语法回顾
· 变量与数据类型:存测试账号、密码、URL这些测试数据
· 列表:存多个测试账号,批量执行用例
· 字典:存接口请求参数、返回的JSON数据(最常用!)
· 条件判断:根据状态码判断测试是否通过
· 循环:批量执行多条用例
· 函数:把登录、发请求这些重复操作封装起来
· 异常处理:请求超时、网络错误时不让脚本直接崩掉
2.2 requests库安装与第一个请求
安装很简单,一行命令:
pip install requests
然后写了第一个GET请求,访问百度,打印状态码和响应内容。虽然很简单,但第一次用Python发请求成功的感觉还是挺奇妙的。
三、Day2|GET/POST请求实战与接口断言
3.1 带参数的GET请求
学了两种传参方式:直接拼在URL里,或者用params参数传字典。推荐第二种,更清晰。
接口返回JSON的话,用response.json()直接转成Python字典,然后就可以用字典的方式取值做断言了。
3.2 POST请求(最常用)
登录、提交数据都是POST请求。需要设置请求头Content-Type,然后用json参数传请求体,requests会自动帮你转成JSON格式。
3.3 response常用属性
| 写法 | 作用 |
|---|---|
| response.status_code | 获取状态码,校验是不是200/404/500 |
| response.json() | 转成Python字典,校验JSON里的字段 |
| response.text | 获取原始响应文本 |
四、Day3|pytest测试框架入门与用例组织
4.1 为什么用pytest
如果只是自己写几个函数跑测试,用例多了会很乱。pytest是Python里最常用的测试框架,可以帮你自动发现用例、批量执行、生成报告。
4.2 pytest基本规则
1. 文件名必须以 test_ 开头,pytest才会识别
2. 函数名必须以 test_ 开头,才会被当成测试用例
3. 用 assert 做断言,失败了自动打印详情,不用自己写print
4. 执行命令:pytest 文件名.py -v
4.3 第一个pytest用例
把之前写的登录接口测试改成了pytest格式,每个用例是一个独立的函数,用assert校验结果。执行后能清楚看到每条用例是通过还是失败。
五、Day4|参数化测试与HTML报告生成
5.1 参数化测试
这是这周最实用的知识点!
比如要测试5个不同的帖子ID,不用写5个函数,用@pytest.mark.parametrize装饰器,一个函数就能循环跑5组数据。代码量直接减少80%,加测试数据也很方便,直接在参数列表里加就行。
5.2 HTML测试报告
安装pytest-html插件,执行命令的时候加--html=report.html,就能自动生成一份可视化的HTML测试报告。报告里有总用例数、通过数、失败数,每条用例的执行详情都有,看起来很专业。
六、Day5-6|完整脚本与踩坑记录
6.1 完整测试脚本
这周最终写了8条接口测试用例,覆盖4类核心场景。以下是test_api_new.py的核心代码:
import requests
import pytest
基础URL
BASE_URL = "jsonplaceholder.typicode.com"
1. GET /posts - 获取所有帖子
def test_get_all_posts():
response = requests.get(f"{BASE_URL}/posts")
assert response.status_code == 200
data = response.json()
assert len(data) > 0
print(f"获取到 {len(data)} 条帖子")
2. GET /posts/{id} - 获取单个帖子(参数化)
@pytest.mark.parametrize("post_id", [1, 2, 3, 4, 5])
def test_get_single_post(post_id):
response = requests.get(f"{BASE_URL}/posts/{post_id}")
assert response.status_code == 200
data = response.json()
assert data["id"] == post_id
assert "title" in data
assert "body" in data
print(f"帖子 {post_id}: {data['title'][:30]}...")
3. POST /posts - 创建新帖子
def test_create_post():
new_data = {
"title": "我的第二周接口测试",
"body": "这是通过Python自动创建的帖子",
"userId": 1
}
response = requests.post(f"{BASE_URL}/posts", json=new_data)
assert response.status_code == 201
data = response.json()
assert data["title"] == new_data["title"]
assert data["body"] == new_data["body"]
print(f"创建成功,新帖子ID: {data['id']}")
4. GET /posts/99999 - 不存在的帖子(404)
def test_get_nonexistent_post():
response = requests.get(f"{BASE_URL}/posts/99999")
assert response.status_code == 404
print("不存在的帖子返回404,符合预期")
6.2 遇到的3个坑
1. 函数缺少参数: 写参数化用例的时候,test_get_single_post()函数忘了加post_id形参,运行直接报错。
2. requests拼写错误: 把response = requests.get()写成了response = response.get(),提示对象没有get方法。搞了半天才发现是变量名和模块名搞混了。
3. HTML报告不刷新: 改了代码重新跑,打开报告还是旧的错误。后来发现是浏览器缓存,或者旧报告文件没删掉,删了重跑就好了。
6.3 最终成果
· 8条完整的接口自动化测试用例
· 覆盖GET列表、GET单条(参数化5个ID)、POST新增、异常场景4类接口
· 1份可视化HTML测试报告
· 所有用例全部通过
七、本周整体收获与总结
7.1 已掌握能力
· 能用requests库发GET和POST请求,传参、传请求头都会
· 能从接口返回的JSON里提取数据,用assert做断言
· 会用pytest框架组织测试用例,知道命名规则和执行方式
· 会用参数化装饰器,一套代码跑多组测试数据
· 能生成HTML测试报告,直观展示测试结果
7.2 遇到的问题与解决
这周踩的坑基本都是代码拼写错误和环境问题,比如函数缺参、变量名写错、报告缓存。
最大的感悟是:写代码一定要细心,一个字母拼错就会报错。遇到报错不要慌,先看错误信息,定位到哪一行出问题,然后一步步排查。
7.3 本周最大感悟
接口自动化其实没有想象中那么难,核心就是"发请求→拿响应→做断言"三步。
测试理论是基础,代码只是工具。有了第一周的测试思维,学自动化就是把手工测试的步骤用代码实现出来。
而且自动化能帮你省很多重复劳动,回归测试的时候跑一遍脚本就行,不用一条条手动点。
八、下周学习计划
-
入门Web UI自动化测试,学习Playwright工具
-
掌握浏览器启动、元素定位、页面点击/输入、截图基础操作
-
写一个简单的网页自动化流程用例,比如自动登录saucedemo商城
-
把Web自动化的基础用法跑通,搭建好环境
——————————————————————————————
�� 本文涉及的所有测试脚本、测试报告及学习笔记均已整理至 GitHub: