2017-08-13 128 views
1

我正在写我的项目中的小黄瓜测试用例和Java步骤定义。我是嫩黄瓜的新手,并试图理解嵌套步骤的含义。你能帮我理解第二种情况是否涉及嵌套步骤?小黄瓜嵌套步骤含义

在我的例子中,我想在给定语句逻辑的第二场景中重用第一场景代码。有没有最好的方法来重用或重写逻辑? 注意:下面的例子是为了解释我的问题而写的。它可能不是一个好黄瓜。

Background: 
    Given The application is opened 

Scenario: Successful Login 
    Given the user name and password are entered 
    When login button is clicked 
    Then user login is successful 

Scenario: Add Address Successful 
    Given user login is successful 
    And Add Address button is clicked 
    And user city, country are entered 
    when Submit button is clicked 

回答

3

嵌套步骤指的是调用“主”中的定义步骤。在您的示例中,第一种方案具有登录功能,可以在所有其他需要用户登录的情况下使用。

因此,第二种方案将有一个调用登录操作的Given步骤/第一种情景的步骤。有多种方法可以做到这一点:

1.如果您在同一个类中定义这些步骤,只需在不同的步骤/方法中调用相同的方法即可。

像这样:

public class TestStepsOne { 

    // Steps from first scenario 

    @Given("^the user name and password are entered$") 
    public void enterUsernamePassword() throws Throwable { 
     System.out.println("User and password entered"); 
    } 

    @When("^login button is clicked$") 
    public void clickLoginButton() throws Throwable { 
     System.out.println("Clicked login button"); 
    } 

    @Then("^user login is successful$") 
    public void isLoggedIn() throws Throwable { 
     System.out.println("Logged in!"); 
    } 

    // All together 

    @Given("the user is logged in") 
    public void loginSuccessfully() throws Throwable { 
     enterUsernamePassword(); 
     clickLoginButton(); 
     isLoggedIn(); 
    } 
} 

现在你可以使用Given the user is logged in任何情况下,它会进行登录操作。

2.使用PicoContainer的 - >详细信息here

首先,你需要这些依赖添加到您的pom.xml

<dependency> 
    <groupId>org.picocontainer</groupId> 
    <artifactId>picocontainer</artifactId> 
    <version>2.15</version> 
</dependency> 
<dependency> 
    <groupId>info.cukes</groupId> 
    <artifactId>cucumber-picocontainer</artifactId> 
    <version>1.2.5</version> 
</dependency> 

可以分开你的脚步定义。

像这样:

public class TestStepsOne { 

    // Same as above, without the nested one 

} 

和第二类:

public class TestStepsTwo { 
    private final TestStepsOne testStepsOne; 

    public TestStepsTwo(TestStepsOne testStepsOne) { 
     this.testStepsOne = testStepsOne; 
    } 

    @Given("the user is logged in") 
    public void loginSuccessfully() throws Throwable { 
     testStepsOne.enterUsernamePassword(); 
     testStepsOne.clickLoginButton(); 
     testStepsOne.isLoggedIn(); 
    } 
} 

3.使用cuke4duke - >详细here,包括示例

像这样:

public class CallingSteps extends Steps { 
    public CallingSteps(StepMother stepMother) { 
     super(stepMother); 
    } 

    @When("^I call another step$") 
    public void iCallAnotherStep() { 
     Given("the user is logged in"); // This will call a step defined somewhere else. 
    } 
} 

希望这会有帮助

+0

感谢您的解释。我想尝试使用pico容器。为了使用它,我应该只添加依赖项并且有一个参数化的构造函数吗?它是如何工作的?此外,我的CommonSteps调用(或您的示例中的TestStepsOne类)具有参数化的构造函数。这会被处理吗? – kav12345

+0

请查看picocontainer链接的网站,它比我在评论中更好地解释了它(还提供了实施示例)。 –