写接口自动化时,我在断言上栽过的两个跟头
我是非科班转行做测试的,学接口自动化两个月。写断言(assert)的时候栽过两个特别典型的跟头,估计很多刚入门的人也会卡在这。记录一下我怎么踩坑、又怎么绕出来的,如果你也刚开始写接口测试,希望能帮你少绕点路。
跟头一:断言里 == 左边和右边到底各放什么
刚开始写断言,我写下这行代码:
python
assert resp.json()["title"] == "学会自动化测试"
写的时候我心里冒出个疑问:这个 title 为什么非要跟在 json() 后面?我能不能把它俩换个位置?
因为我一直以为 == 跟赋值号 = 差不多,左右随便放。
后来才搞明白:== 是比较符,虽然左右调换 Python 不会报错,但有个约定俗成的习惯------
左边放你从服务器拿到的实际值,右边放你预期的值。
python
assert resp.json()["title"] == "学会自动化测试"
# ↑ 服务器返回的真实数据 ↑ 你希望它等于什么
# 实际值(左边) 预期值(右边)
我用一句大白话帮自己记:就像说"我兜里的钱 == 100 块"。你不会反过来说"100 块 == 我兜里的钱",虽然意思一样,但读起来别扭。断言也是一个道理,先有你拿到的东西,再去对照标准。
现在我养成习惯:先把实际值算出来,放左边,再写预期值。
python
resp = requests.get(url)
data = resp.json()
assert data["title"] == "学会自动化测试"
# ↑ 服务器给的 ↑ 我想验证的
跟头二:"掏值比较"和"查存在"用混了
第二个坑更隐蔽。练习要求我写两个断言:一个是"断言 id 等于 1",另一个是"断言 title 不为空"。
我知道一个该用 ==,一个该用 in,但具体怎么写脑子一团乱:什么时候用 [key] 把值掏出来?什么时候直接用 in 去查?当时我大概写成这样,全是问号:
python
assert ??? id == 1 # 知道要比大小,但不知道怎么把 id 掏出来
assert ??? title 不为空 # 知道要判断存在,但不知道 in 怎么用
卡了挺久,后来想通了------这是两件完全不同的事:
data["key"]→ 把键对应的值 掏出来 → 然后用==比较"key" in data→ 检查这个键 在不在字典里 →in自己就返回 True/False
我给自己想了个比喻:把字典想象成一个柜子。
data["抽屉"] 是拉开抽屉看里面装了什么 (取值); "钥匙" in data 是问这把钥匙存不存在(查键)。
一个是看里面的东西,一个是看钥匙在不在,两码事。
想通之后,正确写法就很自然了:
python
data = resp.json()
assert data["id"] == 1 # 掏出 id 的值,和 1 比较
assert "title" in data # 检查 title 这个键在不在字典里
完整示例:一个能跑的接口测试
上面都是拆开讲的片段,这里给一份完整的、能直接跑的例子,方便你照着试。我拿 GitHub 的公开 API 来演示(查用户信息这个接口不需要登录,直接就能调):
python
import requests
def test_github_user():
# 1. 发请求
url = "https://api.github.com/users/octocat"
resp = requests.get(url)
# 2. 先断言请求成功(状态码 200)
assert resp.status_code == 200
# 3. 把返回的 JSON 转成字典
data = resp.json()
# 4. 两种断言一起用:
assert data["login"] == "octocat" # 掏出 login 的值,比较是否等于 octocat
assert "id" in data # 检查 id 这个键存不存在
把这段存成 test_user.py,装好 requests(pip install requests)和 pytest(pip install pytest),在终端跑 pytest test_user.py,看到一条绿色的 PASSED 就成功了。
小提示:
octocat是 GitHub 官方的测试账号,信息固定不变,很适合拿来做练习的测试目标。用会变动的账号(比如自己的)当测试数据,数据一变断言就得改,不稳定。
小结
这两个坑说大不大,但卡住的时候是真难受,因为它们都属于"我大概知道要干嘛,但不知道具体怎么落到代码上"的那种模糊地带。
帮我自己理清的两句话,送给同样刚入门的你:
- 断言就像验货:左边是你拿到的东西,右边是你想验证的标准,先算左边再比。
data["key"]是掏值比大小,"key" in data是查钥匙在不在------下笔前先想清楚自己要哪个。
我还在学,文章里如果有理解不到位的地方,欢迎指正。后面我会继续把学接口自动化踩的坑记录下来,互相交流。