Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Maven:BDD构建并将“插件”工件复制到程序文件夹,然后运行程序进行测试?_Java_Maven_Bdd - Fatal编程技术网

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

Java Maven:BDD构建并将“插件”工件复制到程序文件夹,然后运行程序进行测试?,java,maven,bdd,Java,Maven,Bdd,我正在为Java程序构建一个插件,我们称之为JavaProg。该程序有一种机制,可以通过在运行时加载JAR文件来扩展其行为,JAR文件放在程序安装文件夹:/plugins中 我想使用Maven来构建插件,我想使用BDD和Cucumber with FEST来驱动它的Swing GUI。基本上,插件在加载时会向JavaProg添加新的菜单和按钮,我想通过JavaProgsGUI测试这些菜单和按钮——当然这需要加载插件,这是核心问题 在开发插件时,我无法访问JavaProg的任何源文件。我唯一拥有的

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

我想使用Maven来构建插件,我想使用BDD和Cucumber with FEST来驱动它的Swing GUI。基本上,插件在加载时会向JavaProg添加新的菜单和按钮,我想通过JavaProgsGUI测试这些菜单和按钮——当然这需要加载插件,这是核心问题

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

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

JavaProg插件项目

包含插件的源代码 包含插件的单元测试,该插件不依赖于JavaProg 可以构建为JAR文件maven包 验收测试项目

包含黄瓜测试 当被要求进行测试时,Maven将: 检查本地系统上是否安装了JavaProg,如果未安装,则无法测试并将中止 将JavaProg插件项目构建为JAR,并将其复制到/plugins 用Java启动JavaProg。它的主类位于/javaprog.jar中 运行Cucumber测试,找到新启动的JavaProg窗口,单击其按钮,检查响应,等等 清理:从/plugins中删除插件 这是一个疯狂的想法还是可能的?我想通过GUI进行自动BDD测试,我认为这是最好的方法。我只是不知道Maven是否适合这项任务,也不知道如何启动。

回答一:检查应用程序是否通过测试运行。 这可以通过java实现

创建一个java函数,该函数:

检查应用程序是否已安装并正在运行。如果您喜欢此步骤,还可以安装程序并运行它。 删除插件的任何旧版本(如果有) 如果插件未安装,请执行插件安装程序。 检查安装是否正常。 只需在所有测试中调用此函数

虽然这种方法是可行的,但我认为它可能会在一段时间后变得一团糟,因为JavaProg可能会建立未知状态。通常,最好以一种避免从确定的起点进行测试的方式来构造测试环境。这使得对结果进行推理变得容易得多

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

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

通常对于这些类型的设置,我倾向于在外部项目中进行设置,而不是在JavaProg插件项目中进行设置。当然,在插件中加入它们很容易,但是将它们分开会更整洁

组装应用程序 让我们创建一个名为JavaProgPluginTest的新项目。JavaProgPluginTest需要依赖于JavaProg。您可以使用将插件复制到./plugins-forlder。这必须在测试阶段之前的一个阶段完成。这是编译阶段。 我在这里假设您的测试可以在不依赖插件的情况下编译。如果你需要这些东西,那就变得更棘手一些

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

答案树:使用其他工具创建运行JavaProg的完整确定性机器。那就和它对抗吧。 在工作中,我们创建了一个设置,可以通过对Web服务的rest调用订购新的虚拟机。这使我们能够创建一个设置,在运行测试之前,从零开始创建一个完整的虚拟测试环境。它还有一个额外的好处,即当测试失败时,我们有一个正在运行的虚拟环境来演示失败。这使得找出问题所在变得容易得多

我们使用的解决方案基于pearl和bash脚本,由jenkins控制。使用TAP协议将测试结果报告给jenkins

使用这种方法,我们可以测试安装过程和许多运行时的东西。清理很容易,因为我们只需要在wm不再使用时删除它
完整。

以下是使用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>