对于多个场景,我只想在每个 cucumber 特征文件中执行一次后台。我如何在STEP文件中做到这一点?
功能:用户可以验证.....
背景:给定输入特定逻辑的测试数据
场景:验证.....当A1和B1然后是C1时为1
场景:验证.....2当A2和B2然后是C2时
场景:验证.....2当A3和B3,然后是C3
kmbjn2e31#
测试应该隔离。这就是 cucumber 的设计方式,这是有充分理由的。除非你迫不得已,否则我会强烈反对。
如果您有一些东西需要在整个测试套件之前执行,可以考虑使用@BeForeAll挂钩。
这就是说,我以前遇到过这种情况。我们有一些测试,这些测试将启动一个耗时很长的过程(例如,配置一个VM,一次需要10分钟……),但如果已经完成,则可以在其他测试中跳过。
因此,您可能希望按照以下思路设计步骤。
“鉴于……X已经完成了。”
并在步骤中检测X是否已完成,如果未完成,则执行X。如果已完成,则跳过。例如,假设创建用户是一个绝对需要很长时间的过程。然后我们就可以做..。
Given that user "Joe Bloggs" has been created
步骤定义将首先尝试确定Joe是否存在,如果不存在,则创建用户。您有一个初始启动问题,但随后其他测试将能够安全地假定Joe存在。
为什么不应该这样做
如果这样做,您的测试很有可能会相互冲突。
假设您有很多使用Joe Bloggs用户的测试。也许有些人会把他从系统中删除。有些用户可能会暂时停用用户、添加角色、更改名称。各种各样的事情。所有测试都假定它们正在测试的系统的某些方面,而您正在故意损害您的测试对环境的假设。
如果您正在运行并行测试,则情况尤其糟糕。也许您的系统有限制,一次只能有一个人以Joe的身份登录。或者,每个测试都在改变有关Joe的大量内容,并且没有一个测试可以假定Joe用户的任何状态。那你就会陷入一片混乱。
最好的解决方案通常是为您运行的每个测试创建全新的数据。打开这些API并为每次测试运行创建可处理的数据。这里有一篇很好的博客文章:https://opencredo.com/test-automation-concepts-data-aliases/
5sxhfpxr2#
后台设计为每次在每个方案之前运行。黑背景也不好,也不标准。
xxslljrj3#
如果您希望后台只运行一次。您可以使用示例变量ex,i==0添加条件,然后在方法的末尾执行逻辑并递增i。
对于下一个场景,i值为1,不等于0,则不会执行该逻辑。
new9mtju4#
我们有类似的问题,无法为多个场景的后台找到任何解决方案。后台被设计为在它将运行后台的每个方案之后为所有方案运行。如果您在Scenario中有示例,在本例中,它将在每个示例之后运行。
我们不得不选择解决这个问题。
1)使用了junit的@BeForeClass Annotation 2)Create Setup Scenario,它总是首先执行。
例如:在API测试中,您登录一次,每次都使用该会话访问其他API
功能:在客户以系统管理员身份登录的情况下设置数据
在第一个场景之后,它将执行所有场景,您不需要使用后台。
我想说,每次使用后台时,它必须是业务需求的一部分,否则它将创建不需要的测试数据并加载到测试环境中,并可能导致测试执行时间变慢。
如果你找到其他解决方案,请告诉我。
jc3wubiy5#
也可以在每个场景集或*场景大纲之前运行一些步骤(背景),方法是创建一个Tagging@BEFORE**方法并传递一个场景对象作为参数。在之前的方法中,仅当方案名称与上一个方案不同时才执行您的逻辑。
以下是你如何做到这一点:
Feature:Setup Data Given Customer logs in as System Admin @BeforeMethodName Scenario Outline: Verify ......... 1 When <Variable1> And <Variable2> Then <Variable3> Examples: | Variable1 | Variable2 | Variable3 | | A1 | B1 | C1 | | A2 | B2 | C2 | | A3 | B3 | C3 | | A4 | B4 | C4 | @BeforeMethodName Scenario Outline: Verify ......... 2 When <Variable1> And <Variable2> Then <Variable3> Examples: | Variable1 | Variable2 | Variable3 | | X1 | Y1 | Z1 | | X2 | Y2 | Z2 | | X3 | Y3 | Z3 | | X4 | Y4 | Z4 |
并将@BeForeMethodName定义如下:
private static String scenarioName = null; public className BeforeMethodName(Scenario scene) { if(!scene.getName().equals(scenarioName)) { // Implement your logic scenarioName = scene.getName() } return this; }
这样,在每个场景之前都会调用BeForeMethodName,但每个场景大纲只执行一次逻辑。
uidvcgyl6#
我们可以在单个功能文件中同时包含场景和场景大纲。在此情况下,场景将仅运行一次,并且场景大纲将基于示例表中给出的数据运行
dxxyhpgq7#
如前所述, cucumber 应该只用于构建代码结构。
您可以使用带标记的挂钩来创建在测试子集上使用的项目。此外,您可以将代码隔离到Helper中,然后在Ruby步骤中有条件地调用这些Helper。
可能需要更清楚一点才能做出判断
7条答案
按热度按时间kmbjn2e31#
测试应该隔离。这就是 cucumber 的设计方式,这是有充分理由的。除非你迫不得已,否则我会强烈反对。
如果您有一些东西需要在整个测试套件之前执行,可以考虑使用@BeForeAll挂钩。
这就是说,我以前遇到过这种情况。我们有一些测试,这些测试将启动一个耗时很长的过程(例如,配置一个VM,一次需要10分钟……),但如果已经完成,则可以在其他测试中跳过。
因此,您可能希望按照以下思路设计步骤。
“鉴于……X已经完成了。”
并在步骤中检测X是否已完成,如果未完成,则执行X。如果已完成,则跳过。例如,假设创建用户是一个绝对需要很长时间的过程。然后我们就可以做..。
Given that user "Joe Bloggs" has been created
步骤定义将首先尝试确定Joe是否存在,如果不存在,则创建用户。您有一个初始启动问题,但随后其他测试将能够安全地假定Joe存在。
为什么不应该这样做
如果这样做,您的测试很有可能会相互冲突。
假设您有很多使用Joe Bloggs用户的测试。也许有些人会把他从系统中删除。有些用户可能会暂时停用用户、添加角色、更改名称。各种各样的事情。所有测试都假定它们正在测试的系统的某些方面,而您正在故意损害您的测试对环境的假设。
如果您正在运行并行测试,则情况尤其糟糕。也许您的系统有限制,一次只能有一个人以Joe的身份登录。或者,每个测试都在改变有关Joe的大量内容,并且没有一个测试可以假定Joe用户的任何状态。那你就会陷入一片混乱。
最好的解决方案通常是为您运行的每个测试创建全新的数据。打开这些API并为每次测试运行创建可处理的数据。这里有一篇很好的博客文章:https://opencredo.com/test-automation-concepts-data-aliases/
5sxhfpxr2#
后台设计为每次在每个方案之前运行。黑背景也不好,也不标准。
xxslljrj3#
如果您希望后台只运行一次。您可以使用示例变量ex,i==0添加条件,然后在方法的末尾执行逻辑并递增i。
对于下一个场景,i值为1,不等于0,则不会执行该逻辑。
new9mtju4#
我们有类似的问题,无法为多个场景的后台找到任何解决方案。后台被设计为在它将运行后台的每个方案之后为所有方案运行。如果您在Scenario中有示例,在本例中,它将在每个示例之后运行。
我们不得不选择解决这个问题。
1)使用了junit的@BeForeClass Annotation 2)Create Setup Scenario,它总是首先执行。
例如:在API测试中,您登录一次,每次都使用该会话访问其他API
功能:在客户以系统管理员身份登录的情况下设置数据
场景:验证.....当A1和B1然后是C1时为1
场景:验证.....2当A2和B2然后是C2时
场景:验证.....2当A3和B3,然后是C3
在第一个场景之后,它将执行所有场景,您不需要使用后台。
我想说,每次使用后台时,它必须是业务需求的一部分,否则它将创建不需要的测试数据并加载到测试环境中,并可能导致测试执行时间变慢。
如果你找到其他解决方案,请告诉我。
jc3wubiy5#
也可以在每个场景集或*场景大纲之前运行一些步骤(背景),方法是创建一个Tagging@BEFORE**方法并传递一个场景对象作为参数。在之前的方法中,仅当方案名称与上一个方案不同时才执行您的逻辑。
以下是你如何做到这一点:
并将@BeForeMethodName定义如下:
这样,在每个场景之前都会调用BeForeMethodName,但每个场景大纲只执行一次逻辑。
uidvcgyl6#
我们可以在单个功能文件中同时包含场景和场景大纲。在此情况下,场景将仅运行一次,并且场景大纲将基于示例表中给出的数据运行
dxxyhpgq7#
如前所述, cucumber 应该只用于构建代码结构。
您可以使用带标记的挂钩来创建在测试子集上使用的项目。此外,您可以将代码隔离到Helper中,然后在Ruby步骤中有条件地调用这些Helper。
可能需要更清楚一点才能做出判断