2

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

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

在实践中,它看起来像:

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

4

1 回答 1

11

是的,你可以,而且很简单。在您拥有功能文件的同一目录中,您可以创建一个名为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 之后运行时,它会看到 的值1context.foo因为 Behave 将删除功能 A 所做的更改(功能 A 所做的更改被“限定”到功能 A。)现在,您必须记住 Python 是如何存储的价值观。如果钩子设置context.foo = []并且功能 A设置context.foo.append(1),那么功能 B 将看到context.foo具有值[1],因为context.foo包含对数组的引用并且调用append会更改数组本身. 因此,可以解决范围界定问题。但是,这仍然是不可取的。

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

于 2015-09-30T10:31:54.777 回答