2011-12-15 9 views
16

Я изучал лучший способ проведения JS-тестирования в нашей среде CIF Maven. То, что я в настоящее время уже починил следующие в моем Maven проекте:Лучший способ интеграции maven/qunit/phantomjs?

  • QUnit ресурсах (JS/файлы CSS)
  • тест QUnit HTML-файлы (по одному для каждого файла испытуемого) с HTML арматурой при необходимости
  • индекс HTML-файл, который ссылается на тест HTML файлы, как упорядоченный список гиперссылок
  • PhantomJS бегун файла, который:
    • открывает файл индекса HTML и разбирает из списка тестовых файлов
    • открывает каждый тестовый файл
    • принимает скриншот результатов испытаний QUnit для каждого файла
    • Если есть какой-либо сбои, выход со статусом «1»
    • Если нет никаких сбоев, выхода со статусом «0»
  • файл оболочки, который будет выходить с «0», если phantomjs не установлен, будет вызывать тесты phantomjs, если он установлен
  • изменения pom.xml для запуска phantomjs испытаний во время фазы тестирования изготовителя:

    <plugins> 
        <plugin> 
         <groupId>org.codehaus.mojo</groupId> 
         <artifactId>exec-maven-plugin</artifactId> 
         <version>1.1</version> 
         <executions> 
          <execution> 
           <id>PhantomJS Unit Testing</id> 
           <phase>test</phase> 
           <goals> 
            <goal>exec</goal> 
           </goals> 
          </execution> 
         </executions> 
         <configuration> 
          <executable>${project.basedir}/src/main/webapp/unittest/phantomcheck</executable> 
          <arguments> 
           <argument>${project.basedir}/src/main/webapp/unittest/qunit-runner.js</argument> 
           <argument>${project.basedir}/src/main/webapp/unittest/tests/index.html</argument> 
           <argument>${project.build.directory}/surefire-reports</argument> 
          </arguments> 
         </configuration> 
        </plugin> 
    </plugins> 
    

Итак, это работает красиво. Он запускает тесты qunit во время сборки на наших dev и build машинах (пока установлен PhantomJS). Тесты выполняются в безгласной среде браузера без ограничений на тесты qunit. Другая интеграция maven/qunit, которую я видел, ослабевает из-за запуска тестов в Rhino или других средах JS, которые ограничивают тип тестов, которые мы можем написать. Плюс phantomjs дает нам возможность иметь скриншоты тестовых прогонов, которые полезны при устранении любых сбоев.

Недостатком моего подхода является то, что на машине build/dev требуется установка PhantomJS. Я не знаю, как связать phantomJS с зависимостью, чтобы разработчикам не нужно было беспокоиться об установке PhantomJS. Может ли кто-нибудь дать мне толчок в этом направлении? Как мне начать?

+0

Проверьте мой Maven плагин (phantomjs -qunit-бегун). http://code.google.com/p/phantomjs-qunit-runner/ Подробности об использовании здесь: http://kennychua.net/blog/running-qunit-tests-in-a-maven-continuous-integration- build-with-phantomjs –

+0

