Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

Я также предпочитаю включать некий «заголовок» в имя метода (описывающий его область действия или назначение):

def test_053_default_to_current_directory

 # ...

end

def test_054_use_specified_directory

 # ...

end

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

А если нужно

организовать некую среду выполнения, для чего требуется время? Неразумно делать это для каждого теста, и мы не вправе завести для данной цели отдельный метод (поскольку поведение не должно зависеть от порядка прогона).

Если всем тестам нужна особая среда, можно воспользоваться методами класса

setup
и
teardown
. Возможно, вам это покажется странным, но вызываются они для каждого теста. Если вы хотите выполнить настройку один раз, перед прогоном одного конкретного или всех тестов, то можете поместить соответствующий код в тело класса раньше всех тестовых методов (или даже до самого класса).

А если после выполнения всех тестов нужно разрушить созданную среду? По техническим причинам (так уж работает библиотека

Test::Unit
) сделать это трудно. «Самый лучший» способ — переопределить метод run всего комплекта тестов (но не метод класса
run
), обернув его функциональность. Рассмотрим пример в листинге 16.1.

Листинг 16.1. Подготовка и разрушение среды исполнения

require 'test/unit'

class MyTest < Test::Unit::TestCase

 def self.major_setup

# ...

 end

 def self.major_teardown

# ...

 end

 def self.suite

mysuite = super # Вызвать метод suite родителя.

def mysuite.run(*args) # Добавить синглетный метод

MyTest.major_setup

super

MyTest.major_teardown

end

mysuite # и вернуть новое значение.

 end

 def setup

# ...

 end

 def teardown

# ...

 end

 def test_001

# ...

 end

 def test_002

# ...

 end

 # ...

end

Вряд

ли вы будете поступать так часто. О методе
suite
мы поговорим чуть позже, а пока продолжим рассмотрение отдельных тестов.

Что должно входить в тест? Нужно как-то решить, прошел он или нет. Для этой цели применяются утверждения.

Простейшее утверждение — это метод

assert
. Он принимает проверяемый параметр и еще один необязательный параметр (сообщение). Если значение параметра истинно (то есть все, кроме
false
и
nil
), тест прошел. В противном случае тест не прошел — тогда печатается сообщение, если оно было задано.

Есть и другие методы для формулирования утверждений. Обратите внимание, что «ожидаемое» значение всегда предшествует «фактическому».

assert_equal(expected, actual) # assert(expected==actual)

assert_not_equal(expected, actual) # assert(expected!=actual)

assert_match(regex, string) # assert(regex =~ string)

assert_no_match(regex, string) # assert(regex string)

assert_nil(object) # assert(object.nil?)

assert_not_nil(object) # assert(!object.nil?)

Некоторые утверждения носят более объектно-ориентированный характер:

assert_instance_of(klass, obj) # assert(obj.instance_of? klass)

assert_kind_of(klass, obj) # assert(obj.kind_of? klass)

assert_respond_to(obj, meth) # assert(obj.respond_to? meth)

Другие относятся к исключениям и символам, которые генерируются методом

throw
. Понятно, что такие методы принимают блок.

assert_nothing_thrown { ... } # Не было throw.

assert_nothing_raised { ... } # Не было raise.

assert_throws(symbol) { ... } # Символ в результате throw.

assert_raises(exception) { ... } # Исключение в результате raise.

Есть еще несколько утверждений, но эти применяются чаще всего и отвечают почти всем потребностям. Дополнительную информацию можно найти в онлайновой документации на сайте http://ruby-doc.org.

Имеется еще метод

flunk
, который всегда завершается неудачно. Можно считать, что это некий вид заглушки.

Если при запуске тестового файла вы ничего специально не указываете, то по умолчанию вызывается консольный исполнитель тестов. Это возвращает нас к старой доброй технологии 1970-х годов. Имеются и другие исполнители, например графический

Test::Unit::UI::GTK::TestRunner
. Любой исполнитель тестов можно вызвать, обратившись к его методу
run
, которому передается специальный параметр, описывающий набор тестов:

Поделиться:
Популярные книги

Мечников. Избранник бога

Алмазов Игорь
5. Жизнь Лекаря с нуля
Фантастика:
альтернативная история
аниме
фэнтези
5.00
рейтинг книги
Мечников. Избранник бога

На границе империй. Том 6

INDIGO
6. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.31
рейтинг книги
На границе империй. Том 6

Японский городовой

Зот Бакалавр
7. Героями не становятся, ими умирают
Фантастика:
фэнтези
попаданцы
5.80
рейтинг книги
Японский городовой

Мусорщик

Поселягин Владимир Геннадьевич
3. Наемник
Фантастика:
боевая фантастика
космическая фантастика
8.55
рейтинг книги
Мусорщик

Черный Маг Императора 19

Герда Александр
19. Черный маг императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 19

Старый, но крепкий

Крынов Макс
1. Культивация без насилия
Фантастика:
рпг
уся
попаданцы
5.00
рейтинг книги
Старый, но крепкий

Кодекс Охотника. Книга VIII

Винокуров Юрий
8. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VIII

Последний Паладин. Том 10

Саваровский Роман
10. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 10

Кодекс Охотника. Книга XXIV

Винокуров Юрий
24. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXIV

Пушкарь. Пенталогия

Корчевский Юрий Григорьевич
Фантастика:
альтернативная история
8.11
рейтинг книги
Пушкарь. Пенталогия

Deus vult

Зот Бакалавр
9. Герой Империи
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Deus vult

Черная метка

Лисина Александра
7. Гибрид
Фантастика:
технофэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Черная метка

Симфония теней

Злобин Михаил
3. Хроники геноцида
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Симфония теней

Ветер перемен

Ланцов Михаил Алексеевич
5. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ветер перемен