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

使用VintageTestEngine无法单独运行Spock数据驱动测试用例

无法通过VintageTestEngine单独运行Spock数据驱动测试的单个用例

最近在基于Spock做数据驱动测试时遇到了一个棘手的问题:使用VintageTestEngine时,没办法搜索并运行数据驱动测试方法生成的单个测试用例。

举个例子,我的AkeneoLoginPageTestSuite类里有一个测试方法,通过@Unroll和自定义数据源生成了4个不同的测试用例,命名格式是LoginPageTestSuite_加上parameters.TestCaseName的参数值,比如LoginPageTestSuite_TC_003_VerifyingLogin_LoginAndPassword。VintageTestEngine本身支持搜索指定测试方法运行,但当我尝试单独运行这些具体的测试用例时,完全没有反应。

问题根源分析

经过调试定位,问题出在org.junit.vintage.engine.discovery包下的MethodSelectorResolver类的shouldRun方法中。这个方法的逻辑是通过比较desiredDescription和description是否相等来判断是否执行测试,但这里存在一个不匹配:

  • desiredDescription是我指定的具体测试用例名称
  • description却是测试方法的模板名LoginPageTestSuite_#parameters.TestCaseName

两者不相等,所以方法返回false,导致目标测试用例无法被匹配执行。

相关代码示例

Spock测试类

package TestSuites.LoginPageTestSuite
import Assertions.LoginPageAsserts
import DataSourceExtensions.TestDataSource
import Model.LoginPageData
import PageObjects.LoginPageObject
import TestSuites.BaseTest
import com.google.common.base.Strings
import org.junit.jupiter.api.DisplayName
import org.openqa.selenium.WebDriver
import org.openqa.selenium.chrome.ChromeDriver
import spock.lang.Shared
import spock.lang.Unroll

class AkeneoLoginPageTestSuite extends BaseTest{
 @TestDataSource(TestSourcePath = "TestSuites/TestCaseData/LoginPageTestCaseData.json")
 private @Shared List<LoginPageData> _testCaseData
 private LoginPageObject _loginPage

