我正在为Java程序构建一个插件(我们称之为JavaProg)。该程序有一种机制,可以通过在运行时加载放置在程序安装文件夹中的JAR文件来扩展其行为:/ plugins。
我想使用Maven来构建插件,我想使用带有Cucumber的BDD(可能还有FEST)来驱动它的Swing GUI。基本上插件会在加载时向JavaProg添加新的菜单和按钮,我想通过JavaProgs GUI测试它们 - 当然这需要加载插件,这是核心问题。
开发插件时,我无权访问JavaProg的任何源文件。我唯一拥有的是一个JAR文件,其中包含一些我必须扩展的类以允许将插件加载到JavaProg中。但是,这提出了一个问题:如何设置Maven来处理这个问题?
基本上我想要这样的东西:
JavaProg-plugin(项目)
AcceptanceTests(项目)
这是一个疯狂的想法还是可能的?我想通过GUI进行自动BDD测试,我认为这是最好的方法。我不知道Maven是否适合完成任务或如何开始。
答案 0 :(得分:0)
答案一:检查应用是否在测试中运行。
这可以通过java完成。
创建一个java函数:
只需从所有测试中调用此函数即可。
虽然这种方法可行,但我认为它可能会在一段时间后变得一团糟,因为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>