Лучший способ интегрировать maven/qunit/phantomjs?

Я изучаю лучший способ проведения JS-тестирования в нашей среде CIF Maven. То, что я в настоящее время вымотано вместе, следующее в моем проекте maven:

  • ресурсы qunit (файлы JS/CSS)
  • Файлы qunit test html (по одному для каждого тестируемого файла) с помощью html fixture, если требуется
  • index 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. Может ли кто-нибудь дать мне толчок в этом направлении? Как мне начать?

Ответы

Ответ 1

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

Ответ 2

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

Решение состоит в использовании плагина Maven phantomjs-maven-plugin. Я добавляю плагин в свой 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 GitHub Gist. Вы можете и должны адаптировать эти файлы к вашим потребностям (хотя имейте в виду, что на странице 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.

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

Ответ 3

Используя ответ Кайла и другой плагин, я смог получить полное решение, которое не требует ничего, кроме предустановленной 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. В конце мой pom выглядел так:

`    <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>
`  

My 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']);
};`  

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

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

Ответ 4

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

Ответ 5

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

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

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

enter image description here