01 第多个:地基打不牢,后面全是坑
很多人学自动化测试,上来就啃Selenium、Postman。结果呢?一周后连断言是什么都搞不清。我犯过同样的错误,浪费了整整多个。
核心原则:先理解接口测试的本质,再动手。
接口测试到底在测什么?就3件事:
- 请求发出去,服务器有没有返回正确的结果?
- 参数变了,结果会不会跟着变?
- 异常情况下,系统会不会崩?
第1周,我死磕了3个基础概念:
- **HTTP协议**:GET和POST的区别、状态码200/404/500的含义
- **JSON格式**:花2小时学完JSON的键值对、数组、嵌套结构
- **API文档**:看懂请求地址、请求头、请求体、响应体
实战案例:我拿了一个公开的天气查询API练手。
```python
最简单的GET请求
import requests
url = "https://api.openweathermap.org/data/较高/weather"
params = {
"q": "Beijing",
"appid": "你的API密钥"
}
response = requests.get(url, params=params)
print(response.status_code) # 打印状态码
print(response.json()) # 打印响应数据
```
运行这段代码,我看到了返回的JSON数据。那一刻,我明白了:原来接口测试就是“发请求+看响应”。
第2周,我攻克了鉴权机制。没有鉴权,接口就是裸奔。我学了3种常见方式:
- API Key:最简单,直接放在URL参数里
- Token:先登录获取,再携带在请求头里
- OAuth 较高:复杂但安全,企业级项目标配
实战案例:用Token调一个用户信息接口。
```python
import requests
先登录获取token
login_url = "https://api.example.com/login"
login_data = {"username": "test", "password": "123456"}
login_resp = requests.post(login_url, json=login_data)
token = login_resp.json()["token"]
用token请求用户信息
user_url = "https://api.example.com/user/profile"
headers = {"Authorization": f"Bearer {token}"}
user_resp = requests.get(user_url, headers=headers)
print(user_resp.json())
```
第3周,我学会了接口文档的“读心术”。一个合格的API文档会告诉你:
- 请求方法(GET、POST、PUT、DELETE)
- 必填参数和可选参数
- 参数的数据类型(string、int、boolean)
- 返回的字段含义
> 读不懂文档,接口测试就是瞎子摸象。
---
02 第多个:工具选对,效率翻10倍
工具不是越多越好,是越精越好。我踩过3个工具的坑,最后只留了2个。
工具1:Postman——接口调试的瑞士军刀
Postman是入门首选,没有之一。它解决了我3个痛点:
- 不用写代码就能发请求
- 可以保存测试用例,随时回放
- 支持环境变量,切换开发/测试/生产环境
实战案例:用Postman测试一个“创建订单”接口。
- 新建请求,选择POST方法
- 输入URL:`https://api.example.com/orders`
- 设置请求头:`Content-Type: application/json`
- 填写请求体:
```json
{
"user_id": 123,
"product_id": 456,
"quantity": 2,
"total_price": 较高
}
```
- 点击Send,查看响应状态码和返回数据
- 添加断言:在Tests标签页写
```javascript
pm.test("状态码是201", function () {
pm.response.to.have.status(201);
});
pm.test("返回订单ID", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.order_id).to.be.a('string');
});
```
工具2:Python + requests库——批量自动化的核武器
Postman适合手动调试,但一旦用例超过50个,就必须上脚本。我选了Python,因为:
- 语法简单,10分钟就能上手
- requests库封装了HTTP请求,代码量少
- pytest框架天生支持参数化,数据驱动测试
实战案例:用pytest批量测试登录接口。
```python
import pytest
import requests
测试数据
test_cases = [
("admin", "admin123", True), # 正常用户
("admin", "wrongpass", False), # 错误密码
("", "admin123", False), # 空用户名
("admin@", "admin123", False), # 非法用户名
]
@pytest.mark.parametrize("username,password,expected", test_cases)
def test_login(username, password, expected):
url = "https://api.example.com/login"
data = {"username": username, "password": password}
response = requests.post(url, json=data)
if expected:
assert response.status_code == 200
assert "token" in response.json()
else:
assert response.status_code == 401
```
工具3:JMeter——性能测试的压舱石
第8周,我开始接触性能测试。JMeter虽然界面丑,但功能暴力:
- 支持多线程并发,模拟1000个用户同时请求
- 可以监控响应时间、吞吐量、错误率
- 生成可视化报告,柱状图、折线图一目了然
实战案例:用JMeter压测登录接口。
- 添加线程组:设置100个线程,循环10次
- 添加HTTP请求:配置URL、方法、参数
- 添加监听器:聚合报告、图形结果
- 运行后看结果:平均响应时间<500ms,错误率<较高
> 工具是刀,思路是刀法。刀好不如刀法好。
---
03 第多个:从手动到自动,我只做了3件事
前多个,我还在手工点Postman。第多个,我开始写自动化脚本。转变的催化剂是多个。
项目1:电商系统接口自动化
这个系统有20个接口,包括用户注册、商品搜索、下单、支付、退款。我用了pytest + requests + Allure报告。
核心代码:参数化测试商品搜索功能。
```python
import pytest
import requests
import allure
base_url = "https://api.ecommerce.com"
search_data = [
("手机", 1, 20, 200), # 正常搜索
("", 1, 20, 400), # 空关键词
("xyz", 1, 20, 200), # 无结果搜索
("手机", -1, 20, 400), # 页码非法
]
@allure.story("商品搜索")
@pytest.mark.parametrize("keyword,page,size,expected_code", search_data)
def test_search_product(keyword, page, size, expected_code):
url = f"{base_url}/products/search"
params = {"keyword": keyword, "page": page, "size": size}
response = requests.get(url, params=params)
assert response.status_code == expected_code
if expected_code == 200:
data = response.json()
assert "total" in data
assert len(data["items"]) <= size
```
项目2:微信小程序接口测试
小程序接口特殊在:需要先获取access_token,而且token有2小时有效期。我写了一个自动获取并缓存token的模块。
```python
import requests
import time
from functools import lru_cache
class WeChatAPI:
def __init__(self, appid, secret):
self.appid = appid
self.secret = secret
self.token = None
self.token_expire_time = 0
def get_token(self):
if time.time() < self.token_expire_time:
return self.token
url = "https://api.weixin.qq.com/cgi-bin/token"
params = {
"grant_type": "client_credential",
"appid": self.appid,
"secret": self.secret
}
response = requests.get(url, params=params)
data = response.json()
self.token = data["access_token"]
self.token_expire_time = time.time() + data["expires_in"] - 60
return self.token
def send_template_msg(self, openid, template_id, data):
token = self.get_token()
url = f"https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={token}"
body = {
"touser": openid,
"template_id": template_id,
"data": data
}
response = requests.post(url, json=body)
return response.json()
使用
wechat = WeChatAPI("your_appid", "your_secret")
result = wechat.send_template_msg("user_openid", "template_id", {"name": "测试"})
print(result)
```
项目3:定时任务 + 邮件报告
自动化测试的价值在于持续运行。我用了Linux的crontab,每天凌晨2点跑一次全量用例,跑完自动发邮件。
```python
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import subprocess
import time
def run_tests():
"""运行pytest并生成报告"""
result = subprocess.run(
["pytest", "--alluredir=./reports", "--html=report.html"],
capture_output=True, text=True
)
return result.returncode == 0
def send_email(success, report_path):
"""发送测试报告邮件"""
msg = MIMEMultipart()
msg["From"] = "tester@company.com"
msg["To"] = "team@company.com"
msg["Subject"] = f"接口自动化测试报告 - {'通过' if success else '失败'}"
with open(report_path, "r") as f:
html_content = f.read()
msg.attach(MIMEText(html_content, "html"))
with smtplib.SMTP("smtp.company.com", 587) as server:
server.starttls()
server.login("tester@company.com", "password")
server.send_message(msg)
主流程
if __name__ == "__main__":
start_time = time.time()
is_success = run_tests()
elapsed = time.time() - start_time
send_email(is_success, "report.html")
print(f"测试用时{elapsed:.2f}秒,结果:{'成功' if is_success else '失败'}")
```
> 自动化不是写一次脚本,而是让脚本替你干活。
---
04 时间规划:每天2小时,多个足够
很多人觉得多个太短。我用数据说话:每天2小时,多个就是180小时。180小时足够掌握任意一门技能。
周计划模板:
| 时间段 | 学习内容 | 实战任务 |
|--------|----------|----------|
| 第1周 | HTTP协议、JSON | 用requests调通一个API |
| 第2周 | 鉴权机制、Postman | 用Postman完成登录接口测试 |
| 第3周 | API文档解读 | 独立读通一个企业级API文档 |
| 第4周 | Python基础+requests | 写10个接口测试脚本 |
| 第5周 | pytest框架 | 参数化测试登录接口 |
| 第6周 | 断言+数据驱动 | 完成商品模块接口测试 |
| 第7周 | JMeter入门 | 压测登录接口 |
| 第8周 | 性能指标分析 | 输出性能测试报告 |
| 第9周 | 项目实战1 | 电商系统接口自动化 |
| 第10周 | 项目实战2 | 小程序接口测试 |
| 第11周 | CI/CD集成 | 把脚本挂到Jenkins |
| 第12周 | 总结+面试准备 | 输出作品集 |
每日时间分配:
- 30分钟:看视频/文档(B站、官方文档)
- 1小时:写代码+调试(遇到报错不要慌,先看错误信息)
- 30分钟:复盘+记录(写学习笔记,哪怕只有3行)
避坑指南:
- 不要同时学3个工具,先死磕1个
- 不要看完视频再动手,边看边敲
- 不要追求完美,先跑通再优化
> 每天2小时,多个后,你比较高的人强。
---
05 面试通关:把实战项目讲成故事
学完技术,最后一步是求职。面试官不看你会多少理论,只看你做过什么。
必问问题1:描述一个你做的接口自动化项目。
标准回答结构:
- 项目背景:测试什么系统,有多少接口
- 技术选型:为什么选Python+pytest,不选Java+TestNG
- 核心难点:鉴权怎么处理、数据怎么准备
- 最终成果:测试覆盖了多少接口,发现了多少bug
实战话术:
“我做过一个电商系统的接口自动化项目,覆盖了20个核心接口。技术栈选了Python+pytest,因为Python生态好,requests库写起来快。较大的难点是订单状态转换——创建订单后要支付,支付后要发货,状态环环相扣。我用了pytest的fixture机制,把每个状态的前置条件抽出来复用。最终测试覆盖率达到较高,上线前提前发现了3个支付接口的bug。”
必问问题2:接口测试和UI测试的区别是什么?
一句话答案:接口测试测的是“功能正确性”,UI测试测的是“用户交互体验”。
延伸回答:
- 接口测试:速度快(毫秒级响应),稳定性高,适合做CI
- UI测试:速度慢(秒级响应),容易受环境干扰,适合做冒烟测试
- 实际工作中:接口测试占较高,UI测试占较高
必问问题3:怎么处理接口依赖?
经典解法:用pytest的`request` fixture传递数据。
```python
import pytest
@pytest.fixture
def create_order():
"""创建订单,返回订单ID"""
url = "https://api.example.com/orders"
data = {"user_id": 123, "product_id": 456, "quantity": 1}
response = requests.post(url, json=data)
return response.json()["order_id"]
def test_pay_order(create_order):
"""支付订单,依赖create_order返回的订单ID"""
order_id = create_order
url = f"https://api.example.com/orders/{order_id}/pay"
response = requests.post(url)
assert response.status_code == 200
```
> 面试不是背答案,是讲你踩过的坑和填坑的方法。
---
多个前,我连接口是什么都不知道。现在,我每天用脚本自动跑完所有用例。你只差一个开始。

京公网安备
11010802035719号