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

如何从Scala程序中启动TestNGCucumberRunner?支持自定义参数传递

编程启动TestNGCucumberRunner及传递自定义参数方案

一、能否编程启动TestNGCucumberRunner?

完全可以。你可以通过TestNG的核心API在Scala应用内部直接启动TestNGCucumberRunner,无需外部触发。以下是具体实现示例,依赖io.cucumber:cucumber-testng和org.testng:testng:

import org.testng.TestNG
import org.testng.xml.{XmlClass, XmlSuite, XmlTest}
import io.cucumber.testng.{AbstractTestNGCucumberTests, CucumberOptions}

// 启动类
object CucumberProgrammaticStarter extends App {
    // 构建TestNG套件
    val suite = new XmlSuite()
    suite.setName("Cucumber Programmatic Suite")

    // 构建Test实例,关联你的Cucumber测试类
    val test = new XmlTest(suite)
    test.setName("Dynamic Cucumber Test")
    // 替换成你自己的Cucumber测试类
    val cucumberTestClass = new XmlClass(classOf[YourCucumberTest])
    test.setClasses(java.util.Arrays.asList(cucumberTestClass))

    // 配置并运行TestNG
    val testng = new TestNG()
    testng.setXmlSuites(java.util.Arrays.asList(suite))
    testng.run()
}

// 自定义Cucumber测试类
class YourCucumberTest extends AbstractTestNGCucumberTests {
    // 配置Cucumber参数,也可以动态修改tags、features路径等
    override def cucumberOptions(): CucumberOptions = {
        CucumberOptions(
            features = Array("src/test/resources/features"),
            glue = Array("com.your.package.stepdefs"),
            tags = "@YourTargetTag" // 可根据需求动态设置
        )
    }
}

二、动态传递自定义参数到TestNG/JUnit

1. TestNG 实现(对应你C# NUnit的场景)

TestNG支持通过XmlTest设置自定义参数,测试类中可通过注解或ITestContext读取:

传递参数(修改启动类代码)

// 在创建XmlTest后添加参数
val customParams = "your-custom-parameter-value"
test.setParameters(java.util.Map.of("TestParameters", customParams))

测试类中读取参数

import org.testng.{ITestContext, TestListenerAdapter}
import org.testng.annotations.{Parameters, Test}

class YourCucumberTest extends AbstractTestNGCucumberTests {
    // 方式1:通过@Parameters注解注入
    @Parameters(Array("TestParameters"))
    @Test
    def useInjectedParams(testParams: String): Unit = {
        println(s"Received TestNG parameters: $testParams")
    }

    // 方式2:从ITestContext获取
    @Test
    def useContextParams(context: ITestContext): Unit = {
        val testParams = context.getCurrentXmlTest.getParameter("TestParameters")
        println(s"Received parameters from TestContext: $testParams")
    }
}

2. JUnit 5 实现(若切换到JUnit更适配)

JUnit 5的Launcher API支持编程启动测试,同时可通过配置参数传递自定义值:

传递参数的启动代码

import org.junit.platform.launcher.core.{LauncherDiscoveryRequestBuilder, LauncherFactory}
import org.junit.platform.engine.discovery.DiscoverySelectors

object JUnitCucumberStarter extends App {
    val customParams = "your-junit-custom-params"
    val request = LauncherDiscoveryRequestBuilder.request()
        .selectors(DiscoverySelectors.selectClass(classOf[YourJUnitCucumberTest]))
        .configurationParameter("TestParameters", customParams)
        .build()

    val launcher = LauncherFactory.create()
    // 可自定义监听类收集测试结果
    val resultListener = new YourTestResultListener()
    launcher.registerTestExecutionListeners(resultListener)
    launcher.execute(request)
}

测试类中读取参数

import org.junit.jupiter.api.Test
import org.junit.platform.commons.support.AnnotationSupport

class YourJUnitCucumberTest {
    @Test
    def readCustomParams(): Unit = {
        // 直接读取配置参数
        val testParams = System.getProperty("TestParameters")
        println(s"Received JUnit parameters: $testParams")
    }
}

内容的提问来源于stack exchange,提问作者cosminP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:02:02