目录
测试需求
简单的一个接口场景:
接口场景:6个接口,分别为登录接口,新建项目接口,导入图片接口,图片识别接口,保存接口,退出登录;
实现思路
-
初始化数据:准备测试所需的数据,如用户名、密码、项目名称等,并存储在Excel文件中。
-
读取Excel数据:使用pandas或openpyxl库读取Excel文件中的测试数据。
-
编写核心脚本:封装发送HTTP请求、处理响应的逻辑。
-
编写测试用例:使用pytest编写针对每个接口的测试用例。
-
日志记录:使用logging库记录测试过程中的关键信息。
-
pytest配置文件:设置pytest的相关配置,如插件、命令行参数等。
-
生成测试报告:使用pytest插件(如pytest-html)生成测试报告。
-
入口函数:编写一个入口脚本,用于启动整个测试流程。
完整框架
要实现基于Python、requests、excel、pytest的接口自动化测试,我们需要按照以下步骤和框架进行:
2.1 初始化数据 (test_data.xlsx)
| TestID | TestCase | URL | Method | Headers | Body | ExpectedStatus | ExpectedResponse |
|--------|----------------|--------------------|--------|-----------|--------------------------|----------------|------------------|
| 1 | Login | /api/client/login | POST | ... | {'username': 'user1', ...} | 200 | {...} |
| 2 | CreateProject| /api/projects | POST | ... | {'project_name': 'proj1'} | 201 | {...} |
| 3 | ImportImage | /api/projects/{id}/images | POST | ... | {'image_file': 'path/to/image'} | 201 | {...} |
| 4 | RecognizeImage| /api/projects/{id}/images/{image_id}/recognize | GET | ... | | 200 | {...} |
| 5 | Save | /api/projects/{id} | PUT | ... | {'updated_data': ...} | 200 | {...} |
| 6 | Logout | /api/client/logout | POST | | | 200 | {...} |
2.2 核心脚本 (api_client.py)
import requests
import logging
# 定义APIClient类,用于封装API交互逻辑
class APIClient:
def __init__(self, base_url, username, password):
# 初始化时接收API的基础URL、用户名和密码
self.base_url = base_url
self.username = username
self.password = password
# 初始化token为None,登录成功后设置
self.token = None
# 初始化请求头,之后根据token进行更新
self.headers = {
}
# 创建一个requests会话对象,用于保持连接和cookie
self.session = requests.Session()
# 初始化日志系统
self.initialize_logging()
def initialize_logging(self):
# 配置基础的日志信息,设置日志级别和格式
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# 获取当前类的日志器
self.logger = logging.getLogger(__name__)
def login(self):
"""
执行登录操作,获取token并保存到实例变量中
"""
# 登录API的URL
url = f"{
self.base_url}/login"
# 准备登录所需的payload
payload = {
'username': self.username, 'password': self.password}
# 发送POST请求进行登录
response = self.session.post(url, json=payload)
# 检查响应状态码
if response.status_code == 200:
# 提取token并保存到实例变量
self.token = response.json().get('token')