# 写接口自动化时,我在断言上栽过的两个跟头

写接口自动化时,我在断言上栽过的两个跟头

我是非科班转行做测试的,学接口自动化两个月。写断言(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 官方的测试账号,信息固定不变,很适合拿来做练习的测试目标。用会变动的账号(比如自己的)当测试数据,数据一变断言就得改,不稳定。

小结

这两个坑说大不大,但卡住的时候是真难受,因为它们都属于"我大概知道要干嘛,但不知道具体怎么落到代码上"的那种模糊地带。

帮我自己理清的两句话,送给同样刚入门的你:

  1. 断言就像验货:左边是你拿到的东西,右边是你想验证的标准,先算左边再比。
  2. data["key"] 是掏值比大小,"key" in data 是查钥匙在不在------下笔前先想清楚自己要哪个。

我还在学,文章里如果有理解不到位的地方,欢迎指正。后面我会继续把学接口自动化踩的坑记录下来,互相交流。

相关推荐
SamDeepThinking1 小时前
Java微服务练习方式
java·后端·微服务
IT_陈寒2 小时前
Vue的响应式真把我坑惨了,原来问题出在这
前端·人工智能·后端
codedx2 小时前
LangChain 和 LangGraph 构建的 Agent 项目模版
后端·langchain·agent
葫芦和十三3 小时前
图解 MongoDB 08|ESR 原则:复合索引的字段顺序怎么定
后端·mongodb·agent
葫芦和十三10 小时前
图解 MongoDB 07|索引类型:七种索引,七种访问形状
后端·mongodb·agent
朦胧之12 小时前
AI 编程-老项目改造篇
java·前端·后端
爱勇宝15 小时前
我做了一个只用来搜歌词的小 App
android·前端·后端
IT_陈寒16 小时前
SpringBoot自动配置坑了我一晚上,原来问题出在这
前端·人工智能·后端
SelectDB16 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维