Python vcrpy库:HTTP请求记录和重放

9c50ad950dfaecae6ffc76de314395d2.png

更多Python学习内容:ipengtao.com

vcrpy是一个用于记录和重放HTTP交互的Python库。它允许开发者在进行测试时记录下HTTP请求和响应,并在后续的测试中重放这些记录,避免了对实际服务器的依赖,提高了测试的可靠性和速度。vcrpy支持多种HTTP库,如requests、http.client、urllib等,并且能够无缝集成到常见的测试框架中,如unittest和pytest。本文将详细介绍vcrpy库的安装、主要功能、基本操作、高级功能及其实践应用,并提供丰富的示例代码。

安装

vcrpy可以通过pip进行安装。确保Python环境已激活,然后在终端或命令提示符中运行以下命令:

pip install vcrpy

主要功能

  1. 记录HTTP请求和响应:自动记录HTTP请求和响应,并保存为YAML文件。

  2. 重放记录的HTTP交互:在后续的测试中重放记录的HTTP交互,避免对实际服务器的依赖。

  3. 支持多种HTTP库:支持requests、http.client、urllib等常见的HTTP库。

  4. 集成测试框架:与unittest、pytest等测试框架无缝集成。

  5. 过滤敏感信息:支持过滤和替换请求和响应中的敏感信息。

基本操作

记录HTTP请求和响应

以下示例展示了如何使用vcrpy记录HTTP请求和响应:

import requests
import vcr

# 创建VCR对象
my_vcr = vcr.VCR(
    cassette_library_dir='cassettes',  # 录音带存放目录
    path_transformer=vcr.VCR.ensure_suffix('.yaml'),  # 确保录音带文件后缀为.yaml
    record_mode='once',  # 录制模式
)

# 记录HTTP请求和响应
with my_vcr.use_cassette('example'):
    response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
    print(response.json())

在第一次运行时,vcrpy会记录下HTTP请求和响应,并将其保存为cassettes/example.yaml文件。在后续运行时,将使用记录的响应,而不会再次发送请求到实际服务器。

重放记录的HTTP交互

在后续的测试中,vcrpy会自动重放记录的HTTP交互:

import requests
import vcr

# 创建VCR对象
my_vcr = vcr.VCR(
    cassette_library_dir='cassettes',
    path_transformer=vcr.VCR.ensure_suffix('.yaml'),
    record_mode='none',  # 仅重放录音带,不进行新的记录
)

# 重放记录的HTTP交互
with my_vcr.use_cassette('example'):
    response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
    print(response.json())

在unittest中使用vcrpy

以下示例展示了如何在unittest中使用vcrpy:

import unittest
import requests
import vcr

class TestAPI(unittest.TestCase):

    @vcr.use_cassette('cassettes/unittest_example.yaml')
    def test_get_post(self):
        response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
        self.assertEqual(response.status_code, 200)
        self.assertIn('title', response.json())

if __name__ == '__main__':
    unittest.main()

在pytest中使用vcrpy

以下示例展示了如何在pytest中使用vcrpy:

import requests
import vcr

my_vcr = vcr.VCR(
    cassette_library_dir='cassettes',
    path_transformer=vcr.VCR.ensure_suffix('.yaml'),
    record_mode='once',
)

@my_vcr.use_cassette('pytest_example.yaml')
def test_get_post():
    response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
    assert response.status_code == 200
    assert 'title' in response.json()

高级功能

过滤敏感信息

vcrpy允许过滤和替换请求和响应中的敏感信息。以下示例展示了如何过滤敏感信息:

import requests
import vcr

# 创建VCR对象,并过滤敏感信息
my_vcr = vcr.VCR(
    cassette_library_dir='cassettes',
    path_transformer=vcr.VCR.ensure_suffix('.yaml'),
    record_mode='once',
    filter_headers=['authorization'],  # 过滤请求头中的authorization字段
    filter_query_parameters=['api_key'],  # 过滤请求参数中的api_key字段
)

with my_vcr.use_cassette('filter_example.yaml'):
    response = requests.get('https://api.example.com/data', headers={'authorization': 'secret'})
    print(response.json())

自定义存储目录

可以自定义录音带的存储目录,以便更好地组织测试用例。以下示例展示了如何自定义存储目录:

import requests
import vcr

# 创建VCR对象,并自定义存储目录
my_vcr = vcr.VCR(
    cassette_library_dir='my_custom_cassettes',  # 自定义存储目录
    path_transformer=vcr.VCR.ensure_suffix('.yaml'),
    record_mode='once',
)

