pytest-bdd:如何从@given获取当前场景?

时间:2016-10-31 14:06:21

标签: python pytest

我需要在@given方法中获取有关当前运行测试的方案名称或其他独特信息。

在我的测试中,我声明,我有一些资源。正在从web api中提取/创建此资源,如下所示:

@given('I have a new article')
def new_article(vcr_fixture):
    with vcr_fixture.use_cassette('new_article'):  # I need to use different cassette name for different scenarios 
        return create_new_article()

这里的问题是我可以有多个具有不同参数的场景,我想多次使用相同的资源。在这种情况下,我需要为每种情况使用不同的磁带。我无法使用这些参数来区分磁带,因为它们可以在创建资源之后应用(例如,添加注释)。 我试图向@given夹具添加请求,但无法在其中找到任何唯一信息。

2 个答案:

答案 0 :(得分:0)

要检查您的方案名称,您可以使用解析器。

from pytest_bdd import parsers
...

@given(parsers.parse('I have a {article_name}')
def new_article(vcr_fixture, article_name):
    with vcr_fixture.use_cassette(article_name):        
        return create_new_article()

不确定这是否能回答你的问题,但是..

答案 1 :(得分:0)

n尽管user2292262所建议的有效,但它并不像开始学习pytest-bdd时所期望的那样有效(至少至少是我所期望的)。

解决方案AIUI会为测试中的每篇文章创建一个夹具,而不会自动执行(即为您动态创建所需数据的函数)。

在测试上下文中,这应该是合理可行的,因为您拥有的数据集不是真实的数据集,而是子集,并且您拥有作为先决条件(给定动词)的数据应该更少。 您可以考虑使用脚本填充灯具,方法是查询数据库并相应地编写模板文件。

@given(parsers.parse('I have an article called foo')
def article_foo(vcr_fixture):
    with vcr_fixture.use_cassette('foo'):
         return create_new_article()

@given(parsers.parse('I have an article called bar')
def article_bar(vcr_fixture):
    with vcr_fixture.use_cassette('bar'):
         return create_new_article()


etc.

其他解决方案的“工厂”代码中的问题

@given(parsers.parse('I have a {article_name}')
def new_article(vcr_fixture, article_name):
    with vcr_fixture.use_cassette(article_name):        
         return create_new_article()

是您仍然很想将其用作

Given I have an article called Foo
And I have an article called Bar
When I edit Foo
Then Bar is untouched

但是这种情况不起作用,因为您实际上在窗帘下两次使用相同的灯具,但是使用了不同的“内容”

换句话说,使用该代码,有人将为两个“数据”实例“ new_article”。这违背了pytest的喜好。

从纯粹的角度来看,BDD中的给定动词应该是事实,而不是构成事实的事物。