@KennyChua: вопросник просит инструмент для загрузки PhantomJS в качестве зависимости, и ваш плагин этого не делает. :-( –

+0

Возможно, эта статья может помочь вам http://www.yegor256.com/2014/06/21/casperjs-with-maven.html – yegor256

ответ

1

Мы просто проверяем файл phantomJS.exe на исходный код. И тогда мы уверены, что одна и та же версия phantomJS используется на всех машинах.

+0

Как правило, вы не должны проверять большие двоичные файлы в исходном элементе управления. Это одна из проблем, которую Maven пытается решить в первую очередь, предоставляя легкую структуру для загрузки бинарных зависимостей. –

+0

Общее правило для CI заключается в том, чтобы сохранить все необходимое для создания и тестирования вашего программного обеспечения под контролем источника. Таким образом, на новой машине вы можете просто получить версию требуемого кода и создать ее без необходимости вручную устанавливать какие-либо инструменты. Мы используем диспетчер пакетов NuGet, чтобы помочь с некоторыми зависимостями в структуре, но не все инструменты доступны. Имея phantonJS.exe в контроле источника, мы можем быть уверены, что каждая сборка использует одну и ту же версию, а в качестве дополнительного бонуса мы не имеем зависимости от дополнительного репозитория - должна быть доступна только наша собственная система управления версиями. – GarethOwen

0

Это старый вопрос, но я думал, что ссылка на проект шахты, который использует PhantomJS и QUnit для работы с TestNG:

Проект называется qunit-testng. У меня также есть sample project, который показывает используемую библиотеку.

Вот скриншот выхода теста:

enter image description here

5

phantomjs-maven-plugin обеспечивает install цель для установки phantomjs так что вам не нужно его предварительно установлена. После установки phantomjs он устанавливает свойство с пути к исполняемому файлу, который затем могут использовать другие плагины. Он также имеет цель exec для выполнения скриптов phantomjs. Полное раскрытие: я написал плагин.

+1

Спасибо за отличный плагин, я смог использовать его для решения этой проблемы для себя и написать отличный ответ. :) –

+0

@ Kyle отличная работа, создавая плагин .... @ jonathan-benn Я использую ваш плагин точно так, как описано в github ,,,,, но не смог заставить его работать ..... пожалуйста, проверьте здесь проблема и помочь мне найти, что не так в моем pom.xml http://stackoverflow.com/q/32678881/2079692 –

+0

@Kyle как phantomjs-maven-plugin вызывается во время процесса сборки и где он устанавливает двоичный файл в проект java-ee? Могу ли я настроить его для использования пользовательского местоположения? –

2

Ответы на вопросы Kyle Я смог найти надежное решение этой проблемы. Спасибо, Кайл!

Решение состоит в использовании плагина fantomjs-maven- Maven. Я добавить плагин к моей pom.xml, как это (вам нужно будет обновить Maven для v3.1 или выше, чтобы использовать плагин):

<plugin> 
    <groupId>com.github.klieber</groupId> 
    <artifactId>phantomjs-maven-plugin</artifactId> 
    <version>0.4</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>install</goal> 
       <goal>exec</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <version>1.9.7</version> 
     <checkSystemPath>false</checkSystemPath> 
     <script>src/test/qunit/run-qunit-testsuite.js</script> 
     <arguments> 
      <argument>src/test/qunit/testsuite.qunit.html</argument> 
     </arguments> 
    </configuration> 
</plugin> 

Важное замечание: в коде pom.xml выше, убедитесь, что использовали относительные (не абсолютные) ссылки на файлы, как я это сделал. Я потратил несколько часов после использования абсолютных ссылок (начиная с ${basedir}), чтобы узнать, что он делает что-то странное в рабочем каталоге PhantomJS. Использование относительных ссылок в вашем pom.xml позволит относительные ссылки внутри вашего HTML-файла (что максимизирует переносимость кода).

В приведенном выше коде плагина я ссылаюсь на два файла: run-qunit-testsuite.js и testsuite.qunit.html. HTML-файл - это только файл QUnit, который выполняет все ваши тесты. JS-файл является драйвером для PhantomJS; он принимает один аргумент: тестовый файл HTML QUnit для загрузки.

Для заполнения этого решения вы можете скачать пример драйвера и файлы тестов из GMarik's GitHub Gist page. Вы можете и должны адаптировать эти файлы к вашим потребностям (хотя имейте в виду, что страница GMarik не включает лицензию с открытым исходным кодом, вам нужно будет запросить разрешение на использование любых авторских прав).

При добавлении этого плагина в код Maven, после выполнения Maven сборки, вы увидите вывод, как следующее (взято из страницы GMarik в):

[INFO] --- phantomjs-maven-plugin:0.4:exec (default) @ project.name --- 
[INFO] Executing phantomjs command 
'waitFor()' finished in 200ms. 
Tests completed in 21 milliseconds. 
5 tests of 5 passed, 0 failed. 

