Так что вы все еще заинтересованы в модульном тестировании JavaScript (хорошо). Этот пост является расширением моей гораздо более глубокой первой публикации о том, как выполнить модульное тестирование JavaScript с помощью JS Test Driver. Пожалуйста, проверьте это здесь .
Повтор последнего сообщения
В последнем сообщении мы успешно протестировали JavaScript с использованием Maven и JsTest Driver. Это позволяет нам тестировать JavaScript в среде, в которой установлен современный браузер и который можно запустить.
Проблема с типичными средами CI
Так что же происходит, когда тест проходит на вашем локальном компьютере, но вы идете, чтобы проверить свой код, и сервер Continuous Integration ( CI ) проверяет новые тесты, потому что нет «экрана» для запуска chrome или firefox? На момент публикации ни один из браузеров верхнего уровня не имел окна браузера «без головы» или только в памяти. Существуют альтернативы для запуска JavaScript в браузере, такие как rhino.js, env.js или HtmlUnit, однако это всего лишь порты браузеров, и представление JavaScript и DOM не на 100% точно, что может привести к проблемам с вашим кодом, когда отображается в браузере клиента.
Подход
Нам нужно запустить браузер JSTestDriver в Virtual X Framebuffer (Xvfb), что возможно практически во всех системах на базе Linux. В приведенном ниже примере используется версия Linux для Solaris, однако дистрибутивы Debian и RedHat linux поставляются с упрощенным сценарием bash для простого запуска приложения в виртуальном кадровом буфере. Это решение было получено из одного опубликованного решения в вики-версии JS Test Driver ( http://code.google.com/p/js-test-driver/wiki/ContinuousBuild . Данный пример также является полным рабочим примером, который используется у моего текущего клиента.
Вот краткий список того, что мы сделаем. Обратите внимание, что некоторые из этих шагов подробно обсуждаются в предыдущем посте и здесь не рассматриваются подробно.
- Создать профиль для запуска Js Unit-Tests
- Скопируйте библиотеку JsTestDriver в известное место для использования Maven
- Скопируйте основные и тестовые файлы JavaScript в известные места
- Используйте ANT для запуска JsTestDriver и перенаправьте экран в xvfb
Вот пример профиля для использования. Вам нужно будет настроить свойства в верхней части профиля в соответствии с вашей системой.
<profile>
<!-- Runs JS Unit Test inside of Xvfb -->
<id>ci-jstests</id>
<properties>
<firefox.location>/opt/swf/bin/firefox</firefox.location>
<js-test-driver.version>1.3.2</js-test-driver.version>
<xvfb.location>/opt/X11R6/xvfb-run</xvfb.location>
</properties>
<build>
<plugins>
<!-- Copy JS Test Driver JAR to target folder -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<id>copy</id>
<phase>generate-resources</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.google.jstestdriver</groupId>
<artifactId>jstestdriver</artifactId>
<version>${js-test-driver.version}</version>
<type>jar</type>
<overWrite>true</overWrite>
<destFileName>jsTestDriver.jar</destFileName>
</artifactItem>
</artifactItems>
<outputDirectory>${project.build.directory}/jstestdriver</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
</configuration>
</execution>
</executions>
</plugin>
<!-- Copy JavaScript files and Tests files -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<id>copy-main-files</id>
<phase>generate-test-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/test-classes/main-js</outputDirectory>
<resources>
<resource>
<directory>src/main/webapp/scripts</directory>
<filtering>false</filtering>
</resource>
</resources>
</configuration>
</execution>
<execution>
<id>copy-test-files</id>
<phase>generate-test-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/test-classes/test-js</outputDirectory>
<resources>
<resource>
<directory>src/test/webapp/scripts</directory>
<filtering>false</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<mkdir dir="${project.build.directory}/js-test-results" />
<exec executable="${xvfb.location}">
<arg line="java" />
<arg line="-jar ${project.build.directory}/jstestdriver/jsTestDriver.jar" />
<arg line="--port 4220" />
<arg line="--testOutput ${project.build.directory}/js-test-results" />
<arg line="--config ${project.build.directory}/test-classes/jsTestDriver.conf" />
<arg line="--browser ${firefox.location}" />
<arg line="--tests all" />
<arg line="--verbose" />
</exec>
</target>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
Возможные проблемы
Хотя я не могу предсказать или исправить все проблемы, я могу поделиться одной главной проблемой, с которой я столкнулся, с Solaris и сценарием, используемым для ее устранения. В Solaris (и может случиться с другими дистрибутивами) сценарий xvfb-run был недоступен, а некоторые другие библиотеки не существовали. Сначала мне нужно было загрузить последние версии X-библиотек и разместить их в соответствующих местах на CI-сервере. Затем мне пришлось реорганизовать скрипт xvfb-run. Вот копия моего скрипта (ПРИМЕЧАНИЕ. Это решение для моего сервера, и оно может не сработать для вас)
Я создал скрипт, который содержит:
/usr/openwin/bin/Xvfb :1 screen 0 1280x1024x8 pixdepths 8 24 fbdir /tmp/.X11-vbf &
С http://www.ensor.cc/2011/08/maven-javascript-unit-test-running-in.html