Python在功能之间共享数据

McA*_*bra 0 python bdd python-behave

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

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

在实践中它看起来像:

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

Lou*_*uis 7

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

def before_all(context):
    context.db = whatever
Run Code Online (Sandbox Code Playgroud)

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所做的更改是"作用域"到特征A.)现在,您必须记住Python如何存储值.如果钩子集context.foo = []和特征A有context.foo.append(1),那么特征B将看到它context.foo具有值,[1]因为context.foo包含对数组的引用并且调用append更改了数组本身.因此可以解决范围问题.但这仍然是不可取的.

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