【问题标题】:Run JUnit tests from a dependency jar in Eclipse从 Eclipse 中的依赖项 jar 运行 JUnit 测试
【发布时间】:2012-08-23 22:33:53
【问题描述】:

我有一些 JUnit 测试包含在 .jar 中,旨在用作库。该库包含一些在其他项目中使用该库时应运行的测试。

但是,当我使用该库创建一个新项目并在 Eclipse 中在其上运行 JUnit 时,依赖项 .jar 中的测试不会运行/不会被 JUnit 测试运行程序检测到。我收到消息:

No tests found with test runner 'JUnit 4'.

有没有办法可以配置依赖项.jar,以便测试与主项目中可能包含的任何测试一起运行?

基本上我希望依赖 .jar 将测试“导出”到它所使用的任何项目中。

我正在使用 Eclipse Juno、JUnit 4.10 和 Maven 进行依赖管理。

编辑:

这个库的重点是能够帮助测试使用它的项目 - 即它运行一些专门的测试。这就是为什么我希望能够导入库 .jar 并让它为导入项目贡献额外的测试。

【问题讨论】:

    标签: java eclipse unit-testing maven junit


    【解决方案1】:

    你可以试试Maven Surefire

    在某些情况下,拥有一组使用各种依赖配置运行的测试会很有用。实现此目的的一种方法是拥有一个包含单元测试并生成测试 jar 的项目。然后,几个测试配置项目可以使用单元测试并使用不同的依赖集运行它们。问题是没有简单的方法可以在依赖项 jar 中运行测试。 Surefire 插件应该有一个配置,允许我运行包含在依赖项 jar 中的所有或一组单元测试。

    这可以按如下方式完成(Junit 3):

    确保测试 jar 包含一个具有静态 suite() 方法的类

    import junit.framework.Test;
    import junit.framework.TestSuite;
    
    public class AllTests {    
        public static Test suite() 
        { 
            TestSuite suite = new TestSuite( "All Tests"); 
            suite.addTestSuite(TestOne.class); 
            suite.addTestSuite(TestTwo.class); 
            return suite; 
        }    
    }
    

    然后在项目中使用test-jar依赖: 创建一个TestCase

    package org.melati.example.contacts;
    import org.melati.poem.AllExportedTests;
    import junit.framework.Test;
    import junit.framework.TestCase;
    
    public class PoemTest extends TestCase {    
        public static Test suite() 
        { 
            return AllExportedTests.suite(); 
        }
    }
    

    现在将找到测试。

    【讨论】:

      【解决方案2】:

      我认为制作单元测试库(@Test 带注释的方法)是个坏主意。但是,制作一个可重用的测试组件库是一个不错的选择。我们已经在几个开源项目中做到了这一点,您可以看看它是如何工作的。

      1. 一个 Maven 模块从src/mock/java 目录导出测试组件(我们称它们为“模拟”)。导出的工件具有-mock 分类器。请参阅rexsl/pom.xml(注意突出显示的行)。

      2. 正在将模拟工件与常用工件一起部署到 Maven Central:http://repo1.maven.org/maven2/com/rexsl/rexsl-core/0.3.8/(注意 ...-mock.jar 文件)

      3. 需要模拟的模块可以将它们作为通常的工件包含,例如rexsl-core/pom.xml(请参阅突出显示的行):

      4. 然后,在您的单元测试中,只需使用该模拟库中的类,就像常规模拟构建器一样,例如:BulkHttpFeederTest

      这就是您可以以一种优雅的方式使您的测试工件可重用的方法。希望对您有所帮助。

      【讨论】:

        【解决方案3】:

        @Mikera,

        我发现这可能会对您有所帮助。只需将 Testcase 类扩展到项目中的一个 java 类,您就可以运行该特定类以将其作为 JUnit 测试运行。

        【讨论】:

          【解决方案4】:

          我不确定这是可取的 - 一方面,如果您使用 jar,它的行为可能会受到外部环境的影响,例如类路径中的其他库。从 jar 内部,没有简单的方法可以分析此上下文并相应地调整测试。另一方面,如果您编写和编译一个库,您应该在将其打包为 jar 之前对其进行测试。您甚至可能不想包含您的测试。

          如果再次运行测试对您来说真的很重要,我会对在不更改 jar 的情况下会导致测试失败的原因感兴趣。但是,在这种情况下,您可能想要扩展 testrunner。据我所知,它使用反射。您可以很容易地在类加载器中加载 jar 并浏览它们的所有类。通过反射,您可以识别测试类并组装测试套件。您可以查看 testrunner 作为示例。尽管如此,您仍需要从外部开始此过程,例如从客户端项目中的一个测试类内部。在这里,QATest 的方法可能会有所帮助:通过提供覆盖版本的 testsuite 或 testrunner,您可以自动执行此操作 - 如果客户端使用您覆盖的 API。

          如果这种相当昂贵的方法似乎适用于您的场景,请告诉我,我可以提供代码示例。

          【讨论】:

          • 在这种情况下,我希望测试受到外部上下文的影响 - 即,目的是让人们可以导入库并让它提供额外的运行测试他们的整个项目。
          • 好吧,但是外部项目有关于上下文的知识。为 facade 提供一些基础设施可能会“更干净”,从而使外部项目中的测试更容易。为什么自动执行测试如此重要?这可能会让您的图书馆客户感到非常不安?如果它不太重要,请在文档中添加最佳实践并让用户执行测试,例如通过运行库的 AllTests.java。
          【解决方案5】:

          为什么jar的用户要运行jar里面的测试用例!!!当jar打包交付时,就意味着单元测试运行成功。 通常,jar 本身应该被视为一个单独的项目或模块之一。在这两种情况下,单元测试用例都会在交付之前运行。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-05-16
            • 2014-02-21
            • 2014-01-18
            • 2013-09-11
            • 1970-01-01
            • 1970-01-01
            • 2013-07-17
            • 1970-01-01
            相关资源
            最近更新 更多