【问题标题】:java continuous testing outside of IDEIDE之外的java连续测试
【发布时间】:2014-03-19 10:55:09
【问题描述】:

我有一堆 Java 单元测试,我想将一个持续测试框架集成到我的代码库中。理想情况下,我想编写一个 Maven / Ant 目标或 bash 脚本,只要它正在监视的文件发生变化,它就会开始运行测试。到目前为止,我已经查看了几个选项(Infinitest、JUnit Max),但它们似乎都想作为 IDE 插件运行。

我使用仅限 CLI 的工具的动机是我的同事使用广泛的文本编辑器和 IDE,但我想确保任何人都可以持续运行测试。

编辑:我没有考虑 Jenkins 或其他更典型的 CI 解决方案有几个原因:

  • 我们已经有了一个 CI 构建工具,用于在每次推送后运行单元和集成测试。
  • 它们隐藏了测试的运行时间(因为它们是异步运行的),让测试变得越来越慢,而人们并没有真正注意到。
  • 它们通常仅在您的存储库位于某个中心位置时才运行测试。我希望在编辑时运行单元测试,而不是在我已经将代码推送到某个地方之后。我越早运行测试,我就能越早修复我在编辑时犯的任何错误。我们的 JavaScript 团队很喜欢一个类似的工具,引用了 3 倍的迭代单元测试开发速度。

【问题讨论】:

  • 您打算如何查看测试结果?您不需要仪表板来发现测试失败吗?建议的 CI 解决方案似乎可以满足您的要求,因为它可以监控您的(本地)SCM 并呈现当前的测试结果。你必须在你自己的机器上运行一个私有实例(Jenkins 很适合,它非常轻量级,只有一个 WAR 文件)。当与提供更改挂钩的 SCM 结合使用时,您应该会得到所需的内容。
  • 我会让一个进程在后台运行,它会在测试失败时打印出来。

标签: java junit continuous-integration continuous-testing infinitest


【解决方案1】:

我正在为此使用连续轮询目录更改解决方案。 (通用代码:http://www.qualityontime.eu/articles/directory-watcher/groovy-poll-watcher/(匈牙利语,但源代码是英文))

用于编译基于 nanoc 的站点的定制解决方案。查看并根据您的需要进行定制。 (时髦)

def job = {
  String  command = /java -jar jruby-nanoc2.jar -S nanoc compile/
  println "Executing "+command
  def proc = command.execute()
  proc.waitForProcessOutput(System.out, System.err)
}

params =  [
  closure: job,
  sleepInterval: 1000,
  dirPath: /R:\java\dev\eclipse_workspaces\project\help\content/
]

import groovy.transform.Canonical;

@Canonical
class AutoRunner{
  def closure
  def sleepInterval = 3000
  // running for 8 hours then stop automatically if checking every 3 seconds
  def nrOfRepeat = 9600 
  def dirPath = "."
  long lastModified = 0

  def autorun(){
    println "Press CTRL+C to stop..."
    println this
    def to_run = {
      while(nrOfRepeat--){
        sleep(sleepInterval)
        if(anyChange()){
          closure()
        }
      }
    } as Runnable
    Thread runner = new Thread(to_run)
    runner.start()
  }

  def boolean anyChange(){
    def max = lastModified
    new File(dirPath).eachFileRecurse {
      if(it.name.endsWith('txt') && it.lastModified() > max){
        max = it.lastModified()
      }
    }
    if(max > lastModified){
      lastModified = max
      return true
    }
    return false;
  }
}

new AutoRunner(params).autorun()

【讨论】:

    【解决方案2】:

    为什么不使用 Jenkins 之类的 CI 工具对每次代码更改运行测试,作为整体 CI 构建的一部分?当文件更改时,让 Jenkins 轮询您的源代码控制系统并运行构建或单独的测试作业很容易。

    【讨论】:

      【解决方案3】:

      通常的方法是使用持续集成服务器,例如Jenkins

      让 Jenkins 每 15 分钟轮询一次您的版本控制系统,它会在注意到提交时构建您的项目。您永远不会知道您的源代码有效。

      【讨论】:

        【解决方案4】:

        我建议使用 CI 工具,例如Jenkins,您不仅可以在本地安装,还可以通过PaaS 获取 Jenkins 云实例,您可以轻松测试此解决方案是否可行无需在设置过程中花费太多时间即可达到或无法达到您的目标。

        此 PaaS 提供了一些 ClickStarts,您可以将其用作您自己的项目的模板,无论是在本地还是在云端。它将为您生成一个 Jenkins 作业,并已完全设置并正常工作。

        您可以查看的一些文章是:

        【讨论】:

          【解决方案5】:

          是的,拥有构建服务器(如 Bamboo、Cruise Control er TeamCity)和构建工具(如用于 TestNg/Junit 的 surefire-plugin 和用于集成测试的 Failsafe-plugin 可能使用 Selenium 2 之类的工具)非常受欢迎,因为它的设置相对简单(几乎开箱即用)。 :)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多