Я тестировал домен моего сборочного радиатора, XFD, с прекрасной платформой Jasmine BDD для JavaScript. Жасмин прекрасна. Браузеры нет. У меня есть проблемы с появлением нового браузера для запуска ваших тестов:
- Создание браузера занимает время и разрушает мой поток,
- Я пытаюсь изгнать логику — наличие браузера приведет мой дизайн к неестественным связям, и
- Это делает непрерывную интеграцию намного сложнее
Поэтому я начал исследовать, что я могу сделать с Rhino и Envjs, чтобы сделать тестирование с Jasmine более потрясающим. Ингвальд Скауг был там раньше . Мне потребовалось некоторое время, чтобы по-настоящему понять, как сочетаются друг с другом части, поэтому я решил расширить его.
Шаг 1: Убедитесь, что Жасмин работает
Я бы сэкономил столько времени, если бы начал с этого. Что вам нужно сделать, это загрузить ядро Jasmine и вставить его в свой проект. Я начал с Jasmine RubyGem, который порождает браузер и выполняет сантехнику, но для этого он вернулся к основам. В моем проекте это проверено в lib / jasmine-1.0.1 . Вам нужен HTML-файл для ссылки на все сценарии и запуска тестов. Вот пример, полученный из документов Jasmine:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Jasmine Test Runner</title>
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.0.1/jasmine.css"></link>
<script type="text/javascript" src="lib/jasmine-1.0.1/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.0.1/jasmine-html.js"></script>
<!-- include source files here... -->
<script type="text/javascript" src="src/Player.js"></script>
<script type="text/javascript" src="src/Song.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="spec/SpecHelper.js"></script>
<script type="text/javascript" src="spec/PlayerSpec.js"></script>
</head>
<body>
<script type="text/javascript">
jasmine.getEnv().addReporter(new jasmine.TrivialReporter());
jasmine.getEnv().execute();
</script>
</body>
</html>
В моем реальном проекте я генерирую этот файл во время сборки из шаблона ERB , чтобы убедиться, что я получаю все исходные файлы и тесты. Как бы вы это ни делали, сначала убедитесь, что он работает в браузере . Да. В самом деле.
Шаг 2: Получите нужные вам биты
В моем каталоге lib у меня есть:
- js.jar — это реализация JavaScript для Rhino. Я уже использовал это для запуска JsLint как часть моей сборки
- env.rhino.1.2.js — это Envjs — реализация DOM, написанная на JavaScript.
- jasmine.console_reporter.js , jasmine.junit_reporter.js и envjs.bootstrap.js — все из отличного проекта Ларри Майерса « Жасмин репортеры ». Jasmine Reporters — это то, что склеивает все вместе.
Шаг 3: Подключите Жасмин Репортеры
В SpecRunner.html можно подключить множество репортеров Jasmine. В этом примере я оставляю два объекта — TrivialReporter, который предоставляет отчеты HTML / CSS, и ConsoleReporter, который мы будем использовать позже. Вот редактирование файла SpecRunner сейчас:
<script type="text/javascript">
jasmine.getEnv().addReporter(new jasmine.ConsoleReporter());
jasmine.getEnv().addReporter(new jasmine.TrivialReporter());
jasmine.getEnv().execute();
</script>
Шаг 4: собрать все вместе
Вот где все это происходит. В моем примере я использую сценарий оболочки, но в реальной жизни Rakefile, который генерирует файл SpecRunner, также запускает JVM и проверяет STDOUT на наличие сообщений об ошибках.
#!/bin/bash
java -jar lib/js.jar -opt -1 lib/envjs.bootstrap.js SpecRunner.html
envjs.bootstrap.js также заслуживает изучения:
load('lib/env.rhino.1.2.js');
Envjs.scriptTypes['text/javascript'] = true;
var specFile;
for (i = 0; i < arguments.length; i++) {
specFile = arguments[i];
console.log("Loading: " + specFile);
window.location = specFile
}
Этот файл берет список файлов HTML, которые вы ему передаете, и сообщает поддельному браузеру внутри JVM, чтобы загрузить каждый из них. Затем Жасмин запускает ваши тесты:
jsimpson@curie:~/Documents/workspace/jasmine-rhino-envjs$ ./jasmine
[ Envjs/1.6 (Rhino; U; Linux i386 2.6.32-26-generic; en-US; rv:1.7.0.rc2) Resig/20070309 PilotFish/1.2.13 ]
Loading: SpecRunner.html
Runner Started.
Player : should be able to play a Song ...
>> Jasmine Running Player should be able to play a Song...
Passed.
when song has been paused : should indicate that the song is currently paused ...
>> Jasmine Running when song has been paused should indicate that the song is currently paused...
Passed.
when song has been paused : should be possible to resume ...
>> Jasmine Running when song has been paused should be possible to resume...
Passed.
when song has been paused: 4 of 4 passed.
Player : tells the current song if the user has made it a favorite ...
>> Jasmine Running Player tells the current song if the user has made it a favorite...
Passed.
#resume : should throw an exception if song is already playing ...
>> Jasmine Running #resume should throw an exception if song is already playing...
Passed.
#resume: 1 of 1 passed.
Player: 8 of 8 passed.
Runner Finished.
Есть также совместимый с JUnit XML-репортер, любезно предоставленный Ларри. Это позволяет вам делать результаты теста отчетов сервера Continuous Integration как обычно.
Резюме
Я очень впечатлен. Все мои тесты, которые раньше выполнялись в браузере, выполняются без заголовка, с некоторыми путями. Я использую плагин Jasmine JQuery , который, вероятно, сохранил мой бекон на тесте, который слишком тесно связан с представлениями. Я собрал пример на GitHub.
Принадлежит к Ingvald , Ларри , и Жасмин командам, Rhino и Envjs. Вы, ребята, молодцы.