探索 Python 库:使用 VCR.py 加速 HTTP 测试
介绍
在现实世界中,编写包含 HTTP 请求的单元测试和集成测试可能充满危险。缓慢且不确定的测试可能是常态。如何在 Python 应用或服务中为 HTTP 请求编写确定性、可重复的测试?如何离线运行这些相同的测试?
VCR.py 就是答案。
VCR.py 库记录单元测试中发出的 HTTP 请求的响应。第一次使用 VCR.py 运行测试与之前的任何运行类似。但在 VCR.py 运行一次并记录后,所有后续测试都是:
- 快!测试中不再需要等待缓慢的 HTTP 请求和响应。
- 确定性。由于测试是根据之前记录的响应进行的,因此每个测试都是可重复的。
- 支持离线!现在每个测试都可以离线运行。
在以下部分中,您将了解如何开始使用 VCR.py 以及如何使用其 API 来实现上述好处。
安装
VCR.py 需要 Python 3.5 或更高版本,可使用pip下载。
要使用pip安装 VCR.py ,您可以运行以下命令:
pip install vcrpy
下载库后,您可以导入它并开始创建 VCR.py 称为“磁带”的录音。VCR.py 主要通过@vcr装饰器工作。您可以通过以下方式导入此装饰器:import vcr。
编写 HTTP 单元测试
安装并导入库后,您现在可以开始在单元测试中捕获 HTTP 请求。每次 VCR.py 捕获单元测试时,它都会创建一个磁带。磁带是一个.yaml文件,VCR.py 使用它来记录来自 HTTP 请求的响应元数据。您可以像这样创建一个基本的磁带:
import vcr
import requests
import unittest
class GoogleTest(unittest.TestCase):
@vcr.use_cassette('fixtures/cassettes/google_get.yaml')
def test_get_google_home_page(self):
response = requests.get('https://google.com')
self.assertEqual(response.status_code, 200)
安装“requests”库后,您可以通过以下命令使用 unittest 执行上述测试:
python -m unittest ./path/to/unit/test/file.py
上述测试第一次在我的计算机上运行,大约 0.5 秒内完成,google_get.yaml盒式磁带在装置目录中创建。但是,第二次运行此测试时,它在 0.03 秒内完成 - 比原始测试快 16 倍。然而,这是一个人为的例子。Google 主页从一开始就是一个非常快的 GET 请求。但我相信你可以看到 VCR.py 如何使单元测试更快。当您的单元测试包含许多可能比前面的示例慢得多的 HTTP 请求时,主要的速度优势就会实现。
记录模式
VCR.py 有四种录制模式。这些包括:
- 一次
- 新剧集
- 没有任何
- 全部
这些录制模式告诉 VCR.py 如何录制其磁带(如果有的话)。第一种录制模式once是默认模式。在此模式下,第一次运行单元测试时,VCR.py 将记录其中的 HTTP 请求并创建磁带。之后每次,VCR.py 都会根据创建的磁带验证测试,如果不存在磁带,则创建新的磁带。在此模式下,如果 VCR.py 捕获无法根据现有磁带验证的 HTTP 请求,也会抛出错误。
第二种模式new_episodes建立在第一种模式的基础上,当检测到新的 HTTP 请求时,它将阻止抛出任何错误。相反,这种模式将只记录新请求并更新现有的磁带。
none录制模式与第一种模式完全相同,只是它要求有一个现有的磁带。这种录制模式与once一样,将确保不会发出新的请求。
全部录制模式基本上告诉 VCR.py 始终创建新的磁带。使用此录制模式,您将失去 VCR.py 的大部分好处,因此请谨慎使用!此录制模式的主要好处是暂时的。当您想强制 VCR.py 重建特定磁带时,它很有用。
您可以使用@vcr装饰器的record_mode命名参数来设置单元测试的录制模式,如下所示:
@vcr.use_cassette('fixtures/cassettes/google_get.yaml', record_mode='all')
结论
在本指南中,您深入了解了 VCR.py 库。您了解了如何使用 VCR.py 让您的 Python 测试可重复、离线且快速!您了解了 VCR.py 提供的不同记录模式以及如何使用它们编写单元测试。有关更多信息(包括高级用法),请查看 VCR.py文档。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~