黄瓜 - 给予前提条件

时间:2018-03-08 23:04:23

标签: cucumber gherkin

大家好,

要继续订购产品方案,我应该登录,我问我是否可以在我的方案中使用以下步骤:

Scenario: Order product    
Given I log in
.
.

在定义类的步骤中,我将调用订单产品中的登录步骤:

@Given("^I log in$")
public void I_log_in(){
        Given(string.Format("I am on login page"));
        When(string.Format("I log in with valid username and password));
        Then (string.Format("I should be logged in));
}

PS:我之前尝试使用钩子在这个场景之前使用标签(在它上面)运行登录操作,但我发现之前设置操作不是一个好习惯,而且Backgound关键字也不适用于此有相同功能的场景不需要登录。

提前致谢

2 个答案:

答案 0 :(得分:0)

我认为你不能这样做,你绝对不想这样做。

如果我们查看您想要嵌套的每个步骤并考虑其中的代码,我们有

注意:我不会使用java,但我会尝试使用您的代码进行解释

Given(string.Format("I am on login page"))
   foo code
     ...

When(string.Format("I log in with valid username and password));
   bar code
     ...

注意:省略号表示执行操作的所有代码

现在,如果你想实施I am on login page and I log in with valid username and password,那么你可以做到

Given(string.Format("I am on login page and I log in with valid username and password")
  foo code
    ...
  bar code
    ...

现在唯一的问题是你有两个foo代码副本。您可以通过提取方法来解决这个问题。这会给你

Given(string.Format("I am on login page and I log in with valid username and password")
  call foo code
  call bar code

并且意味着您将原始步骤重写为

Given(string.Format("I am on login page"))
   call foo code


When(string.Format("I log in with valid username and password));
   call bar code

如果您将所有步骤定义编写为单行调用,则只需组合调用即可轻松制作复合步骤定义。

最后,您应该将复合步骤定义设为单个调用

Given(string.Format("I am on login page and I log in with valid username and password")
      call baz code

然后将baz实现为

void baz() {
  foo
  bar
}

所以现在甚至你的复合调用都是在步骤定义之外定义的。

要做到这一点,您必须了解Cucumbers机制,以允许您定义和调用步骤定义之外的方法。这在Ruby中非常简单,但我不知道java等价,道歉。

最终,你最终会得到一些你必须组织的方法foo,bar,baz。这是所有编程语言都支持的已知简单问题。通过将这个问题从Cucumber和Java中解决,你将(从长远来看)使事情变得更加简单。

我希望你能在这里使用这些想法让你更简单。

答案 1 :(得分:0)

由于这是一个先决条件,我会重写为Given I am logged in(或者甚至提供一些有关用户登录类型的信息,而不是使用I?如客户,管理员,... ?)

请注意,您无法从cucumber-jvm中的步骤调用步骤(按设计!)

在login()方法中,您可以调用几个辅助方法来执行实际登录所需的操作,例如:

navigateToLoginPage();
enterUsernamePassword("user", "pass);
assert.something() // Make sure login was successful

此外,登录失败时记录消息;这将帮助您分析失败)