在使用vcr的python单元测试中,我们可以使用一个函数来生成不同的磁带文件吗?

时间:2013-07-31 02:18:57

标签: python vcr

vcrpy是python记录/播放包,下面是指南的常用方法

class TestCloudAPI(unittest.TestCase):
    def test_get_api_token(self):
        with vcr.use_cassette('fixtures/vcr_cassettes/test_get_api_token.yaml'): 
            # real request and testing

    def test_container_lifecycle(self):
        with vcr.use_cassette('fixtures/vcr_cassettes/test_container_lifecycle.yaml'):

我想要有不同的记录文件,所以我必须在每种方法中重复这一点。

是否可以在某处使用一行来简化:

TEST_CASE_VCR(USE_METHOD_AS_FILENAME)
class TestCloudAPI(unittest.TestCase):
    def test_get_api_token(self):
        # real request and testing
    def test_container_lifecycle(self):

3 个答案:

答案 0 :(得分:1)

vcrpy的新版本现在通过完全省略卡带名称来支持此功能。从文档中:

  

VCR.py现在允许省略use_cassette函数的path参数。以下两项现在都合法/应该可以使用

@my_vcr.use_cassette
def my_test_function():
...
  

在两种情况下,VCR.py都将使用从提供的测试功能名称生成的路径。如果不   设置了cassette_library_dir,卡带将位于目录中具有测试功能名称的文件中   声明测试功能的文件的名称。如果已经设置了cassette_library_dir,则卡带   将会显示在该目录的带有修饰功能名称的文件中。

     

可以通过自定义   path_transformer和func_path_generator vcr变量

答案 1 :(得分:0)

当前内置于录像机的功能尚无法完成此功能,但您可以制作自己的功能。 Check out the decorator that Venmo created.

答案 2 :(得分:0)

使用vcrpy-unittest可以轻松实现这一点,正如您可能猜到的那样,vcrpyunittest之间的整合。

你的例子变成了这个:

from vcr_unittest import VCRTestCase

class TestCloudAPI(VCRTestCase):
    def test_get_api_token(self):
        # real request and testing

    def test_container_lifecycle(self):
        # real request and testing

并根据测试自动命名磁带并将其保存在测试文件旁边的cassettes目录中。例如,这会创建两个文件:cassettes/TestCloudAPI.test_get_api_token.yamlcassettes/TestCloudAPI.test_container_lifecycle.yaml

可以通过覆盖几个方法来自定义目录和命名:_get_cassette_library_dir_get_cassette_name,但可能没有必要。

vcrpy-unittest位于https://github.com/agriffis/vcrpy-unittest的github和https://pypi.python.org/pypi/vcrpy-unittest处的PyPI