从IDE中运行远程服务器上的TestNG / JUnit集成测试

时间:2011-06-09 11:36:36

标签: java java-ee junit integration-testing testng

在我的IDE(Eclipse或NetBeans,无所谓)中,我有一些TestNG测试类(但我的问题还涉及远程JUnit测试),它们是Integration测试。这些测试需要集成服务器才能运行,它们无法在本地计算机上运行。他们需要集成服务器的完整环境 - 不仅是JavaEE容器相关的东西(=>没有Arquillian,也没有JEEUnit)。

现在我希望能够在我的IDE(Eclipse)中运行这些测试 - 最好使用TestNG插件 - 但是当我启动它们时,它们实际上应该在远程集成服务器上运行。

是否可以在IDE中从远程服务器上启动集成测试? 我喜欢在远程服务器上安装某种代理的想法,它等待测试请求并执行它们。但正如我所说,如果这是从TestNG插件内部运行的话会很好。

我是否需要某种解决方法,例如Ant脚本(希望不是)或某些Maven魔法?什么是最佳实践?

我知道我也可以为我的应用程序创建Webservices,然后我可以从本地单元测试中调用它们。但是我想知道是否还有没有Webservices的可能性。

4 个答案:

答案 0 :(得分:4)

您将如何实现这一点取决于您正在使用的集成服务器和IDE以及您的应用程序。我假设你正在使用Eclipse;我假设你正在使用Jenkins,因为IMO最容易让它做你想做的事。

大部分内容都可以直接使用。但是,有一点需要额外的工作。

您需要执行以下操作:

  1. 在Jenkins中设置一个名为“Integrated Testing”的名称(名称无关紧要)。将其配置为运行您希望能够从IDE运行的测试,并允许远程计算机触发构建。
  2. 使此作业成为参数化作业,并添加文件参数。让我们假设这被称为'TestingProgram'。这将是作业将要测试的程序。
  3. 使Integrated Test作业使用TestingProgram文件来运行测试。如果你的程序需要多个文件,那么假设这是一个包含所有必要文件的zip文件。
  4. 配置Eclipse项目以生成集成测试作业所需的相同文件(我假设已经发生了这种情况,因为它可能构建了某种程序的bin版本)
  5. 现在,将Eclipse连接到Jenkins稍微复杂一点。不幸的是,我认为没有任何预先存在的工具能够完全满足您的需求。好消息是使用自定义脚本实现它应该非常简单。所有脚本必须做的是:

    1. 如果您的程序需要多个文件,并且eclipse尚未执行此操作,则需要将这些文件压缩
    2. 需要获取文件并将其读入某个变量,然后对其进行base64编码。有很多库会为您处理大部分问题,例如this one。让我们假设这个文件被读入一个名为$programFile
    3. 的变量
    4. 需要向http://<your-jenkins-server>:8080/<integrated-testing-job-name>/buildwithparameters?TestingProgram=$programFile
    5. 发送HTTP请求

      您可以阅读有关使用the jenkins docs中的参数触发Jenkins远程构建的更多信息。

      完成这些步骤的脚本几乎可以是任何东西。鉴于您希望最终将其合并到IDE中,似乎最合乎逻辑的选择是ant脚本或Eclipse插件。两者都不会太复杂 - 蚂蚁脚本只会执行这些步骤,您可以将ant脚本导入到专门用于测试的Eclipse项目中 - 而插件只需添加一个菜单项,当在项目中运行时,它将执行该项目的上述步骤。

      注意:实际上有几种不同的方法可以使用Jenkins触发带参数的构建。例如,您可以执行POST请求,使用json传递参数,如我链接到的jenkins文档中所述,使用Jenkins CLI等。并非所有这些都使用文件参数,但您可以在所有文件参数中使用它们非常相似的方式 - 作为自定义脚本中的一个步骤,您将在Jenkins上执行远程构建,并传递您要用于测试的文件。例如,我给出的解释假设测试文件非常小;如果不是这种情况,您可能希望改为执行POST请求。如果使用一种方法遇到问题,应该很容易将其切换为使用效果更好的其他方法。

答案 1 :(得分:2)

不幸的是我没有现成的解决方案,但我想我可以给你一些提示,因为我花了一些时间思考这个问题。

我不知道TestNG,但JUnit能够插入自己的测试执行程序。我确信TestNG具有适当的功能。所以,找到它并熟悉它。由于您可以控制调用测试的方式,因此您甚至可以执行其他操作而不是调用测试用例的方法。例如,调用一些远程API,使测试远程运行。

显然,可以通过Web服务使远程代理(根据您的建议)在远程计算机上运行测试。这很好,但我更喜欢无代理或半无代理的解决方案。我的意思是什么?例如,如果您的远程计算机是Unix,则可以执行SSH或Telnet连接并运行命令行。在这种情况下,您可以创建mvn或ant脚本,使用ssh复制到远程计算机,然后运行它。该脚本将运行您的测试。所以它几乎没有代理。您只需要Java安装和SSH支持。

如果远程计算机是Windows,则可以使用Telnet或WMI。因此,如果安全性不是问题,但您需要跨平台支持,请使用Telnet。

如果您需要有关SSH / Telnet的更多帮助,请随时与我联系。

答案 2 :(得分:2)

我自己没有这样做(我的测试是本地测试),但这里有一些可行的方法:

  • Cargo可用于运行服务器并将模块部署到其中
  • 可以使用Cactus(相当旧)或JUnitEE来运行测试。在某些情况下,您使用JUnit实现测试并远程运行它们。另一个选择是编写测试以与服务器上的专用API进行交互,该API运行测试和报告。

答案 3 :(得分:2)

在我的解决方案中,我将在本地JNDI服务器上午餐并添加远程对象(对象实现Remote接口),然后您可以使用远程对象同步本地IDE和远程服务器或其他位置。