Как запустить модульные тесты Dojo DOH через Jenkins?
Кто-нибудь пробовал интегрировать модульные тесты Dojo DOH с Jenkins?
Я хотел бы сделать следующее, но не хочу изобретать это, если это уже было сделано. Итак, я думаю:
- Начните DOH-тесты с этапа пост-сборки в Jenkins и дождитесь результатов
- Запустите сами тесты в браузере без головы (например, Crowbar)
- Анализировать число успехов / ошибок из HTML-кода, возвращенного Crowbar
- Найдите (или напишите) плагин Jenkins, который (а) не выполнит сборку, если будут неудачные тесты, (б) отобразит результаты теста, (в) возможно интегрирует результаты в плагин игры CI
Вопросы:
- Это было сделано раньше?
- Видите ли вы какие-либо проблемы с планом выше?
- Знаете ли вы о плагине Jenkins, который поможет, или мне придется создавать свой собственный?
3 ответа
1. Автоматизированное тестирование Dojo - DOH & Selenium-RC (Rob Coup - 2008/01/03)
План:
- Имейте файл конфигурации, определяющий, какие браузеры запускать, на каких машинах они работают и какие тесты запускать.
- Запустите каждый браузер через Selenium-RC
- Запустите тесты через обычный браузер DOH.
- Используйте Selenium, чтобы извлечь результаты из DOH.
- Соберите результаты из разных браузеров и создайте что-нибудь полезное.
Решение:
- Капля
seleniumRunner.js, seleniumRunner.config.js, seleniumRunner.sh
(или.bat
если вы на Windows), иselenium-java-client-driver.jar
в util/doh/ в вашей установке Dojo.- Положил
selenium-server.jar
на каждом тестовом компьютере, затем запуститеjava -jar selenium-server.jar -multiWindow
поэтому он слушает сообщения управления браузером.- редактировать
seleniumRunner.config.js
и изменитьbrowsers
а такжеrootUrl
в соответствии с вашими настройками.rootUrl
должен быть доступен с каждой тестовой машины.- бежать
./seleniumRunner.sh seleniumRunner.config.js
из util/doh/ на вашей рабочей станции- Он загрузит конфигурацию, запустит браузеры на каждой машине, запустит модульные тесты из ядра Dojo и напечатает статистику прохождения / неудачи / ошибки для каждого.
- Каждый браузер запускается и отслеживается в отдельном потоке (не обязательно, но слишком круто, чтобы сопротивляться этому).
Вопросы:
- если я не запускаю сервер selenium в многооконном режиме, Safari и Firefox будут открывать диалоговые окна печати (!?!) при загрузке тестовой страницы. Но Safari никогда не инициализировал тестовую страницу, если она была в многооконном режиме. На OSX и Windows. г.
- Opera на OSX неправильно настроила прокси Selenium (
localhost:4444
для справки).- IE не любил делать
dojo.connect()
через команды селена JavaScript по некоторым причинам.
2. Кажется разумным для меня.
Этот плагин превращает ваш кластер Jenkins в кластер Selenium2 Grid, так что вы можете использовать свои гетерогенные кластеры Jenkins для проведения тестов Selenium. Этот плагин является решением "под ключ" - для его работы не требуется никакой дополнительной установки или настройки. Плагин автоматически устанавливает Selenium Grid на всех подчиненных и устанавливает сетку самостоятельно.
Для запуска тестов DOH я разработал инструмент, который интегрируется в CI и может запустить браузер.
http://codeblog.bigbrowser.net/dojo-testing-d-o-h-with-continuous-integration/
Может быть, вы можете попробовать это тоже.
Я объяснил, где скачать и как его запустить.
Вот как я это сделал с HTMLUnit. Селен не требуется.
Он запускается как обычный тест JUnit (который может легко запускаться вашим сервером CI) и печатает журнал DOH в случае сбоя теста.
public class JavascriptTest {
private static final int MAX_RUNNING_TIME = 10 * 1000;
//The test runner
public static final String PATHNAME = "src/main/webapp/library/mystuff/dojo/util/tests/runTests.html";
//Runs all of the Dojo Objective Harness (D.O.H.) javascript tests.
//The tests are currently grouped into test modules, and the parent module is "util.tests.module" (in module.js)
//As you can see in the URL pathname, we pass that module name to the testRunner and it runs all the javascript tests.
@Test
public void runAllJavascriptTests() throws Exception {
final WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_8);
final HtmlPage page = webClient.getPage("file://" + new File(PATHNAME).getAbsolutePath());
waitForTestsToRun(webClient, page);
String log = page.getElementById("logBody").asText();
assertTrue(log, page.asText().contains("WOOHOO!!")); //D.O.H. will display WOOHOO!! if all tests are successful.
}
private void waitForTestsToRun(WebClient webClient, HtmlPage page) {
webClient.waitForBackgroundJavaScript(500);
int runningTime = 0;
while(testsAreRunning(page) && runningTime < MAX_RUNNING_TIME){
webClient.waitForBackgroundJavaScript(500);
runningTime += 500;
}
}
private boolean testsAreRunning(HtmlPage page) {
//Check if the "Tests Running" div is visible.
return "".equals(page.getElementById("playingMsg").getAttribute("style"));
}
}
И ниже содержание runTests.html. Он в основном просто перенаправляет на тестер DOJO с параметрами, специфичными для тестов в каталоге, который мы хотим протестировать.
Это просто хороший способ структурировать вещи, вы могли бы указать этот URL в поле PATHNAME в тесте JUnit.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Dojox Unit Test Runner</title>
<!--The "testModule" param tells the runner which test module to run-->
<!--The "paths" param adds our dojo module paths, otherwise it would just look in the default dojo modules for code to test.-->
<meta http-equiv="REFRESH" content="0;url=../../../../dojo-release-1.7.2-src/util/doh/runner.html?testModule=util.tests.module&paths=util,../../mystuff/dojo/util;mystuff,../../mystuff/dojo"></HEAD>
<BODY>
Redirecting to D.O.H runner.
</BODY>
</HTML>