 @DisplayName(value = "LoginPageTestSuite_#parameters.TestCaseName")
 @Unroll
 def "LoginPageTestSuite_#parameters.TestCaseName"(LoginPageData parameters) {
 given:
 _loginPage = new LoginPageObject()
 when:
 _loginPage.FillUserNameAndPassword(parameters.UserName, parameters.Password)
 then:
 if(!Strings.isNullOrEmpty(parameters.InvalidLoginMessage))
 LoginPageAsserts.VerifyingLoginPageMessageBox(
 parameters.InvalidLoginMessage, _loginPage.getIncorrectLoginMessageBoxText())
 where:
 parameters << _testCaseData
 }

测试执行类

package Runners
import Configurations.Configuration
import org.junit.platform.engine.EngineDiscoveryRequest
import org.junit.platform.engine.ExecutionRequest
import org.junit.platform.engine.TestDescriptor
import org.junit.platform.engine.UniqueId
import org.junit.platform.engine.discovery.MethodSelector
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder
import org.junit.vintage.engine.VintageTestEngine

class AkeneoRunner {
 static void main(String[] args){
 new Configuration()
 VintageTestEngine engine = new VintageTestEngine()
 EngineDiscoveryRequest discovery = LauncherDiscoveryRequestBuilder.request().selectors(
 new MethodSelector(Class.forName("TestSuites.LoginPageTestSuite.AkeneoLoginPageTestSuite"), "LoginPageTestSuite__TC_003_VerifyingLogin_LoginAndPassword"))
 .build()
 UniqueId root = UniqueId.root("LoginPageTestSuite__TC_003_VerifyingLogin_LoginAndPassword", "LoginPageTestSuite__TC_003_VerifyingLogin_LoginAndPassword")
 TestDescriptor testDescriptor = engine.discover(discovery, root)
 engine.execute(new ExecutionRequest(testDescriptor, new NoOpEngineExecutionListener(), new NoConfigurationParameters()))
 }
}

pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>org.akeneo.groovy</groupId>
 <artifactId>AkeneoGroovy</artifactId>
 <version>1.0-SNAPSHOT</version>
 <name>AkeneoGroovy</name>
 <properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <maven.compiler.source>1.7</maven.compiler.source>
 <maven.compiler.target>1.7</maven.compiler.target>
 </properties>
 <dependencies>
 <dependency>
 <groupId>org.spockframework</groupId>
 <artifactId>spock-core</artifactId>
 <version>1.3-groovy-2.5</version>
 <scope>compile</scope>
 </dependency>
 <dependency>
 <groupId>org.seleniumhq.selenium</groupId>
 <artifactId>selenium-java</artifactId>
 <version>3.141.59</version>
 </dependency>
 <dependency>
 <groupId>org.yaml</groupId>
 <artifactId>snakeyaml</artifactId>
 <version>1.25</version>
 </dependency>
 <dependency>
 <groupId>com.microsoft.sqlserver</groupId>
 <artifactId>mssql-jdbc</artifactId>
 <version>6.1.0.jre8</version>
 </dependency>
 <dependency>
 <groupId>org.apache.logging.log4j</groupId>
 <artifactId>log4j-core</artifactId>
 <version>2.12.0</version>
 </dependency>
 <dependency>
 <groupId>commons-pool</groupId>
 <artifactId>commons-pool</artifactId>
 <version>1.6</version>
 </dependency>
 <dependency>
 <groupId>commons-io</groupId>
 <artifactId>commons-io</artifactId>
 <version>2.6</version>
 </dependency>
 <dependency>
 <groupId>commons-dbcp</groupId>
 <artifactId>commons-dbcp</artifactId>
 <version>1.4</version>
 </dependency>
 <dependency>
 <groupId>org.junit.platform</groupId>
 <artifactId>junit-platform-engine</artifactId>
 <version>1.7.0-M1</version>
 <scope>test</scope>
 </dependency>
 <dependency>
 <groupId>org.junit.jupiter</groupId>
 <artifactId>junit-jupiter</artifactId>
 <version>RELEASE</version>
 <scope>test</scope>
 </dependency>
 <dependency>
 <groupId>org.junit.platform</groupId>
 <artifactId>junit-platform-launcher</artifactId>
 <version>1.7.0-M1</version>
 <scope>test</scope>
 </dependency>
 <dependency>
 <groupId>org.junit.vintage</groupId>
 <artifactId>junit-vintage-engine</artifactId>
 <version>5.7.0-M1</version>
 <scope>test</scope>
 </dependency>
 </dependencies>
 <build>
 <pluginManagement>
 <plugins>
 <plugin>
 <artifactId>maven-clean-plugin</artifactId>
 <version>3.1.0</version>
 </plugin>
 <plugin>
 <artifactId>maven-resources-plugin</artifactId>
 <version>3.0.2</version>
 </plugin>
 <plugin>
 <artifactId>maven-compiler-plugin</artifactId>
 <version>3.8.0</version>
 </plugin>
 <plugin>
 <artifactId>maven-surefire-plugin</artifactId>
 <version>2.22.1</version>
 </plugin>
 <plugin>
 <artifactId>maven-jar-plugin</artifactId>
 <version>3.0.2</version>
 </plugin>
 <plugin>
 <artifactId>maven-install-plugin</artifactId>
 <version>2.5.2</version>
 </plugin>
 <plugin>
 <artifactId>maven-deploy-plugin</artifactId>
 <version>2.8.2</version>
 </plugin>
 <plugin>
 <artifactId>maven-site-plugin</artifactId>
 <version>3.7.1</version>
 </plugin>
 <plugin>
 <artifactId>maven-project-info-reports-plugin</artifactId>
 <version>3.0.0</version>
 </plugin>
 </plugins>
 </pluginManagement>
 </build>
</project>

内容的提问来源于stack exchange,提问作者Michał Cichoń

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:27:52