在行为python中定义上下文变量

Fed*_*tro 7 python testing contextmanager python-behave

有时,您需要动态定义值(如现在的datetime,随机字符串,随机整数,文件内容等),并在不同的步骤中使用它们,而不是显式或硬编码值.

所以,我的问题是如何在步骤中定义变量(正确的方法)在以下步骤中使用这些变量.

一些例子

Given A random string of length "100" as "my_text"
And I log in to my platform
And I ask to add the following post:
 | title                    | description |
 | Some example of title    | {{my_text}} |
When I submit the post form
Then The posts table shows these posts:
 | title                    | description |
 | Some example of title    | {{my_text}} |
And I delete any post containing in the description "{{my_text}}"
Run Code Online (Sandbox Code Playgroud)

这是一个基本的例子,试图解释为什么我想在步骤中定义变量并将它们保存在上下文中以便在以下步骤中使用它.

我的想法是修改before_step和after_step方法......在上下文中设置一个变量来存储我的自定义变量,如下所示:

def before_step(context):
    if not hasattr(context, 'vars'):
       context.vars = {}

    if hasattr(context, table) and context.table:
       parse_table(context)

def parse_table(context):
    # Here use a regex to check each cell and look for `"{{<identifier>}}"` and if match, replace the cell value by context.vars[identifier] so the step "the posts table shows these posts will never know what is `{{my_text}}` it will be abstract seeing the random string.
Run Code Online (Sandbox Code Playgroud)

场景大纲,使用类似这样的定义变量"<some_identifier>",然后为每个示例替换步骤中的值.

它基本上是为了重现行为,但对于任何类型的步骤,简单或使用表格.

做这样的事情是正确的方法吗?

Mur*_*eng 0

要回答这个问题,需要注意:

  • 测试数据是否需要外部控制?例如,可以从命令行输入测试数据,以便可以明确地选择值。

如果答案是否定的,那么我们可能不应该在功能文件中对任何内容进行硬编码。我们可以保留一步中生成的数据,将其保存在上下文中,并在后续的任何步骤中再次访问。

我能想到的例子与问题描述的完全一样。我们关心我们生成、发布和验证的随机文本内容是什么吗?可能不会。那么我们不应该向用户公开这样的细节(即功能文件),因为它对于我们正在测试的行为并不重要。

如果答案是肯定的,我们确实需要一些技巧来实现它。我正在经历这样一个案例。我想要的是在运行测试时更改测试数据,这样我就不必像在表或场景大纲中那样在功能文件中对它们进行硬编码。我怎样才能做到这一点?

我可以在命令行中使用 -D 选项来传入尽可能多的用户数据,然后可以在任何步骤中在 context.config.userdata 字典中访问这些数据。如果测试数据的数量非常有限。这种方法是一种简单的方法。但如果测试数据集包含很多数据,而无需在命令行中一一键入,则可以将其存储在外部,例如,节名称为 testdata_1...testdata_n 的 ini 文件,从而可以传递一个字符串来自命令行,用于寻址此配置文件中的节名称。并且测试数据可以在before_all、before_scenario等中读出,并在所有步骤中使用。