新闻中心

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

2025-12-03
浏览次数:
返回列表

Maven 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标签时,可能会遇到所有测试都被执行的问题。这通常是由于以下原因:

  1. 不正确的系统属性名称: 混淆JUnit的tags属性与Cucumber特有的cucumber.filter.tags属性。
  2. AND操作符的兼容性或解析问题: 在某些Cucumber版本或特定的命令行环境下,直接在cucumber.filter.tags中使用and操作符可能会导致解析失败或行为异常。例如,尝试mvn test -D"cucumber.filter.tags=@Account and @OCR" 可能无法按预期工作。
  3. 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环境下外键迁移问题 

搜索