顶部右侧自定义内容
顶部左侧自定义内容
当前位置:首页 > 我的文章 > 正文

python接口自动化测试攻略

作者:neal发布时间:2025-04-24 20:22分类: 我的文章 浏览:227评论:0


导读:以下是Python接口自动化测试的完整攻略,涵盖工具选择、框架设计、最佳实践和代码示例,帮助你快速上手接口自动化测试。 一、核心工具与库 HTTP请求库 Requests:...

以下是Python接口自动化测试的完整攻略,涵盖工具选择、框架设计、最佳实践和代码示例,帮助你快速上手接口自动化测试。


一、核心工具与库

  1. HTTP请求库

    • Requests:简洁易用的HTTP库,处理接口请求
    import requests
    response = requests.get("https://api.example.com/data")
  2. 测试框架

    • unittest:Python内置单元测试框架
    • pytest:更灵活的测试框架,支持参数化和插件
    # pytest示例
    def test_api_status_code():
       response = requests.get("https://api.example.com/health")
       assert response.status_code == 200
  3. 数据驱动测试

    • ddt (Data-Driven Tests) 或 pytest参数化
    # pytest参数化
    import pytest
    @pytest.mark.parametrize("user_id, expected_code", [(1, 200), (999, 404)])
    def test_get_user(user_id, expected_code):
       response = requests.get(f"https://api.example.com/users/{user_id}")
       assert response.status_code == expected_code
  4. 测试报告

    • Allure:生成美观的HTML报告
    • HTMLTestRunner:传统HTML报告生成器

二、接口自动化测试框架设计

1. 目录结构

project/
├── config/           # 配置文件
│   └── settings.py
├── testcases/        # 测试用例
│   └── test_api.py
├── utils/            # 工具类
│   ├── logger.py     # 日志管理
│   └── request_util.py  # 封装Requests
├── data/             # 测试数据(JSON/YAML)
├── reports/          # 测试报告
└── conftest.py       # pytest全局配置

2. 封装请求工具

# utils/request_util.py
import requests

class RequestUtil:
    def __init__(self, base_url="https://api.example.com"):
        self.base_url = base_url
        self.session = requests.Session()

    def send_request(self, method, endpoint, params=None, data=None, headers=None):
        url = f"{self.base_url}/{endpoint}"
        response = self.session.request(method, url, params=params, json=data, headers=headers)
        response.raise_for_status()  # 自动抛出HTTP错误
        return response.json()

三、实战案例:用户登录与数据查询

1. 编写测试用例

# testcases/test_user_api.py
import pytest
from utils.request_util import RequestUtil

@pytest.fixture(scope="module")
def api_client():
    return RequestUtil(base_url="https://api.example.com")

def test_login(api_client):
    """测试登录获取Token"""
    payload = {"username": "testuser", "password": "securepass"}
    response = api_client.send_request("POST", "login", data=payload)
    assert "token" in response
    return response["token"]

@pytest.mark.usefixtures("test_login")
def test_get_user_profile(api_client, test_login):
    """测试获取用户信息"""
    headers = {"Authorization": f"Bearer {test_login}"}
    response = api_client.send_request("GET", "user/profile", headers=headers)
    assert response["username"] == "testuser"
    assert "email" in response

2. 执行测试

# 运行测试并生成Allure报告
pytest testcases/ --alluredir=./reports
allure serve ./reports

四、最佳实践

  1. 环境隔离

    • 使用 pytest-base-url管理不同环境(开发/测试/生产)
    pytest --base-url https://dev-api.example.com
  2. 数据管理

    • 使用YAML/JSON文件存储测试数据
    # data/login_cases.yaml
    - case: valid_login
     input: {username: "user1", password: "Pass123"}
     expected: {status: 200, has_token: true}
    - case: wrong_password
     input: {username: "user1", password: "wrong"}
     expected: {status: 401}
  3. 认证处理

    • 自动处理Token刷新(通过 pytest fixture)
    @pytest.fixture(scope="session")
    def auth_token(api_client):
       # 获取并缓存Token
       return api_client.login()
  4. 异常处理

    • 捕获并记录接口异常
    def send_request(self, method, endpoint, **kwargs):
       try:
           response = self.session.request(method, url, **kwargs)
           response.raise_for_status()
       except requests.exceptions.HTTPError as e:
           logger.error(f"API请求失败: {str(e)}")
           raise

五、高级技巧

  1. Mock服务

    • 使用 responsespytest-mock模拟接口响应
    import responses
    
    @responses.activate
    def test_mock_api():
       responses.add(
           responses.GET, "https://api.example.com/data",
           json={"data": "mocked"}, status=200
       )
       response = requests.get("https://api.example.com/data")
       assert response.json()["data"] == "mocked"
  2. 性能测试集成

    • 使用 locust进行简单压力测试
    from locust import HttpUser, task
    
    class ApiUser(HttpUser):
       @task
       def test_login(self):
           self.client.post("/login", json={"username":"test", "password":"test"})

六、持续集成(CI/CD)

  1. GitHub Actions配置示例
    name: API Tests
    on: [push]
    jobs:
     test:
       runs-on: ubuntu-latest
       steps:
       - uses: actions/checkout@v2
       - name: Run Tests
         run: |
           pip install -r requirements.txt
           pytest --alluredir=./reports
       - name: Upload Report
         uses: actions/upload-artifact@v2
         with:
           name: allure-report
           path: ./reports

通过以上方案,你可以快速构建可维护的Python接口自动化测试框架。关键点:清晰的架构设计、数据驱动测试、合理的异常处理、与CI/CD的集成。

标签:


发表评论: