使用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ń
相关产品推荐
相关产品推荐

