Python在功能之间共享数据

时间:2015-09-30 08:38:37

标签: python bdd python-behave

我从Python Behave开始,因为我想做一个API测试的事情 目前我偶然发现了一些可能甚至无效的问题,但问题是:我可以在功能之间共享数据吗?我可以将一些存储在数据库或文件中,但也许有“内置”的东西?

或者这是无效的,我不应该分享这样的数据,或者可能在功能内部?

在实践中它看起来像:

我必须向端点发出请求,在响应中我得到一个需要进行另一个需要测试的请求的数字。

1 个答案:

答案 0 :(得分:7)

是的,你可以,这是微不足道的。在具有功能文件的同一目录中,您可以创建名为environment.py的文件。在其中,你可以把:

def before_all(context):
    context.db = whatever

before_all挂钩在所有测试之前运行,并且您设置的任何内容都可用于所有功能。例如,我使用它来创建一个新的Selenium实例,该实例将被测试套件中的所有测试使用。上面的context.db可以是数据库连接。这种分享很好。

您分享的内容应该是只读的,或者可以在测试之间重置为已知状态。在测试之间共享可写资源不是一个好习惯。当测试失败并且测试依赖于彼此时,很难弄清楚出了什么问题。因此,如果你在测试C上出现故障,但它依赖于A和B,你不能只要求Behave运行测试C.你必须要求它运行A,B然后运行C.

如果您决定违反最佳做法并且无论如何都要这样做,您应该知道context上设置的新值是按功能和方案确定的。因此,如果您的before_all挂钩设置context.foo = 1,然后功能A设置context.foo = 2。当功能B在功能A之后运行时,它会看到1的值context.foo,因为Behave将删除功能A所做的更改(功能A所做的更改是"范围&#34功能A.)现在,您必须记住Python如何存储值。如果挂钩设置context.foo = []而功能A设置为context.foo.append(1),则功能B会看到context.foo的值为[1],因为context.foo包含参考到数组并调用append更改数组本身。因此可以解决范围问题。但这仍然是不可取的。

最后我检查过,功能按字母顺序运行。您可以通过在命令行上指定功能来强制执行订单:behave B.feature A.feature