Книга: Программирование на языке Ruby
16.2. Комплект инструментов ZenTest
Разделы на этой странице:
16.2. Комплект инструментов ZenTest
Этот великолепный инструментарий написал Райан Дэвис (Ryan Davis). Основной инструмент (zentest
) — это исполняемая программа, которая генерирует файл с тестами на основе анализа вашего кода.
Тестируемый класс (class under test — CUT) служит основой тестового класса (test class — ТС). На каждом уровне области видимости в начало имени класса добавляется строка Test
, а в начало имени метода — строка test_
. Иногда имена методов приходится «подправлять», например в случае с методом ==
(к имени которого нельзя добавлять никакой префикс) или если имя метода оканчивается на ?, ! или =. В листинге 16.2 приведен пример подлежащего тестированию кода:
Листинг 16.2. Класс, подлежащий тестированию
class Alpha
class Beta
attr_accessor :foo, :bar
def initialize
end
def foo?
@foo
end
end
def initialize
end
def process
end
def process!
end
def ==(other)
end
def ===(other)
end
end
После запуска команды zentest file.rb >tfile.rb
получится файл, показанный в листинге 16.3.
Листинг 16.3. Результат работы ZenTest
# Code Generated by ZenTest v. 3.2.0
# classname: asrt / meth = ratio%
# Alpha::Beta: 0 / 7 = 0.00%
require 'test/unit' unless defined? $ZENTEST and $ZENTEST
class TestAlpha < Test::Unit::TestCase
def test_process
raise NotImplementedError, 'Need to write test_process'
end
def test_process_bang
raise NotImplementedError, 'Need to write test_process_bang'
end
end
module TestAlpha
class TestBeta < Test::Unit::TestCase
def test_bar
raise NotImplementedError, 'Need to write test_bar'
end
def test_bar_equals
raise NotImplementedError, 'Need to write test_bar_equals'
end
def test_foo
raise NotImplementedError, 'Need to write test_foo'
end
def test_foo_eh
raise NotImplementedError, 'Need to write test_foo_eh'
end
def test_foo_equals
raise NotImplementedError, 'Need to write test_foo_equals'
end
end
end
# Number of errors detected: 9
Обратите внимание, что каждый тестовый метод возбуждает исключение (предложение raise
). Идея в том, что все тесты завершаются неудачно, пока вы явно не напишете код.
Исходный файл почему-то не включается в тестовый. Можно поместить в начало тестового файла директиву require 'file'
или эквивалентную ей (предварительно затребовав test/unit
). Тогда тестовый код увидит определения ваших классов.
В командной строке можно указать и второй параметр. Если добавить код в тестируемый класс, то тестовые классы окажутся устаревшими. Чем обновлять их вручную, можно сгенерировать только «обновления»:
zentest file.rb tfile.rb >tfile2.rb
В комплект входит еще одна полезная программа: unit_diff
. Рассмотрим простое утверждение assert_equal ("foo", "bar")
. Оно приводит к печати следующего сообщения:
1) Failure:
testme(Foo) [(irb):7]:
<"foo"> expected but was
<"bar">.
Тут все просто и понятно. Но предположим, что каждая из переданных строк (string) состояла из нескольких строчек (line), а различие начиналось только в седьмой строчке. Программа unit_diff
как раз призвана навести порядок в таком плохо читаемом тексте. Она работает аналогично утилите diff
, имеющейся в UNIX; вызывать ее следует как фильтр после обычной тестовой программы.
ruby testfile.rb | unit_diff
Программа понимает следующие флаги:
-h Справка о порядке запуска
-v Номер версии
-b Не считать различными фрагменты, различающиеся только по количеству
пробелов
-c Выполнять контекстное сравнение
-k Не удалять временные файлы
-l Включать в дельту номера строк
-u Выполнять унифицированное сравнение
Программа autotest
наблюдает за всеми вашими комплектами тестов и запускает те, которые были недавно изменены. Она предназначена для тех лентяев, которым трудно даже ввести имя файла для прогона тестов.
Для пользования этим инструментом нужно соблюдать некоторые соглашения об именах. Правила простые:
• все тесты должны находиться в каталоге test
;
• имена всех файлов должны начинаться с Test_
;
• имена классов должны начинаться с Test
;
• подлежащий тестированию код должен находиться в каталоге lib
;
• файлам в каталоге lib
должны соответствовать файлы в каталоге test
(их имена, конечно, должны начинаться с test_
).
Будучи запущена, программа autotest
прогоняет тесты по мере их обновления. Если какой-то тест завершается неудачно, она будет прогонять его снова и снова, пока вы не исправите ошибку. Она начнет «сверху», если нажать комбинацию клавиш Ctrl+C, и завершится, если нажать Ctrl+C во второй раз.
Программа multiruby
позволяет тестировать код относительно разных версий Ruby. Она входит в комплект ZenTest, но пока еще работает не очень стабильно и плохо документирована.
- Несовместимость комплектующих
- Что означают аббревиатуры OEM и RET в названиях комплектующих?
- Использование инструментов Visual Studio для создания базы данных
- Панель инструментов
- 9. Оценка эффективности email-маркетинга Как повысить продажи с помощью простых инструментов
- Как получить инсталляционный комплект
- 5.4. Определение основных вариантов коммуникаций. Анализ основных инструментов продвижения
- 5.8.4. Список сырья, материалов и комплектующих
- Использование инструментов с графическим интерфейсом
- 2.4.7. Панель инструментов
- Зачем переплачивать? Как сэкономить при покупке ноутбуков, смартфонов, комплектующих и другой техники
- Глава 16 Создайте свой комплект онлайновых мультимедийных средств