软件测试学习周记:从零开始的第二周

122 阅读6分钟

一、写在前面

第一周搞定了手工测试的基础理论和用例设计,第二周正式进入自动化测试的大门。

第二周核心内容: 用 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 本周最大感悟

接口自动化其实没有想象中那么难,核心就是"发请求→拿响应→做断言"三步。

测试理论是基础,代码只是工具。有了第一周的测试思维,学自动化就是把手工测试的步骤用代码实现出来。

而且自动化能帮你省很多重复劳动,回归测试的时候跑一遍脚本就行,不用一条条手动点。

 

八、下周学习计划

  1. 入门Web UI自动化测试,学习Playwright工具

  2. 掌握浏览器启动、元素定位、页面点击/输入、截图基础操作

  3. 写一个简单的网页自动化流程用例,比如自动登录saucedemo商城

  4. 把Web自动化的基础用法跑通,搭建好环境

 

——————————————————————————————

�� 本文涉及的所有测试脚本、测试报告及学习笔记均已整理至 GitHub:

github.com/StillStream…