непрерывное тестирование Java вне IDE

У меня есть куча модульных тестов Java, и я хотел бы интегрировать среду непрерывного тестирования в свою кодовую базу. В идеале я хотел бы написать цель Maven/Ant или сценарий bash, который запускал бы тесты всякий раз, когда файлы, которые он просматривает, изменяются. До сих пор я рассматривал несколько вариантов (Infinitest, JUnit Max), но оба они, похоже, хотят работать как плагины IDE.

Моя мотивация использования CLI-инструмента заключается в том, что мои коллеги используют широкий набор текстовых редакторов и IDE, но я хочу убедиться, что каждый может постоянно запускать тесты.

EDIT: я не рассматривал Jenkins или другие более типичные решения CI по нескольким причинам:

  • У нас уже есть инструмент сборки CI для запуска модульных и интеграционных тестов после каждого нажатия.
  • Они скрывают время выполнения тестов (поскольку они выполняются асинхронно), позволяя тестам становиться все медленнее и медленнее, а люди этого даже не замечают.
  • Обычно они запускают тесты только в том случае, если ваш репозиторий находится в каком-то центральном месте. Я хочу, чтобы модульные тесты выполнялись пока я редактирую, а не после того, как я уже куда-то отправил код. Чем раньше я запущу тесты, тем быстрее смогу исправить любую ошибку, допущенную при редактировании. Наша команда разработчиков JavaScript полюбила аналогичный инструмент, указав ускорение в 3 раза для итераций при разработке модульных тестов.

person Dan    schedule 19.03.2014    source источник
comment
Как вы планируете просматривать результаты теста? Разве вам не нужна информационная панель для выявления сбоев при тестировании? Предложенное решение CI, по-видимому, соответствует вашим требованиям, поскольку оно может отслеживать ваш (локальный) SCM и представлять текущие результаты тестирования. Вам нужно будет запустить частный экземпляр на своем собственном компьютере (Jenkins хорош для этого, он очень легкий, всего один файл WAR). В сочетании с SCM, который предоставляет крючки для изменений, вы должны получить то, что ищете.   -  person Paul Hicks    schedule 23.03.2014
comment
Я бы оставил процесс работающим в фоновом режиме, который распечатывал бы все неудачи теста по мере их возникновения.   -  person Dan    schedule 24.03.2014


Ответы (5)


Для этого я использую непрерывный опрос для решения смены каталога. (общий код: 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()
person takacsot    schedule 05.05.2014

Почему бы не использовать такой инструмент CI, как Jenkins, для запуска тестов при каждом изменении кода в рамках общей сборки CI? Легко заставить Jenkins опрашивать вашу систему управления версиями и запускать сборку или отдельное тестовое задание при изменении файла.

person TrueDub    schedule 19.03.2014

Обычно используется сервер непрерывной интеграции, такой как Jenkins.

Попросите Jenkins опрашивать вашу систему контроля версий каждые 15 минут, и она будет собирать ваш проект, как только заметит коммиты. Вы всегда будете уверены, что ваш исходный код работает.

person jmkgreen    schedule 19.03.2014

Я бы порекомендовал использовать такой инструмент непрерывной интеграции, как Jenkins, где у вас есть возможность не только установить его локально, но также получить облачный экземпляр Jenkins через PaaS, где вы можете легко проверить, соответствует ли это решение вашим требованиям. цель, не тратя слишком много времени на процесс настройки.

Эта PaaS предоставляет несколько ClickStart, которые вы можете использовать в качестве шаблона для своих собственных проектов, локально или в облаке. Это создаст вам полностью настроенную и работающую работу Jenkins.

Вот некоторые статьи, на которые вы можете взглянуть:

  • Безболезненные сборки Maven с Jenkins, где вы можете увидеть приборная панель, которую вы можете получить. Вы увидите тесты maven, пройденные для каждой сборки, а также можете получить график, показывающий пройденные, пропущенные и не пройденные тесты maven.
  • Разработчик iOS: как настроить показатели качества для работы с Jenkins? Хотя в этой статье говорится конкретно об iOS, вы также можете получить ту же цель для стандартного проекта java maven: покрытие тестами, результаты тестов, дублирование кода, метрики кода (LOC),...
person Captain Haddock    schedule 24.03.2014

Да, наличие сервера сборки (например, Bamboo, Cruise Control или TeamCity) и инструмента сборки, такого как Maven (наряду с плагином surefire для TestNg/Junit и плагином Failsafe для интеграционного тестирования, возможно, с использованием чего-то вроде Selenium 2) довольно популярно, потому что это относительно тривиальная настройка (работает почти «из коробки»). :)

person Mikkel Løkke    schedule 24.03.2014