Статьи

Модульный тест Maven + JavaScript: работа в среде непрерывной интеграции

Так что вы все еще заинтересованы в модульном тестировании 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 . Данный пример также является полным рабочим примером, который используется у моего текущего клиента.

Вот краткий список того, что мы сделаем. Обратите внимание, что некоторые из этих шагов подробно обсуждаются в предыдущем посте и здесь не рассматриваются подробно.

  1. Создать профиль для запуска Js Unit-Tests
  2. Скопируйте библиотеку JsTestDriver в известное место для использования Maven
  3. Скопируйте основные и тестовые файлы JavaScript в известные места
  4. Используйте 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