Так что вы все еще заинтересованы в модульном тестировании 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