新闻中心
M*en Cucumber并行测试中的标签过滤与配置指南

本文详细探讨了在使用m*en surefire插件运行cucumber测试时,如何有效地进行标签过滤,避免所有测试场景被执行的问题。文章将深入解析命令行参数、`@cucumberoptions`配置的正确用法,以及处理`and`/`or`逻辑的策略,旨在帮助开发者精确控制测试的执行范围。
理解Cucumber标签过滤机制
在自动化测试中,特别是使用Cucumber框架时,标签(Tags)是一种强大的组织和过滤测试场景的方式。通过为Feature文件中的Scenario或Scenario Outline添加@tagname,我们可以根据需要选择性地运行特定类别的测试。当结合M*en构建工具和Surefire插件执行测试时,正确配置标签过滤至关重要。
m*en-surefire-plugin负责执行单元和集成测试。对于Cucumber测试,Surefire插件通常会运行一个或多个TestRunner类,而真正的标签过滤逻辑则由Cucumber框架自身处理。
常见的标签过滤误区
许多开发者在尝试通过M*en命令行过滤Cucumber标签时,可能会遇到所有测试都被执行的问题。这通常是由于以下原因:
- 不正确的系统属性名称: 混淆JUnit的tags属性与Cucumber特有的cucumber.filter.tags属性。
- AND操作符的兼容性或解析问题: 在某些Cucumber版本或特定的命令行环境下,直接在cucumber.filter.tags中使用and操作符可能会导致解析失败或行为异常。例如,尝试mvn test -D"cucumber.filter.tags=@Account and @OCR" 可能无法按预期工作。
- OR操作符的语法: 对于多个标签的OR逻辑,错误的语法也会导致过滤失败。
有效的Cucumber标签过滤策略
要精确控制Cucumber测试的执行,可以采用以下两种主要策略:
策略一:通过命令行参数进行过滤
使用cucumber.filter.tags系统属性是动态过滤测试的推荐方法。这种方式允许在不修改代码的情况下,根据每次运行的需求指定不同的标签。
1. 使用OR逻辑过滤: 如果希望运行标记为@Account或@OCR的任何场景,可以使用or操作符。这在大多数Cucumber版本中都非常稳定且推荐。
mvn clean test -D"cucumber.filter.tags=@Account or @OCR"
2. 使用AND逻辑过滤: 虽然Cucumber框架本身支持复杂的标签表达式,包括and操作符(例如,@tag1 and @tag2),但在通过命令行传递时,由于Shell解析、特定Cucumber版本或m*en-surefire-plugin与Cucumber Runner的交互方式,可能会出现问题。
如果直接的and表达式不工作,可以考虑以下替代方案:
独响
一个轻笔记+角色扮演的app
249
查看详情
- 确保Cucumber版本支持: 检查您的io.cucumber:cucumber-junit和io.cucumber:cucumber-j*a版本,确保它们是较新的,通常较新版本对标签表达式的支持更好。
- 在TestRunner中定义: 如果命令行传递and遇到困难,将复杂的and逻辑定义在TestRunner中可能更稳定(详见策略二)。
策略二:在TestRunner中配置标签
在TestRunner.j*a文件中使用@CucumberOptions注解的tags属性是另一种常见的过滤方式。这种方法将标签过滤逻辑硬编码到测试运行器中,适用于需要固定运行特定标签集合的场景。
package cucumberOptions;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
@CucumberOptions(
features = "src/test/j*a/features",
glue = {"Steps","SQL"},
// 在这里配置标签过滤
tags = "@Account or @OCR" // 运行 @Account 或 @OCR 标签的场景
// tags = "@Account and @OCR" // 运行同时具有 @Account 和 @OCR 标签的场景
// tags = "not @Ignore" // 运行所有未标记 @Ignore 的场景
)
public class TestRunner {
}优先级说明: 通过命令行传递的cucumber.filter.tags系统属性通常会覆盖@CucumberOptions中定义的tags属性。这意味着,如果两者都存在,命令行参数将优先。
M*en pom.xml 配置
为了确保M*en Surefire插件能够正确执行Cucumber测试并传递系统属性,pom.xml文件中的配置至关重要。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://m*en.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://m*en.apache.org/POM/4.0.0 http://m*en.apache.org/xsd/m*en-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>LifeboxAutomation</groupId>
<artifactId>LifeboxAutomation</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<m*en.compiler.source>8</m*en.compiler.source>
<m*en.compiler.target>8</m*en.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 定义Cucumber版本,方便管理 -->
<cucumber.version>7.5.0</cucumber.version>
<surefire.version>2.22.2</surefire.version
>
</properties>
<dependencies>
<!-- Cucumber Dependencies -->
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-j*a</artifactId>
<version>${cucumber.version}</version>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
<!-- JUnit 4 (因为TestRunner使用了@RunWith(Cucumber.class),它依赖JUnit 4) -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 其他依赖,如Rest Assured, Selenium等 -->
<!-- ... (保持原有pom.xml中的其他依赖) ... -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.m*en.plugins</groupId>
<artifactId>m*en-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<includes>src/test/**/*.j*a</includes>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.m*en.plugins</groupId>
<artifactId>m*en-surefire-plugin</artifactId>
<version>${surefire.version}</version>
<configuration>
<encoding>UTF-8</encoding>
<argLine>-Dfile.encoding=${project.build.sourceEncoding}</argLine>
<!-- 如果需要并行执行,可以添加以下配置,但这与标签过滤是独立的概念 -->
<!-- <parallel>methods</parallel> -->
<!-- <threadCount>4</threadCount> -->
<!-- 确保Surefire能够找到并执行TestRunner -->
<test>**/*TestRunner.j*a</test>
</configuration>
</plugin>
</plugins>
</build>
</project>注意事项:
- Surefire版本: 确保使用最新稳定版的m*en-surefire-plugin,以获得更好的兼容性和功能。
-
test配置:
**/*TestRunner.j*a 确保Surefire插件能够找到并执行你的Cucumber TestRunner类。 - 并行执行: parallel和threadCount配置用于控制测试的并行执行,这与标签过滤是正交的概念,它们不会影响标签过滤的逻辑,只影响被过滤后剩余测试的运行方式。
总结
在M*en项目中结合Cucumber进行标签过滤,关键在于理解Cucumber的标签表达式语法以及如何通过m*en-surefire-plugin正确传递这些表达式。优先使用cucumber.filter.tags系统属性配合or逻辑进行命令行过滤,可以提供最大的灵活性。对于更复杂的或固定的过滤需求,在@CucumberOptions中直接定义tags也是一个可靠的选择。始终确保您的Cucumber依赖版本是最新的,以利用最新的功能和改进。
以上就是M*en Cucumber并行测试中的标签过滤与配置指南的详细内容,更多请关注其它相关文章!
# 在这里
# 武汉网站长尾词优化
# 温州营销推广策划
# 伊川微信营销推广中心
# seoer怎么优化网站
# 苏州公司网站建设模板
# 惠州网站建设在哪里
# 企业线下推广营销
# 呈贡网站建设设计
# 青海seo软件公司排名
# 湛江市花园网站建设品牌
# 也会
# 是一种
# java
# 通常会
# 至关重要
# 这与
# 测试中
# 多个
# 您的
# 命令行
# red
# 工具
# 编码
# apache
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
JUnit5/Mockito:优雅测试内部依赖与异常处理的实践
优化Django表单:提交验证失败后保留用户输入
C++ explicit关键字防止隐式转换_C++构造函数安全规范
在WordPress中通过REST API获取BasicAuth保护的远程文章
初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解
微信聊天记录怎么加密_微信聊天记录加密方法
批改网学生版PC登录 批改网官网登录系统入口
mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析
树莓派传感器触发:通过Twilio API发送WhatsApp消息教程
谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示
css绝对定位元素脱离父容器怎么办_确保父元素position非static
精准捕获:如何在页面中监听除特定元素外的所有点击事件
MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具
win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】
期待已久:小米17 Ultra、小米首款NAS本月登场
Mac怎么使用表情符号_Mac Emoji快捷键面板
J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析
解决 Express.js 中 PUT 请求密码修改失败的路由配置指南
Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全
俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口
Go语言中Map存储的结构体如何调用指针方法:深入解析与实践
ACG动漫视频网入口 ACG动漫*免费正版观看地址
Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】
PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符
Go语言中JSON数据解码与字段访问指南
c++20的std::jthread是什么_c++可中断线程与RAII式管理
html5 app怎么运行环境_配html5 app运行环境【教程】
微信商城在哪里打开【步骤】
必由学在线入口 必由学网页版快速登录入口
Surface怎么安装系统 微软Surface Pro U盘重装win11教程
Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】
192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台
抖音网页版企业服务中心登录入口_抖音网页版企业登录平台
Lar*el 递归关系中排除指定分支的教程
J*aScript:在map操作中高效处理空数组
蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版
Kafka Streams中基于消息头条件过滤消息的实现指南
理解Python模块与全局变量的作用域管理
处理嵌套交互式控件:前端可访问性指南
三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】
J*aScript数据结构转换:将对象数组按类别分组
vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法
漫蛙漫画网页端入口 漫蛙2官方正版漫画站点
WordPress插件开发:正确注册卸载钩子与避免常见陷阱
夸克浏览器图书入口 夸克手机浏览器阅读入口
在FastAPI中利用lifespan与依赖注入高效管理Redis连接池
composer的"require-dev"部分是用来做什么的?
Win11输入法不见了怎么办_Windows11恢复语言栏显示方法
双系统安装时,如何设置默认启动系统? msconfig命令了解一下!
解决Django多数据库/多Schema环境下外键迁移问题


2025-12-03
浏览次数:次
返回列表
>
</properties>
<dependencies>
<!-- Cucumber Dependencies -->
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-j*a</artifactId>
<version>${cucumber.version}</version>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
<!-- JUnit 4 (因为TestRunner使用了@RunWith(Cucumber.class),它依赖JUnit 4) -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 其他依赖,如Rest Assured, Selenium等 -->
<!-- ... (保持原有pom.xml中的其他依赖) ... -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.m*en.plugins</groupId>
<artifactId>m*en-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<includes>src/test/**/*.j*a</includes>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.m*en.plugins</groupId>
<artifactId>m*en-surefire-plugin</artifactId>
<version>${surefire.version}</version>
<configuration>
<encoding>UTF-8</encoding>
<argLine>-Dfile.encoding=${project.build.sourceEncoding}</argLine>
<!-- 如果需要并行执行,可以添加以下配置,但这与标签过滤是独立的概念 -->
<!-- <parallel>methods</parallel> -->
<!-- <threadCount>4</threadCount> -->
<!-- 确保Surefire能够找到并执行TestRunner -->
<test>**/*TestRunner.j*a</test>
</configuration>
</plugin>
</plugins>
</build>
</project>