with my_vcr.use_cassette('custom_directory_example.yaml'):
    response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
    print(response.json())

使用不同的录制模式

vcrpy提供了多种录制模式,以下示例展示了如何使用不同的录制模式:

import requests
import vcr

# 使用不同的录制模式
my_vcr = vcr.VCR(
    cassette_library_dir='cassettes',
    path_transformer=vcr.VCR.ensure_suffix('.yaml'),
    record_mode='new_episodes',  # 仅当录音带不存在或请求未记录时录制
)

with my_vcr.use_cassette('record_mode_example.yaml'):
    response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
    print(response.json())

自定义匹配规则

vcrpy允许自定义匹配规则,以便更精确地匹配请求和响应。以下示例展示了如何自定义匹配规则:

import requests
import vcr

# 创建自定义匹配规则
def custom_matcher(r1, r2):
    return r1.method == r2.method and r1.uri == r2.uri

# 使用自定义匹配规则
my_vcr = vcr.VCR(
    cassette_library_dir='cassettes',
    path_transformer=vcr.VCR.ensure_suffix('.yaml'),
    record_mode='once',
    match_on=['uri', 'method', custom_matcher],  # 添加自定义匹配规则
)

with my_vcr.use_cassette('custom_matcher_example.yaml'):
    response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
    print(response.json())

实践应用

测试API集成

以下示例展示了如何使用vcrpy测试API集成:

import requests
import vcr
import unittest

class TestAPIIntegration(unittest.TestCase):

    @vcr.use_cassette('cassettes/api_integration.yaml')
    def test_get_user(self):
        response = requests.get('https://jsonplaceholder.typicode.com/users/1')
        self.assertEqual(response.status_code, 200)
        self.assertIn('name', response.json())

    @vcr.use_cassette('cassettes/api_integration.yaml')
    def test_get_posts(self):
        response = requests.get('https://jsonplaceholder.typicode.com/posts?userId=1')
        self.assertEqual(response.status_code, 200)
        self.assertIsInstance(response.json(), list)

if __name__ == '__main__':
    unittest.main()

测试第三方服务

以下示例展示了如何使用vcrpy测试与第三方服务的集成:

import requests
import vcr
import unittest

class TestThirdPartyService(unittest.TestCase):

    @vcr.use_cassette('cassettes/third_party_service.yaml')
    def test_send_email(self):
        response = requests.post('https://api.emailservice.com/send', json={
            'to': 'user@example.com',
            'subject': 'Test Email',
            'body': 'This is a test email.'
        })
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json()['status'], 'sent')

if __name__ == '__main__':
    unittest.main()

持续集成中的应用

以下示例展示了如何在持续集成环境中使用vcrpy:

# .github/workflows/test.yml
name: Run Tests

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: 3.8
    - name: Install dependencies
      run: |
        pip install -r requirements.txt
    - name: Run tests
      run: |
        pytest --vcr-record=none  # 确保仅重放录音带,不进行新的记录

总结

vcrpy库为Python开发者提供了一个功能强大且灵活的工具,用于记录和重放HTTP交互。通过其简洁的API和丰富的功能,用户可以轻松进行HTTP请求的记录和重放,提高测试的可靠性和速度。无论是在测试API集成、第三方服务还是在持续集成环境中,vcrpy都能提供强大的支持和便利。本文详细介绍了vcrpy库的安装、主要功能、基本操作、高级功能及其实践应用,并提供了丰富的示例代码。希望在实际项目中能够充分利用vcrpy库,提高HTTP请求处理和测试的效率和准确性。

如果你觉得文章还不错,请大家 点赞、分享、留言 ,因为这将是我持续输出更多优质文章的最强动力!

更多Python学习内容:ipengtao.com


如果想要系统学习Python、Python问题咨询,或者考虑做一些工作以外的副业,都可以扫描二维码添加微信,围观朋友圈一起交流学习。

c53ddbff797d24a54003154a95c5f29d.gif

我们还为大家准备了Python资料和副业项目合集,感兴趣的小伙伴快来找我领取一起交流学习哦!

fd43460ff76c5bd82bab033654b0e839.jpeg

往期推荐

Python 中的 iter() 函数:迭代器的生成工具

Python 中的 isinstance() 函数:类型检查的利器

Python 中的 sorted() 函数:排序的利器

Python 中的 hash() 函数:哈希值的奥秘

Python 中的 slice() 函数:切片的利器

Python 的 tuple() 函数:创建不可变序列

点击下方“阅读原文”查看更多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值