如何从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
相关产品推荐
相关产品推荐

