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

Meg*_*lvi 7 java cucumber cucumber-junit cucumber-java

考虑我有以下功能文件:

登录功能

功能:登录网站

场景:现场登录验证

  • 给定导航到站点登录页面
  • 当用户输入用户名“admin1”时
  • 用户输入密码“admin1”
  • 用户单击登录按钮
  • 那么用户应该无法成功登录

首页.专题

功能:欢迎页面验证

场景:验证登录后出现的页面

  • 登录成功
  • 当出现登录成功后的页面时
  • 然后测试完成

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

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 {}
Run Code Online (Sandbox Code Playgroud)

dia*_*ist 3

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

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

您应该创建的代码类型是(抱歉所有示例都是 ruby​​,我不做 java)

  1. 知道其姓名、电子邮件和密码的测试用户实体
  2. 一种可以使用测试用户登录的方法

然后你可以编写一个辅助方法,例如

def login_as(user)
  visit login_path
  fill_in :email, with: user.email
  fill_in :password, with: user.password
  submit_form
end
Run Code Online (Sandbox Code Playgroud)

现在在你的第二个功能中你可以有类似的东西

Given I am an admin
When I login
Run Code Online (Sandbox Code Playgroud)

并将这些步骤实施为

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
Run Code Online (Sandbox Code Playgroud)

在某个地方你会有一些辅助方法

module StepHelperMethods
  def create_user
    ...
    return user
  end

  def login_as(user)
    ...
  end
end
World StepHelperMethods
Run Code Online (Sandbox Code Playgroud)

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