Лучший способ интегрировать maven / qunit / phantomjs? - PullRequest
16 голосов
/ 15 декабря 2011

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

  • ресурсы qunit (файлы JS / CSS)
  • qunit test html файлы (по одному на каждый тестируемый файл) с html fixture, если требуется
  • индексный 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 во время сборок на наших разработчиках и сборочных машинах (если установлен PhantomJS). Тесты выполняются в автономной браузерной среде без ограничений на тесты qunit. Другие интеграции maven / qunit, которые я видел, не отвечают из-за запуска тестов в Rhino или других средах JS, которые накладывают ограничения на тип тестов, которые мы можем написать. Кроме того, phantomjs дает нам возможность делать скриншоты тестовых прогонов, которые помогают устранять любые сбои.

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

Ответы [ 5 ]

5 голосов
/ 30 мая 2014

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

2 голосов
/ 12 февраля 2015

Используя ответ Кайла и другой плагин, я смог получить полное решение, которое не требует ничего, кроме предустановленной 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 иЯ столкнулся с проблемой фантома, наткнулся на этот пост и узнал о плагине Кайла (github.com/klieber/phantomjs-maven-plugin). Мне пришлось использовать пользовательский источник qunit, описанный в этом руководстве (http://techblog.dorogin.com/2013/08/issues-with-grunt-contrib-qunit.html). Этопозволил мне использовать плагин kyles для установки phantomjs, а затем связать двоичный файл с помощью опций grunt с пользовательским qunit. В итоге мой pom выглядел так:*

А мой 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":{ }
}`  
2 голосов
/ 27 июня 2014

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

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

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

1 голос
/ 24 октября 2012

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

0 голосов
/ 05 апреля 2014

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

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

Вот скриншот результатов теста:

enter image description here

...