我从Python Behave开始,因为我想做一个API测试的事情 目前我偶然发现了一些可能甚至无效的问题,但问题是:我可以在功能之间共享数据吗?我可以将一些存储在数据库或文件中,但也许有“内置”的东西?
或者这是无效的,我不应该分享这样的数据,或者可能在功能内部?
在实践中它看起来像:
我必须向端点发出请求,在响应中我得到一个需要进行另一个需要测试的请求的数字。
答案 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