如何区分“运行所有测试”和“仅运行此测试”?

时间:2010-10-08 12:48:20

标签: java unit-testing performance testing skip

我的测试运行非常慢,比如一个导出大型数据库以测试导出内存泄漏代码的测试。我希望在我常用的测试套件中进行这些测试,但除非满足其中一个条件,否则应忽略它们:

  1. 测试正在CI服务器上运行
  2. 用户已在IDE中选择此测试并运行它
  3. #1的解决方案很简单:使用属性并跳过测试(如果未设置)。

    但我怎么能实现#2?

    [编辑]这是特定于Java的。我正在使用JUnit 4和Eclipse。

2 个答案:

答案 0 :(得分:1)

  

我的测试运行速度非常慢,比如一个导出大型数据库的测试,用于测试导出内存泄漏的代码。

虽然有用,但它们不是单元测试,如单元测试标记所示。

如果出现以下情况,则测试不是单元测试:

  • 与数据库对话
  • 通过网络进行通信
  • 它触及文件系统
  • 它不能与任何其他单元测试同时运行
  • 您必须对您的环境执行特殊操作(例如编辑配置文件)才能运行它。

做这些事情的测试并不坏,当然值得写。它们甚至可以使用单元测试框架编写。但是,能够将它们与真正的单元测试分开是很重要的,这样您可以保留一组测试,以便在进行更改时可以快速运行,特别是在TDD周期中,您希望从失败的测试转到通过测试尽可能快。

如果您使用的是Makefile,那么您可以拥有check目标用于真正的单元测试,以及livecheck目标用于这些缓慢的系统测试。

如何单独运行每个测试取决于您的框架。

答案 1 :(得分:1)

我们使用Maven,它与Eclipse很好地集成。我们使用JUnit

  • 单元测试,以Test为前缀或后缀,并在每个完整版本上运行
  • 集成测试,前缀为IntegrationTest。这些仅在通过命令行开关(-PintegrationTests)激活特殊Maven配置文件时运行。

完整的集成测试集每天在CI服务器上运行三次,或由明确指定上述配置文件(mvn test -PintegrationTests)的开发人员运行。单个集成测试当然可以由IDE中的程序员随时运行。

这是pom.xml

的相关部分
<profiles>
    <profile>
        <id>integrationTests</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                           <includes>
                                <include>**/Test*.java</include>
                                <include>**/*Test.java</include>
                                <include>**/IntegrationTest*.java</include>
                         </includes>
                      </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>