Если тесты проходят, то ваш билд будет проходить. Если тесты не пройдут, ваша сборка завершится неудачно!

+0

Привет @Jonathan. Я выполнил все предложенные вами шаги, но все же не работал на меня. По какой-то причине ни один из тестов в моем файле HTML не выполнен – prgrmr

+0

@ideate Вы пытались выполнить тесты в обычном браузере? Выполняются ли тесты в браузере? Вы используете QUnit? Я тестировал это только с помощью QUnit. –

+0

Да, тесты выполняются отлично в браузере и я использую Quint. Проблема в том, что я использовал образец драйвера на странице GMarik s github, и я думаю, что это не работает для меня. – prgrmr

2

Используя ответ Кайла и другой плагин, я смог получить полное решение, которое не требует ничего, кроме предустановленной maven, и устанавливает phantomjs и qunit, чтобы разрешить запуск тестов. Я начал с плагина maven-grunt (github.com/eirslett/frontend-maven-plugin) и выполнил шаги в этом руководстве (http://blog.trifork.com/2014/10/07/setting-up-maven-to-use-gruntnodejs/), чтобы настроить его. Затем я попытался использовать qunit внутри maven, и я столкнулся с проблемой phantomjs и наткнулся на этот пост и узнал о плагине Кайла (github.com/klieber/phantomjs-maven-plugin). Мне пришлось использовать специальный источник qunit, описанный в этом руководстве (http://techblog.dorogin.com/2013/08/issues-with-grunt-contrib-qunit.html). Это позволило мне использовать плагин kyles для установки phantomjs, а затем привязать параметры двоичного к grunt к пользовательскому qunit. В конце концов мой ПОМ выглядел:

` <plugin> 
     <groupId>com.github.klieber</groupId> 
     <artifactId>phantomjs-maven-plugin</artifactId> 
     <version>0.4</version> 
     <executions> 
      <execution> 
      <phase>generate-resources</phase> 
      <goals> 
       <goal>install</goal> 
      </goals> 
      </execution> 
     </executions> 
     <configuration> 
      <version>1.9.8</version> 
     </configuration> 
     </plugin> 
     <plugin> 
     <groupId>com.github.eirslett</groupId> 
     <artifactId>frontend-maven-plugin</artifactId> 
     <version>0.0.20</version> 
     <executions> 
      <execution> 
      <id>install node and npm</id> 
      <phase>generate-resources</phase> 
      <goals> 
       <goal>install-node-and-npm</goal> 
      </goals> 
      <configuration> 
       <nodeVersion>v0.10.33</nodeVersion> 
       <npmVersion>1.3.6</npmVersion> 
      </configuration> 
      </execution> 
      <execution> 
      <id>npm install</id> 
      <phase>generate-resources</phase> 
      <goals> 
       <goal>npm</goal> 
      </goals> 
      <configuration> 
       <arguments>install</arguments> 
      </configuration> 
      </execution> 
      <execution> 
      <id>grunt build</id> 
      <phase>generate-resources</phase> 
      <goals> 
       <goal>grunt</goal> 
      </goals> 
      <configuration> 
       <arguments>--phantomPath=${phantomjs.binary}</arguments> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
` 

Мои Gruntfile.js выглядели как:

` module.exports = function(grunt) { 
     grunt.loadNpmTasks('grunt-croc-qunit'); 
     grunt.initConfig({ 
     pkg: grunt.file.readJSON('package.json'), 
     qunit: { 
     options: { 
      'phantomPath': grunt.option('phantomPath') 
     }, 
     all:['src/test/*.html'] 
     } 
    }); 
    grunt.registerTask('default',['qunit']); 
};` 

И мой package.json выглядел как:

` { 
    "name":"reporting", 
    "version":"0.0.1", 
    "dependencies": { 
    "grunt": "~0.4.5", 
    "grunt-cli": "~0.1.13", 
    "grunt-croc-qunit":"~0.3.0" 
    }, 
    "devDependencies":{ } 
}` 
+0

Также жаль насчет форматирования. Это был мой первый пост – samroxsox