讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在 Serenity BDD 中正确标记手动测试场景而不触发步骤未定义异常

云辰同学_4471

云辰同学_4471

发布时间:2026-02-27 13:26:00

|

587人浏览过

|

来源于php中文网

原创

如何在 Serenity BDD 中正确标记手动测试场景而不触发步骤未定义异常

本文介绍在 Serenity BDD(基于 Cucumber)中,如何通过合理使用标签与占位步骤定义,使 @manual 场景正常纳入报告展示,同时避免因缺失步骤实现而抛出 UndefinedStepException 导致构建失败。

本文介绍在 serenity bdd(基于 cucumber)中,如何通过合理使用标签与占位步骤定义,使 `@manual` 场景正常纳入报告展示,同时避免因缺失步骤实现而抛出 `undefinedstepexception` 导致构建失败。

在 Serenity BDD 项目中,团队常需将部分测试用例标记为 手动执行(如探索性测试、环境受限场景或第三方系统验证),并希望它们出现在最终的 Serenity 报告中以体现测试覆盖范围和人工验证状态。典型做法是为 Feature 文件中的 Scenario 添加 @manual 标签及相关元数据(如 @manual-result:passed、@manual-test-evidence 等)。然而,Cucumber 的核心设计原则是:每个 Gherkin 步骤(Given/When/Then)必须有且仅有一个对应的 Java 方法实现;否则,运行时将立即抛出 io.cucumber.junit.UndefinedStepException,导致整个测试套件构建失败。

例如,以下 Feature 片段看似合理:

@JIRA_BOND_007
@manual
@manual-result:passed
Scenario: Dont want Manual steps to cause step definition failure
  Given John Ferguson Smart releases a new version of serenity bdd
  When tester marks a test as manual
  Then runner should not fail because of error "io.cucumber.junit.UndefinedStepException:"

但只要 @manual 场景中存在未实现的步骤(如 When tester marks a test as manual),Cucumber 就会强制报错——即使你期望它“跳过执行”。

⚠️ 关键事实(来自 Serenity 创始人 John Ferguson Smart 的官方说明):

“Cucumber does not allow steps to not have a step definition (they will result in a build failure). There isn't an easy work-around to this.”

这意味着:无法通过配置或标签让 Cucumber 主动忽略某类场景的步骤匹配逻辑。Serenity 本身不改变 Cucumber 的这一底层约束。

✅ 正确解法:为 @manual 场景提供空实现的占位步骤定义,确保语法合法、构建通过,同时明确传达“此步骤不自动执行”的语义。推荐两种实践方式:

方式一:统一空实现(推荐)

在任意 Step Definition 类中添加通用占位方法,覆盖常见动词模式:

import io.cucumber.java.PendingException;
import io.cucumber.java.en.*;

public class ManualStepPlaceholder {

    @Given(".*")
    @When(".*")
    @Then(".*")
    public void skipManualStep() {
        // 显式标记为手动执行,不触发实际逻辑
        // Serenity 仍会记录该步骤为 PASSED(因无异常)
    }
}

✅ 优点:简洁、全局生效,无需为每个 manual 场景重复编写;Serenity 报告中步骤状态为 PASSED(因方法成功返回),符合预期。
⚠️ 注意:正则 .* 会匹配所有步骤,因此仅应在仅用于 manual 场景的独立测试运行配置中启用(例如通过 --tags "@manual" 单独执行),避免干扰自动化场景。

方式二:结构化占位(更清晰、更安全)

为 manual 场景显式编写最小化、语义明确的步骤定义:

public class ManualTestSteps {

    @Given("^{string} releases a new version of serenity bdd$")
    public void placeholderGiven(String person) {
        // Intentionally left blank — manual verification only
    }

    @When("^tester marks a test as manual$")
    public void placeholderWhen() {
        // No automation; verified manually per test evidence
    }

    @Then("^runner should not fail because of error \"([^\"]*)\"$")
    public void placeholderThen(String expectedError) {
        // Confirmed: no UndefinedStepException thrown
    }
}

✅ 优点:步骤绑定精准,避免误匹配;代码可读性强,便于后续维护或审计。
? 提示:可在方法体内添加 System.out.println("[MANUAL] " + ...) 或自定义日志,辅助调试。

最终建议与注意事项

  • 不要依赖 @PendingException 或 throw new PendingException():这会导致步骤状态为 PENDING,Serenity 报告中显示为黄色警告,且不符合“已人工验证通过”的业务语义。
  • 务必配合 Serenity 的 @manual 标签使用:Serenity 能识别该标签并自动在 HTML 报告中标记为「Manual Test」,同时保留 @manual-result 等自定义属性的可视化。
  • CI/CD 流程中建议分离执行:通过 Maven/Gradle 配置,对 @manual 场景使用专用的测试运行器(如 mvn verify -Dcucumber.filter.tags="@manual"),避免与自动化测试混跑增加噪音。
  • 长期演进方向:若 manual 测试比例高,建议考虑将纯人工用例迁出 .feature 文件,改用 Serenity 的 @ManualTest 注解 + JUnit5 方法级描述,实现更干净的职责分离。

通过上述方式,你既能满足合规性与报告完整性要求,又严格遵守 Cucumber 的契约约束——这是当前生态下最稳健、最被广泛验证的实践路径。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

3360

2025.09.15

Java Maven/Gradle 构建与依赖管理合集
Java Maven/Gradle 构建与依赖管理合集

系统讲解 Java 项目构建工具的使用与进阶配置,涵盖 Maven 的 POM 文件结构、生命周期(clean/compile/package/install/deploy)与插件机制、依赖范围(compile/provided/test/runtime)与传递依赖管理、多模块聚合与继承、私有 Nexus 仓库发布,以及 Gradle 的 Groovy / Kotlin DSL 语法、Task 自定义与增量构建、依赖版本目录(Versi

349

2026.05.09

软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

4370

2023.10.13

java测试工具有哪些
java测试工具有哪些

java测试工具有JUnit、TestNG、Mockito、Selenium、Apache JMeter和Cucumber。php还给大家带来了java有关的教程,欢迎大家前来学习阅读,希望对大家能有所帮助。

2761

2023.10.23

Java 单元测试
Java 单元测试

本专题聚焦 Java 在软件测试与持续集成流程中的实战应用,系统讲解 JUnit 单元测试框架、Mock 数据、集成测试、代码覆盖率分析、Maven 测试配置、CI/CD 流水线搭建(Jenkins、GitHub Actions)等关键内容。通过实战案例(如企业级项目自动化测试、持续交付流程搭建),帮助学习者掌握 Java 项目质量保障与自动化交付的完整体系。

1026

2025.10.24

Java Maven/Gradle 构建与依赖管理合集
Java Maven/Gradle 构建与依赖管理合集

系统讲解 Java 项目构建工具的使用与进阶配置,涵盖 Maven 的 POM 文件结构、生命周期(clean/compile/package/install/deploy)与插件机制、依赖范围(compile/provided/test/runtime)与传递依赖管理、多模块聚合与继承、私有 Nexus 仓库发布,以及 Gradle 的 Groovy / Kotlin DSL 语法、Task 自定义与增量构建、依赖版本目录(Versi

349

2026.05.09

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

466

2025.12.13

Figma AI自动化智能数据填充与交互生成实战
Figma AI自动化智能数据填充与交互生成实战

告别机械重复,详细演示如何用 AI 填充业务真实数据,并自动为页面添加交互连线,将静态设计稿快速转变为动态原型。

285

2026.05.13

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

0

2026.10.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn