当前位置: 首页 > 知识库问答 >
问题:

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

白智
2023-03-14

假设我有以下功能文件:

我ogin.feature

功能:登录网站

场景:现场登录验证

  • 给定导航到站点登录页

家特色

功能:欢迎页面验证

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

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

在Home.feature文件中,我需要先执行Login.feature,然后调用home.feature.所以当我从运行器测试中执行home时,它会依次执行login,然后是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 {}

共有3个答案

仲孙凡
2023-03-14

每个特性背后都有一个在您的步骤定义中实现的方法,因此您不需要以这种方式编写您的特性,您只需要调用您已经实现的方法。

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

public void LoginUserGlobal(String user,String pass)抛出可丢弃的{LoginPageObjects LP=新的LoginPageObjects(driver);

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

如果您需要在任何功能中使用它,您将按照以下方式进行编码:

@When("^User logs in with \"([^\"]*)\" and \"([^\"]*)\"$")
public void user_logs_in_with_something_and_something(String user, String pass) throws Throwable {
  GlobalClassWhereIsYourLoginMethod Lin = new GlobalClassWhereIsYourLoginMethod (driver)
  LoginUserGlobal(user,pass);
}

或者,如果它不是应用程序的常用部分,您将从已经实现的步骤定义方法调用它。

龙兴贤
2023-03-14

试试这个:

创建一个RunnerLogin类来调用Login.feature

在步骤类中,在实现给定登录成功的方法中,执行以下操作:

@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(); 
}
陶胤运
2023-03-14

您不需要从第二个功能html" target="_blank">调用第一个功能。您需要做的是在第二个功能中加入一个步骤,以便登录。它可以通过调用您在实现第一个特性时创建的代码来实现这一点。

第一个特性是您第一次实现登录时可能编写的东西。在执行此操作时,您将执行这些步骤调用的步骤和代码以使您登录。

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

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

然后您可以编写一个helper方法。

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

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

 类似资料:
  • 问题内容: 我有以下JavaScript代码: 我如何确保仅在完成后调用? 问题答案: 指定一个匿名回调,并使function1接受它:

  • 问题内容: 我按照https://golang.org/doc/code.html#Workspaces链接中的说明进行操作,并构建了我的第一个Go程序。 因此,我尝试使用以下说明创建库= https://golang.org/doc/code.html#Library 一切都很完美,直到构建hello.go,它给了我这个错误。 /hello.go:10:13:未定义:stringutil.Rev

  • 我的项目目录如下所示: 在我的主要范围内。py,我从文档导入一个函数。py如下: 它工作正常。 如何在中导入相同的东西?我尝试了: 但我有一个错误:

  • 我正在使用Maven SureFire,TestNG(扩展AbstractTestNGCucumber测试)和Cucumber,并且有几个功能文件,每个文件都有几个场景。我希望能够在一个功能文件中并行运行每个场景,但一次只能运行一个功能文件。这有可能吗? 举个例子: 我希望场景1a、1b和1c在功能文件1中并行运行。一旦这些完成,运行场景2a和功能2等的2b。 这是当前一次从所有功能文件运行所有方

  • 问题内容: 基本上,如果我有任意函数的切片或数组,如何选择仅返回int的函数或仅选择采用int的函数? 我认为我需要使用反射包,但是仅仅阅读文档并不能真正帮助我准确地知道如何做。 问题答案: 该程序打印以a 为参数或返回a 的函数: 我认为代码是不言自明的

  • 问题内容: 我正在尝试编写一个基本的go程序,该程序在另一个文件上调用函数,但该文件是同一包的一部分。但是,它返回: 这是源代码: : : 问题答案: 请阅读“如何编写Go代码”。 不要在您的中使用。软件包位于中。 对于或您需要将文件放在包目录中。 对于,您需要提供所有文件作为参数: 但是,您几乎应该始终使用或或(最好是使用前者,因为使用非主软件包时会引起混乱)