在接口自动化测试中,提高效率通常涉及减少重复代码、增加测试的可维护性和重用性,以及充分利用现有工具和框架。以下是一些关键场景及其示例代码,展示如何在Python中实现高效的接口自动化测试。为了简化,我们将使用requests库来处理HTTP请求,请确保已安装此库。

1. 使用Session对象减少请求延迟

场景: 重复使用Session对象以减少每次请求的连接时间。


  1. import requests

  2. def test_api_with_session():

  3. session = requests.Session()

  4. response = session.get('https://api.example.com/users')

  5. assert response.status_code == 200, f"Failed with status code {response.status_code}"

  6. # 更多请求可以使用同一个session...

  7. # 调用示例

  8. # test_api_with_session()

  9. # 预期输出: 成功状态码200或错误信息

2. 参数化测试

场景: 使用参数化运行相同测试逻辑但不同的输入。

  1. import pytest

  2. from requests import get

  3. @pytest.mark.parametrize("endpoint", ['/users', '/posts', '/comments'])

  4. def test_endpoints(endpoint):

  5. response = get(f"https://api.example.com/{endpoint}")

  6. assert response.status_code == 200, f"{endpoint} failed with status {response.status_code}"

  7. # 调用示例 (需要pytest框架)

  8. # pytest -v test_script.py

  9. # 预期输出: 各个endpoint的测试结果

3. 依赖注入模拟

场景: 在测试中模拟外部依赖,避免真实调用。

  1. def test_api_with_mock(mock_get):

  2. mock_get.return_value.status_code = 200

  3. response = requests.get('https://api.example.com/users')

  4. assert response.status_code == 200

  5. # 使用unittest.mock或pytest-mock进行模拟

  6. # 示例未包含完整mock设置,仅展示思路

4. 异常处理

场景: 确保接口正确处理异常情况。

  1. def test_error_handling():

  2. try:

  3. response = requests.get('https://api.example.com/users/99999') # 故意请求不存在的用户

  4. assert response.status_code != 404, "Expected 404 for non-existent user"

  5. except requests.exceptions.RequestException as e:

  6. print(f"Request failed: {e}")

  7. # 调用示例

  8. # test_error_handling()

  9. # 预期输出: 404错误或请求失败信息

5. 使用Fixture共享测试资源

场景: 利用pytest Fixtures来共享初始化和清理资源。

  1. import pytest

  2. @pytest.fixture

  3. def auth_token():

  4. # 获取或模拟一个认证令牌

  5. return "mock-token"

  6. def test_protected_api(auth_token):

  7. headers = {'Authorization': f'Bearer {auth_token}'}

  8. response = requests.get('https://api.example.com/protected', headers=headers)

  9. assert response.status_code == 200

  10. # pytest -v test_script.py

  11. # 预期输出: 成功状态码或错误信息

6. 并发测试

场景: 模拟多用户并发访问以测试接口性能。

  1. import concurrent.futures

  2. def concurrent_requests():

  3. urls = ['https://api.example.com/user/1', 'https://api.example.com/user/2']

  4. with concurrent.futures.ThreadPoolExecutor() as executor:

  5. results = list(executor.map(requests.get, urls))

  6. for resp in results:

  7. assert resp.status_code == 200, f"Failed with status {resp.status_code}"

  8. # 调用示例

  9. # concurrent_requests()

  10. # 预期输出: 多个请求的成功或失败状态

7. 数据驱动测试

场景: 使用外部数据文件(如CSV、JSON)驱动测试。


  1. import csv

  2. import requests

  3. def test_with_csv_data(filename):

  4. with open(filename, newline='') as csvfile:

  5. reader = csv.reader(csvfile)

  6. next(reader) # Skip header

  7. for row in reader:

  8. url, expected_status = row

  9. response = requests.get(url)

  10. assert response.status_code == int(expected_status), f"{url} failed"

  11. # 调用示例

  12. # test_with_csv_data('testdata.csv')

  13. # 预期输出: 每个URL的测试结果

8. 响应验证

场景: 不仅验证状态码,还验证响应体中的具体数据。


  1. def test_response_content():

  2. response = requests.get('https://api.example.com/users/1')

  3. data = response.json()

  4. assert response.status_code == 200

  5. assert data['id'] == 1, "Incorrect user ID returned"

  6. # 更多验证...

  7. # 调用示例

  8. # test_response_content()

  9. # 预期输出: 验证成功或失败信息

9. 基于条件的测试

场景: 根据环境变量或配置决定是否执行某些测试。

  1. import os

  2. def test_optional_feature():

  3. if os.getenv('ENABLE_FEATURE_X', 'false').lower() == 'true':

  4. response = requests.post('https://api.example.com/feature_x')

  5. assert response.status_code == 201, "Feature X failed"

  6. # 调用示例

  7. # 设置环境变量 ENABLE_FEATURE_X=true 后运行测试

  8. # 预期输出: 成功或跳过测试的提示

10. 定时任务自动化

场景: 定时执行接口测试,如夜间自动回归测试。

  1. import schedule

  2. import time

  3. def run_daily_tests():

  4. # 包含所有测试函数的调用

  5. test_api_with_session()

  6. test_endpoints() # 假设已经定义好pytest相关函数

  7. # 其他测试...

  8. schedule.every().day.at("00:00").do(run_daily_tests) # 每天凌晨执行

  9. while True:

  10. schedule.run_pending()

  11. time.sleep(60) # 每分钟检查一次

  12. # 实际部署时,此代码块应运行在一个长期运行的进程或服务器上

  13. # 预期输出: 日志记录每天的测试结果

这些示例涵盖了接口自动化测试中提高效率和可维护性的多种策略,包括代码复用、参数化、异常处理、并发测试、数据驱动等。在实际应用中,还需要结合具体的测试框架和工具进行调整和完善。

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