当前位置: 首页 > 知识库问答 >
问题:

如何配置Surefire以包括*Spec Spock测试?

甄霖
2023-03-14

我怎样才能确保某些测试是在Maven构建中执行的,而不是被默默忽略?

我最近被迫切换到Groovy 3。因此,我也更新了我的斯波克版本。不幸的是,我忽略了Spock2需要JUnit5的事实。我只有JUnit 4和Spock测试,因此Maven Surefire插件使用JUnit 4提供程序来执行测试。所有斯波克试验均被忽略。我只是碰巧注意到了这一点。

我正在寻找一种方法来检查某些(或任何)以*Spec结尾的测试是否在执行的测试中。我看了看Maven Surefire和Maven执行者插件,但找不到任何适合我需要的东西。如果我完全跳过测试执行,则此检查不应失败。

编辑:这是Spock示例项目的缩短版本,因为kriegaex建议发布一些pom.xml文件。然而,这个问题适用于所有Java项目。对我来说,在项目本身的构建过程中的解决方案将优于配置CI/CD作业,因为在将项目移动/迁移到另一个CI管道时,这很容易被遗忘。

<?xml version="1.0"?>
<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.spockframework</groupId>
  <artifactId>spock-example</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>Spock Framework - Example Project</name>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <groovy.version>3.0.7</groovy.version>
  </properties>

  <build>
    <plugins>
      <!-- Mandatory plugins for using Spock -->
      <plugin>
        <!-- The gmavenplus plugin is used to compile Groovy code. To learn more about this plugin,
        visit https://github.com/groovy/GMavenPlus/wiki -->
        <groupId>org.codehaus.gmavenplus</groupId>
        <artifactId>gmavenplus-plugin</artifactId>
        <version>1.12.0</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>compileTests</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <!-- Optional plugins for using Spock -->
      <!-- Only required if names of spec classes don't match default Surefire patterns (`*Test` etc.) -->
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          <useModulePath>false</useModulePath> <!-- https://issues.apache.org/jira/browse/SUREFIRE-1809 -->
          <useFile>false</useFile>
          <includes>
            <include>**/*Test</include>
            <include>**/*Spec</include>
          </includes>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.spockframework</groupId>
        <artifactId>spock-bom</artifactId>
        <version>2.0-M5-groovy-3.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <!-- Mandatory dependencies for using Spock -->
    <dependency>
      <groupId>org.spockframework</groupId>
      <artifactId>spock-core</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.spockframework</groupId>
      <artifactId>spock-junit4</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

共有1个答案

窦华晖
2023-03-14

很抱歉对spock-junit4产生误解。如果您想在Spock 2下运行JUnit 4扩展,比如PowerMock runner,您只需要使用它。如果你想在Spock 2测试之外运行JUnit 4测试,你需要org。朱尼特。vintage:junit vintage引擎:Spock 2.0-M5的5.7.1。添加这种依赖性,为我修复你的POM。

然而,我冒昧地升级到了Spock 2.0决赛、Groovy 3.0.8和JUnit 5.7.2,所有这些都与Spock 2.0保持一致。如果使用默认的Maven目录布局,并将Spock规范命名为src/test/groovy/*test,而不是*Spec,甚至可以不使用Surefire类名过滤器。但是,您应该指定Java源代码和目标级别。没有它们,我的JDK抱怨默认的1.5版本。

<?xml version="1.0"?>
<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.spockframework</groupId>
  <artifactId>spock-example</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>Spock Framework - Example Project</name>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <groovy.version>3.0.8</groovy.version>
  </properties>

  <build>
    <plugins>
      <!-- Mandatory plugins for using Spock -->
      <plugin>
        <groupId>org.codehaus.gmavenplus</groupId>
        <artifactId>gmavenplus-plugin</artifactId>
        <version>1.12.0</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>compileTests</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          <useModulePath>false</useModulePath> <!-- https://issues.apache.org/jira/browse/SUREFIRE-1809 -->
        </configuration>
      </plugin>
    </plugins>
  </build>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.spockframework</groupId>
        <artifactId>spock-bom</artifactId>
        <version>2.0-groovy-3.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>org.junit</groupId>
        <artifactId>junit-bom</artifactId>
        <version>5.7.2</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>org.spockframework</groupId>
      <artifactId>spock-core</artifactId>
      <scope>test</scope>
    </dependency>
    <!-- Required if you want to run JUnit 4 tests alongside Spock 2 -->
    <dependency>
      <groupId>org.junit.vintage</groupId>
      <artifactId>junit-vintage-engine</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

附言:事实上,首先我想把你的问题作为那个问题的重复来结束。但因为从那以后版本号有了一些变化,我想我会在这里发布一个新的答案,以方便大家。

更新:您可以通过添加. java. class扩展来修复问题中的过滤器,从而确保名为*Test*Spec的睾丸都被执行。奇怪的是,. groovy不起作用,这是一个众所周知的Surefire怪癖。

<includes>
  <include>**/*Test.class</include>
  <include>**/*Spec.class</include>
</includes>

<includes>
  <include>**/*Test.java</include>
  <include>**/*Spec.java</include>
</includes>
 类似资料:
  • 现有结构:src/test/java-- 更新:我也尝试了构建助手插件 现在,如果我运行“测试”目标,我看到添加了C:\Developer\Code\myProj\rc\test\groovy。 但是我没有看到任何为groovy文件生成的类。 最后的答案,感谢@khmarbaise,我刚刚升级了版本,并删除了GMaven编译

  • 我目前有一个maven Web项目,我正在尝试为其编写集成测试。对于项目的结构,我在src/test/java下定义了测试存根,而这些存根的Spring bean定义位于src/test/资源下。 我想做的是,当我构建我的war工件时,我希望所有的测试存根类都被编译并与Springbean定义文件一起包含在war中。我曾尝试使用maven war插件来实现这一点,但我唯一能够复制的就是资源。简单地

  • 问题内容: 我想开始为我的Python代码编写单元测试,而py.test框架听起来比Python捆绑的unittest更好。因此,我在项目中添加了“ tests”目录,并在其中添加了test_sample.py。现在,我想配置PyCharm以运行“ tests”目录中的所有测试。 据称,PyCharm在其测试运行程序中支持py.test。您应该能够创建运行/调试配置来运行测试,并且PyCharm据

  • 包括和配置模块 某些模块只能用于特定功能。 pap模块就是这样,仅用于身份验证。 相反,sql模块可用于授权,会话检查以及记帐。 这完全取决于模块作者所包含的功能。 sql模块(rlm_sql.so)使用子模块。 这创建了一个抽象层。 根据主sql模块的配置方式,它将使用特定的子模块与某种类型的数据库进行交互。 子模块可用于连接MySQL(rml_sql_mysql.so),PostgreSQL(

  • 我目前对Java和cucumber有一个问题。通过使用硒访问网站的元素,我想使用以下短语: 该示例非常简单,通过使用Java注释,可以很好地处理每个属性名 除了以下用例:属性名包含类似于的括号。 在使用Eclipse和JUnit时,使用包含类似括号的字符串的Cucumber测试甚至不能完全识别,而只能识别开头括号之前的字符串部分。有什么想法或解决方案吗?

  • 我试图将Jenkins配置为包括运行JUnit测试的构建后步骤,但遇到了一个错误: 詹金斯步骤本身就显示了一个问题: 这并不奇怪,因为我在targets下没有surefire-reports子文件夹,而且我不知道要生成xml报表必须做什么。我对Java、Maven、Eclipse、Linux-一切都是新手--而且是独自工作。 我看到了关于设置这个后期构建步骤的内部说明,但现在我需要知道如何使其工作