Maven:BDD构建并将“插件”工件复制到程序文件夹,然后运行程序进行测试?

时间:2014-01-15 15:29:19

标签: java maven bdd

我正在为Java程序构建一个插件(我们称之为JavaProg)。该程序有一种机制,可以通过在运行时加载放置在程序安装文件夹中的JAR文件来扩展其行为:/ plugins。

我想使用Maven来构建插件,我想使用带有Cucumber的BDD(可能还有FEST)来驱动它的Swing GUI。基本上插件会在加载时向JavaProg添加新的菜单和按钮,我想通过JavaProgs GUI测试它们 - 当然这需要加载插件,这是核心问题。

开发插件时,我无权访问JavaProg的任何源文件。我唯一拥有的是一个JAR文件,其中包含一些我必须扩展的类以允许将插件加载到JavaProg中。但是,这提出了一个问题:如何设置Maven来处理这个问题?

基本上我想要这样的东西:

JavaProg-plugin(项目)

  • 包含插件的来源
  • 包含插件的单元测试(不依赖于JavaProg)
  • 可以构建为JAR文件(maven包)

AcceptanceTests(项目)

  • 包含黄瓜测试
  • 当被要求做“测试”时,Maven会:
    • 检查本地系统上是否安装了JavaProg,如果不是,则无法测试并将中止
    • 将JavaProg-plugin项目构建为JAR并将其复制到/ plugins
    • 使用Java启动JavaProg。它的主要类位于/javaprog.jar
    • 运行Cucumber测试,找到新启动的JavaProg窗口,单击其按钮,检查响应等等
    • 清理:从/ plugins
    • 删除插件

这是一个疯狂的想法还是可能的?我想通过GUI进行自动BDD测试,我认为这是最好的方法。我不知道Maven是否适合完成任务或如何开始。

2 个答案:

答案 0 :(得分:0)

答案一:检查应用是否在测试中运行。 这可以通过java完成。

创建一个java函数:

  1. 检查应用是否已安装并正在运行。如果你喜欢这个步骤,也可以安装程序并运行它。
  2. 删除任何旧版本的插件(如果有)
  3. 如果没有安装插件,请通过插件安装程序。
  4. 检查安装是否正常。
  5. 只需从所有测试中调用此函数即可。

    虽然这种方法可行,但我认为它可能会在一段时间后变得一团糟,因为JavaProg可能会构建未知状态。构建测试环境的方式通常是一个好主意,以免您从确定性的起点进行测试。这样可以更容易地推断出结果。

    接下来的两个答案是关于如何实现这一目标的建议。


    回答二:从maven内部运行JavaProg,而不是重用已安装的应用。 我相信从maven运行JavaProg并从maven内部对它进行测试会更好。这样,您将有一个干净的JavaProg运行安装,您的测试更有可能是威慑性的。我不知道这是否可能,但看起来你似乎是javaprog的作者,这可能是一个很好的解决方案。

    通常对于这些类型的设置,我倾向于在外部项目中执行此操作,而不是JavaProg插件项目的一部分。在插件中加入它们当然很容易,但它们更加整洁以保持它们的分离。

    组装应用
    让我们创建一个名为JavaProgPluginTest的新项目。 JavaProgPluginTest需要依赖于JavaProg。您可以使用maven-dependency-plugin将插件复制到./plugins forlder中。这必须在测试阶段之前的阶段完成。也许是编译阶段。 我在这里假设您的测试可以编译而不依赖于插件。如果你需要这个东西会变得有点棘手。

    运行测试
    由于我不是黄瓜专家,我将解释如何在JUnit中这样做 我会找到一种方法将应用程序作为我的测试中的静态依赖项。创建一个静态函数,如果它没有运行,则启动应用程序并等待它完成启动。在测试运行之前从测试内部调用它 然后你可以安全地运行测试。


    答案树:使用其他工具创建运行JavaProg的完整确定性计算机。然后反对它。
    在工作中,我们创建了一个设置,我们可以通过对Web服务的休息调用来订购新的虚拟机。这使我们能够创建一个设置,在运行测试之前我们从头开始创建一个完整的虚拟测试环境。它还有一个额外的好处,当测试失败时,我们有一个运行的虚拟环境来演示失败。这使得弄清楚出了什么问题变得容易多了。

    我们使用的解决方案基于珍珠和bash脚本,由jenkins控制。使用TAP方案将测试结果报告给詹金斯。

    使用这种方法,我们可以测试安装过程和许多运行时的东西。清理非常简单,因为我们只需要在不再有用时删除它。

答案 1 :(得分:0)

以下是使用maven-dependency-plugin在构建期间的各个阶段添加依赖项jar的示例:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.6</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>com.github.jsimone</groupId>
                                <artifactId>webapp-runner</artifactId>
                                <version>${webapp.runner.version}</version>
                                <destFileName>webapp-runner.jar</destFileName>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
                <execution>
                    <id>copy-new-relic</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <includeGroupIds>com.newrelic.agent.java</includeGroupIds>
                        <includeArtifactIds>newrelic-agent</includeArtifactIds>
                        <stripVersion>true</stripVersion>
                    </configuration>
                </execution>
            </executions>
        </plugin>