You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cucumber步骤未定义:如何自定义方法名与@Given值不一致?

解决Cucumber步骤未定义且自定义方法名无效的问题

问题背景

Feature 文件内容

Feature: Agregar Cotizacion
  Scenario: Una vez dentro de SEITEM y pasar por el login, me dirijo a la sección de generar cotizaciones
    Given estoy dentro de SEITEM, voy a la sección de generar cotizaciones

对应的 Step Definitions 实现类

package com.uva3;

public class CotizacionStepDefinitionsTest {
    private WebDriver driver;

    @Before
    public void initialize() {
        driver = new ChromeDriver();
        driver.get("http://seitem.loc");
        driver.findElement(By.id("login")).sendKeys("admin");
        driver.findElement(By.id("password")).sendKeys("1");
        driver.findElement(By.cssSelector("[value='Ingresar']")).click();
    }

    @Test
    @Given("estoy dentro de SEITEM, voy a la sección de generar cotizaciones")
    public void irGenerarCotizacionTest() {
        driver.navigate().to("http://seitem.loc/agregarCotizacion.php");
        assertEquals("Cotizaciones", driver.getTitle());
    }

    @AfterEach
    public void finalizarProceso() throws InterruptedException {
        Thread.sleep(2000);
        driver.quit();
    }
}

运行测试时的错误信息

Step undefined
You can implement this step using the snippet(s) below:

@Given("estoy dentro de SEITEM, voy a la sección de generar cotizaciones")
public void estoy_dentro_de_seitem_voy_a_la_sección_de_generar_cotizaciones() {
    // Write code here that turns the phrase above into concrete actions
    throw new io.cucumber.java.PendingException();
}


Undefined scenarios:
file:///C:/Users/Juan%20Manuel%20Adarve%20C/IdeaProjects/standardTest/src/test/resources/cotizacion.feature:2 # Una vez dentro de SEITEM y pasar por el login, me dirijo a la sección de generar cotizaciones

1 Scenarios (1 undefined)
1 Steps (1 undefined)
0m8,606s

用户需求:希望自定义步骤方法名(不使用Cucumber生成的默认名称),调整@CucumberOptions的glue配置后问题仍存在,寻求解决办法。


解决方案

1. 移除 JUnit 的 @Test 注解

Cucumber 通过@Given/@When/@Then注解识别步骤定义,不需要JUnit的@Test注解,添加该注解会干扰Cucumber的步骤识别逻辑。修改后的方法:

@Given("estoy dentro de SEITEM, voy a la sección de generar cotizaciones")
public void irGenerarCotizacionTest() {
    driver.navigate().to("http://seitem.loc/agregarCotizacion.php");
    assertEquals("Cotizaciones", driver.getTitle());
}

2. 替换生命周期注解为 Cucumber 版本

代码中使用的@Before和@AfterEach是JUnit的注解,必须替换为Cucumber的对应注解:

  • 导入io.cucumber.java.Before和io.cucumber.java.After
  • 将@AfterEach改为@After

修改后的初始化与销毁方法:

import io.cucumber.java.Before;
import io.cucumber.java.After;

// ...

@Before
public void initialize() {
    driver = new ChromeDriver();
    driver.get("http://seitem.loc");
    driver.findElement(By.id("login")).sendKeys("admin");
    driver.findElement(By.id("password")).sendKeys("1");
    driver.findElement(By.cssSelector("[value='Ingresar']")).click();
}

@After
public void finalizarProceso() throws InterruptedException {
    Thread.sleep(2000);
    driver.quit();
}

3. 确保 @CucumberOptions 的 glue 配置精准

在测试运行类(带@RunWith(Cucumber.class)的类)中,确认glue属性指向步骤定义所在的包com.uva3,示例:

import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
@CucumberOptions(
    features = "src/test/resources", // 指向Feature文件根目录
    glue = "com.uva3", // 指向步骤定义类所在的包
    plugin = {"pretty"}
)
public class CucumberTestRunner {
}

4. 验证依赖版本一致性

确保项目中Cucumber相关依赖版本统一,避免版本冲突导致的识别异常。Maven依赖示例:

<dependencies>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-java</artifactId>
        <version>7.14.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-junit</artifactId>
        <version>7.14.0</version>
        <scope>test</scope>
    </dependency>
    <!-- WebDriver及JUnit依赖 -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-chrome-driver</artifactId>
        <version>4.11.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.9.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

5. 确认字符编码与字符串一致性

Feature文件中的特殊字符(如sección的重音符号)需与步骤定义中的字符串完全匹配,同时确保项目使用UTF-8编码,避免因编码差异导致的匹配失败。


总结

完成上述修改后,Cucumber即可正确识别自定义方法名的步骤定义,无需使用生成的默认方法名。核心要点是区分JUnit与Cucumber的注解体系,确保glue配置指向正确包路径,同时保持依赖版本一致。

内容的提问来源于stack exchange,提问作者Juan Manuel Adarve Cifuentes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 14:17:06