【问题标题】:How can I test a maven archetype that I've just created?如何测试我刚刚创建的 Maven 原型?
【发布时间】:2011-05-04 05:11:27
【问题描述】:

我已经为一个项目创建了一些原型,目前可以正常工作,但我希望能够验证从原型生成的代码在未来是否可以继续工作。

我想要的是原型构建的一个阶段,它采用刚刚创建的原型,在其上运行mvn archetype:generate,然后在生成的代码上运行mvn verify,以验证生成的代码实际上是否正常。如果需要,我会编写自己的 mojo 来执行此操作,但想看看是否已经存在解决方案。我看到了 archetype:integration-test 目标,但它似乎没有按照我的意愿行事。

【问题讨论】:

    标签: java maven-2 archetypes


    【解决方案1】:

    2013 年更新:现在这比其他答案建议的要容易得多。

    https://issues.apache.org/jira/browse/ARCHETYPE-334于2011年8月完成

    要使用,只需将单词install 放在上面提到的goal.txt 文件中,您正在原型化的项目中的测试将作为正常构建的一部分被调用。 (对于 OP,和/或 verify。)

    但是,如果您是制作原型的新手,请注意 this popular mini-guide 已过时,虽然它可以用于制作原型,但它不能用于运行原型集成测试。您应该按照here 的描述创建一个archetype-metadata.xml 文件。 (这也更好用,因为它使用文件集!)

    另请注意,这些集成测试不会响应-DskipTests,但这可以通过以下方式进行补救:

    <build>
      <plugins>
    
        <plugin>
          <artifactId>maven-archetype-plugin</artifactId>
          <version>2.2</version>
          <configuration>
            <skip>${skipTests}</skip>
          </configuration>        
        </plugin>
    
      </plugins>
    </build>
    

    (虽然这个 看起来 好像跳过了整个插件,但它实际上可以工作,可能是因为它回退到旧模式;而我找不到任何成功的方法来跳过 integration-test使用上面的代码执行目标。)

    【讨论】:

    • 这种方法的唯一问题是您似乎只做一个目标而不是多个目标(例如安装站点)
    • 如果包含goal.txt文件示例,这个答案会更有用,因为现在“上面”在下面。
    【解决方案2】:

    我自己对此有点挣扎,并认为在使用当前 v2.3 的 maven-archetype-plugin 时,除了 src/test/resources/projects/first/goal.txt 之外,还需要一个 src/test/resources/projects/first/archetype.properties 包含这样的内容:

    sourceEncoding=UTF-8
    groupId=integrationtest.group
    artifactId=integrationtest.artifactId
    version=1.0.0-SNAPSHOT
    package=org.eclipse.xtend.xtend-archetype.integrationtest
    packageInPathFormat=org/eclipse/xtend/xtend-archetype/integrationtest
    

    This pull request 说明了一个完整的工作示例。

    【讨论】:

    • 我似乎无法让它工作。您需要做的不仅仅是添加文件吗?我期待原型在mvn clean compile 期间运行集成测试,但它似乎完全跳过了它们。
    • @Lucas 上面链接的完整工作示例确实有效。如果我是你,我会环顾四周,例如在 GitHub 上,还有其他示例,我相信你会明白的!
    • 我确实得到了一些工作,但是我确实必须将 &lt;phase&gt; 添加到原型 integration-test 目标中,我不确定这是否是 maven 的另一个问题的症状 not自动执行这些测试。您通常如何调用这些测试? Maven 似乎完全忽略了我的 goals.txt 文件。我已将我的原型迁移到使用archetype-metadata.xml 而不是archetype.xml,这似乎没有什么不同。
    • @Lucas integration-test 阶段仅出现在 compile 阶段之后。如果您想在构建过程中运行原型集成测试,您需要运行installdeploy。参考:maven.apache.org/guides/introduction/…
    【解决方案3】:

    除了使用 maven-invoker-plugin 的方法之外,我们还使用了不同的方法。在 Maven 验证器的帮助下,您可以轻松地测试您的 Maven 插件和原型。 只需将以下依赖项添加到您的 maven 测试项目的 pom 中:

    <dependency>                                
      <groupId>org.apache.maven.shared</groupId>
      <artifactId>maven-verifier</artifactId>   
      <version>1.2</version>                    
    </dependency>                               
    

    现在你可以使用了

    org.apache.maven.it.Verifier
    

    进入您的正常 JUnit 测试。使用验证器,您可以运行 maven 目标和一些关于结果的断言。 有关完整示例,只需查看我们的 javascript-archetypes 的集成测试 maven 模块: https://github.com/akquinet/javascript-archetypes

    【讨论】:

      【解决方案4】:

      我看到了 archetype:integration-test 目标,但它似乎并没有达到我想要的效果。

      除非我误解了你想要的什么archetype:integration-test 目标似乎是一个非常好的解决方案:

      执行原型集成 测试,包括创建一个 当前原型的项目 具有定义的属性和可选的 与参考副本的比较。一个 IT 由一个目录组成 src/test/资源/项目 包含:

      • goal.txt(内容实际上没有使用,但未来版本应该会解释它 作为针对生成的目标运行的目标 项目:见ARCHETYPE-334),
      • archetype.properties 带有用于项目生成的属性,
      • 可选的参考/目录包含参考副本 由 IT 创建的预期项目。

      根据上面的描述,这个目标允许精确地运行集成测试来检查使用当前原型生成的项目是否符合预期结果,这看起来像是一种干净、简单、自包含的测试原型的方法。

      为什么这种方法不令人满意?我错过了什么?

      【讨论】:

      • archetype:integration-test 实际上并没有构建或测试生成的代码,这正是我想要的。这就是我现在意识到功能 334 的意义所在。
      • @mes5k:啊,我想我现在了解您想要做什么,即从生成的项目运行测试。我在最初的问题中并不清楚。
      【解决方案5】:

      我想这将是像 hudson 这样的持续集成服务器的场景。

      你会定义一个工作

      1. 清空目录(shell 脚本)
      2. 根据原型创建一个新项目 (mvn archetype:generate)
      3. 运行项目(mvn包)

      虽然这可能可能以某种方式适合一个 maven 生命周期,但感觉就像一团糟。请改用 CI。

      【讨论】:

      • 这可行,但我认为这是一个后备解决方案。问题是我不会发现我的模板代码被破坏了,直到它被提交之后,我宁愿避免。此外,在 maven 中调用 maven 正是 maven-release-plugin 所做的,所以这并不稀奇。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多