从黄瓜中的另一个功能调用一个功能文件

时间:2017-09-28 07:21:23

标签: cucumber cucumber-java cucumber-junit

考虑我有以下功能文件:

Login.feature

Feature: Login on website 

Scenario: Login verification on site 
    Given Navigate to site login page
    When User enters username 'admin1'
    And User enters password 'admin1'
    And User clicks on login button
    Then User should not be able to log in successfully

Home.feature

Feature: Welcome Page Verification

Scenario: Verify the page that comes after login
    Given Login is successfully done
    When  The page after login successfully appears
    Then  The test is done

在Home.feature文件中,我需要先执行Login.feature,然后调用home.feature。因此,当我从跑步者测试中执行回家时,它将依次执行登录然后回家。

RunnerTest.java

import org.junit.runner.RunWith;

import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;

@RunWith(Cucumber.class)


@CucumberOptions(strict = false, features = {
        "src/test/resources/Features/Home.feature",
            }, glue = { "tests" }, plugin = "html:target/cucumber-reports", format = { "pretty",
        "json:target/cucumber.json" }, tags = { "~@ignore" })

public class RunnerTest {}

谢谢&问候, MEGHA

3 个答案:

答案 0 :(得分:1)

您不需要从第二个功能调用第一个功能。您需要做的是在第二个功能中有一个步骤可以让您登录。它可以通过调用您在实现第一个功能时创建的代码来实现此目的。

第一个功能是您在第一次实施登录时可能会写的内容。在执行此操作时,您将按步骤和代码调用这些步骤来登录您。

你应该创建的那种代码是(对不起所有的例子都是ruby我不做java)

  1. 知道其名称,电子邮件和密码的测试用户实体
  2. 可以让测试用户登录的方法
  3. 然后你可以写一个辅助方法,例如

    def login_as(user) visit login_path fill_in :email, with: user.email fill_in :password, with: user.password submit_form end

    现在在您的第二个功能中,您可以使用

    Given I am an admin
    When I login
    

    并将这些步骤实现为

    Given 'I am an admin' do
      # note create_user is a method you would have created when doing user 
      # registration/creation
      @i = create_user(type: admin)
    end
    
    When "I login" do
      login_as @i
    end
    

    在某处你会有一些辅助方法

    module StepHelperMethods
      def create_user
        ...
        return user
      end
    
      def login_as(user)
        ...
      end
    end
    World StepHelperMethods
    

    您的代码重用总是发生在更低的级别。理想情况下,您应该重新使用之前创建的辅助方法来使其他方案正常工作。您也可以直接调用步骤(嵌套步骤),但这是一件非常糟糕的事情。

答案 1 :(得分:0)

试试这个:

创建RunnerLogin课程以调用Login.feature

在您的步骤类中,在实现该方法的方法中 Given Login is successfully done,执行以下操作:

@Given("^Login is successfully done$")
public void login_is_successfully_done() {
    Thread T1 = new Thread(new Thread(() -> {
        JUnitCore jExecFeature = new JUnitCore();
        Result result = jExecFeature.run(RunnerLogin.class);
    }));                

    T1.start();                
    T1.join(); 
}

答案 2 :(得分:0)

因为每个功能都在步骤定义中实现了一个方法,所以您无需在该方式中编写功能,只需调用已实现的方法即可。

对于您的应用程序经常使用的功能(例如Login)的最佳解决方案是使用Hepler方法。 您可以将这些方法实现为全局方法,并在每个步骤的定义文件中使用它们。

public void LoginUserGlobal(String user,String pass)抛出Throwable { LoginPageObjects LP =新的LoginPageObjects(驱动程序);

    LP.user().sendKeys(user);
    LP.pass().sendKeys(pass);
    LP.loginButton().click();
}

如果您需要在任何功能中使用它,您将对其进行编码,例如:

@When(“ ^用户使用”([^^]] public void user_logs_in_with_something_and_something(String user,String pass)抛出Throwable { GlobalClassWhereIsYourLoginMethod Lin =新的GlobalClassWhereIsYourLoginMethod(驱动程序) LoginUserGlobal(user,pass); }

或者如果它不是应用程序的一部分,则可以从已经实现的步骤定义方法中调用它。