【问题标题】:how to execute Cucumber Step defination with TestNG annotation如何使用 TestNG 注释执行 Cucumber Step 定义
【发布时间】:2019-10-03 01:09:23
【问题描述】:

我应该在 Cucumber 上迁移。我确实有带有 Selenium 的项目框架,带有数据驱动框架的 TestNG,Maven。我正在使用 TestNG 注释探索 Cucumber 的可行性。

我的问题是,我们如何在 @Test 方法和黄瓜的 Step 定义之间建立联系。举个例子,我们的代码是用@BeforeClass、@Test、@AfterClass 方法编写的。那么我们如何使用 Step 定义进行迁移。

特色文件:

Feature: Is it Friday yet?
  Everybody wants to know when it's Friday

  Scenario: Sunday isn't Friday
    Given today is Sunday
    When I ask whether it's Friday yet

步骤定义:

@Given("^today is Sunday$")
public void today_is_Sunday() {
    // Write code here that turns the phrase above into concrete actions
    System.out.println("this is demo1");
}

@When("^I ask whether it's Friday yet$")
public void i_ask_whether_is_s_Friday_yet() {
    // Write code here that turns the phrase above into concrete actions
    System.out.println("this is demo2");
}

类执行:

@CucumberOptions(features = "cfeature/firstDemo.feature", glue = { "mytest/Stepd" })
public class demo01  extends AbstractTestNGCucumberTests {

    private TestNGCucumberRunner tcr;

    @BeforeClass(alwaysRun = true)
    public void beforeClass() throws Exception {
        tcr = new TestNGCucumberRunner(this.getClass());
    }

    @Test(groups="cucumber", description="Runs CucumberFeature")    
    public void testdemo() {
        System.out.println("Hello");        
    }

    @AfterClass(alwaysRun = true)
    public void afterClass() {
        tcr.finish();
    }   
}

控制台:

Hello

[33mUndefined scenarios:[0m
[33mcfeature/firstDemo.feature:4 [0m# Sunday isn't Friday

1 Scenarios ([33m1 undefined[0m)
5 Steps ([33m5 undefined[0m)
0m0.073s


You can implement missing steps with the snippets below:

截至目前,@Test 注解正在调用。但是,如何用步骤定义替换它。请帮忙。

【问题讨论】:

  • 你只需要扩展类。其余的都和junit一样。 github.com/cucumber/cucumber-jvm/tree/master/testng.
  • @Grasshopper 我已经用 TestNG 替换了 Junit。我对步骤定义特别怀疑。
  • test 和 stepdefinition 之间没有直接迁移。您将需要创建适当的场景并将现有的测试逻辑拆分为步骤定义。
  • @Grasshopper 是的,我想我需要这样做。但是,从当前执行 Step 定义没有调用。如果您可以提供示例(在回答中),那就太好了。
  • 您应该使用 java 包格式作为胶水选项值。也许像'mytest.Stepd'

标签: selenium cucumber testng cucumber-java


【解决方案1】:

不知道这里有什么混乱。以下是如何将 TestNG 和黄瓜术语联系起来。

  • TestNG 中的<test> 标签可以可视化为黄瓜中的特征文件。
  • TestNG 中的@Test 方法可以可视化为黄瓜中的一个场景。
  • cucumber 中的 Step 定义与 TestNG 中的定义没有任何直接的等价关系,因为它是场景的一部分。但为了便于理解,您可以将其可视化为在 TestNG 中执行逻辑操作的一行代码。

AbstractTestNGCucumberTests的默认实现如下:

  • 它在内部包含一个数据提供程序,一次提供一个功能文件。
  • 它包含一个@Test 方法,该方法绑定到上述数据提供程序,该方法检索特征文件中的所有场景,然后一个接一个地运行它们。

您可以构建自己的AbstractTestNGCucumberTests 变体来执行各种不同的操作(例如支持当前在 Cucumber JVM 绑定中不可用的并发场景执行)。

作为示例,您可以查看我构建的 Cucumber-roadrunner 库,它使用上述概念来支持并行场景执行并提供线程安全报告。

关于您面临的错误,You can implement missing steps with the snippets below: 基本上是因为黄瓜 jvm 绑定可能无法使用胶水代码绑定您的功能文件(这是您通过 @CucumberOptions 注释提供的内容)。您或许应该仔细查看黄瓜 jvm 绑定文档以了解如何提供正确的值。

【讨论】:

  • 信息很有用,谢谢。但这不是我要找的,抱歉。
  • @IshitaShah - 你到底在找什么?需要详细说明吗?
  • 我想你会发现我的问题本身很清楚。然而,如果与 TestNG 注释一起使用,则使用步骤定义。在 Step 定义中管理什么,在 TestNG annotation 中管理什么。
  • @IshitaShah - 我相信我已经回答了这个问题。步骤定义是黄瓜世界中使用的术语。TestNG 不知道它,尝试将这两个东西合并在一起没有任何意义。步骤是测试用例(场景)的粒度属性,在 TestNG 中,您可以获得的最大粒度只是 @Test 方法,它从字面上表示一个场景。
【解决方案2】:

您还可以查看gherkin with QAF,它是小黄瓜的纯 TestNG 实现。它使用 TestNG(不是 cucumber runner) 并为您提供 testNG 的所有功能,包括并行执行、侦听器、分组、优先级等......

每个场景都转换为 TestNG 测试,您可以并行运行场景。此外,您还可以在authoring BDD 时使用inbuilt 或自定义数据提供者。不需要额外的跑步者,只需像往常一样使用 appropriate factory 类为您正在使用的 BDD syntax 配置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多