大家好,
要继续订购产品方案,我应该登录,我问我是否可以在我的方案中使用以下步骤:
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关键字也不适用于此有相同功能的场景不需要登录。
提前致谢
答案 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
此外,登录失败时记录消息;这将帮助您分析失败)