Программирование на языке Ruby - [192]

Шрифт
Интервал

>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, но пока еще работает не очень стабильно и плохо документирована.

16.3. Работа с отладчиком Ruby

Честно говоря, отладчик Ruby не особенно популярен. Лично я им не пользуюсь и встречал не так уж много людей, которые с ним работали. Но сознавать, что он есть, приятно. Ниже приводится краткое описание работы с ним.

Для вызова отладчика нужно просто затребовать библиотеку >debug — например, в командной строке:

>ruby -rdebug rayfile.rb

В ответ на приглашение вида (>rdb:1) вы можете вводить различные команды, например >list для получения текста всей программы или ее части, step для пошагового исполнения метода и т.д. Некоторые команды перечислены в таблице 16.1 (полужирным шрифтом набраны сокращения).


Таблица 16.1. Наиболее употребительные команды отладчика

КомандаОписание
>breakУстановить точку прерывания или получить их список.
>deleteУдалить все или некоторые точки прерывания.
>catchУстановить точку перехвата или получить их список.
>stepВход внутрь метода.
>nextПерейти к следующей строке (без захода внутрь метода).
>helpСправка (вывести список всех команд).
>quitВыйти из отладчика.

В листинге 16.4 приведен код простой программы (даже слишком простой, чтобы ее отлаживать).

Листинг 16.4. Простая программа для демонстрации работы отладчика

>STDOUT.sync = true


>def palindrome?(word)

> word == word.reverse

>end


>def signature(w)

> w.split("").sort.join

>end


>def anagrams?(w1,w2)

> signature(w1) == signature(w2)

>end


>print "Give me a word: "

>w1 = gets.chomp


>print "Give me another word: "

>w2 = gets.chomp


>verb = palindrome?(w1) ? "is" : "is not"

>puts "'#{w1}' #{verb} a palindrome."


>verb = palindrome?(w2) ? "is" : "is not"

>puts "'#{w2}' #{verb} a palindrome."


>verb = anagrams?(w1,w2) ? "are" : "are not"

>puts "'{w1}' and '#{w2}' #{verb} anagrams."

В листинге 16.5 показан полный сеанс отладки. Некоторые места не слишком понятны, потому что на консоль выводят данные и сама программа, и отладчик.

Листинг 16.5. Сеанс отладки простой программы

>$ ruby -rdebug db.rb

>Debug.rb

>Emacs support available.


>db.rb:1:STDOUT.sync = true

>(rdb:1) b palindrome?

>Set breakpoint 1 at db.rb:palindrome?

>(rdb:1) b anagrams?

>Set breakpoint 2 at db.rb:anagrams?

>(rdb:1) b

>Breakpoints:

> 1 db.rb:palindrome?

> 2 db.rb:anagrams?

>(rdb:1) n

>db.rb:3:def palindrome?(word)

>(rdb:1) n

>db.rb:7:def signature(w)

>(rdb:1) n

>db.rb:11:def anagrams?(w1,w2)

>(rdb:1) n

>db.rb:15:print "Give me a word: "

>(rdb:1) n

>Give me a word: db.rb:16:w1 = gets.chomp

>(rdb:1) live

>db.rb:16:undefined local variable or method 'live' for main:Object

>(rdb:1) n

>live

>db.rb:18:print "Give me another word: "

>(rdb:1) n

>Give me another word: db.rb:19:w2 = gets.chomp

>(rdb:1) n

>evil

>db.rb:21:verb = palindrome?(w1) ? "is" : "is not"

>(rdb:1) с

>Breakpoint 1, palindrome? at db.rb:palindrome?

>db.rb:3:def palindrome?(word)

>(rdb:1) n

>db.rb: 4: word == word.reverse

>(rdb:1) word

>"live"

>(rdb:1) n

>db.rb: 22: puts "'#{w1}' #{verb} a palindrome."

>(rdb:1) verb "is not"

>(rdb:1) n

>'live' is not a palindrome.

>db.rb:24:verb = palindrome?(w2) ? "is" : "is not"

>(rdb:1) n

>db.rb:24:verb = palindrome?(w2) ? "is" : "is not"

>(rdb:1) n

>Breakpoint 1, palindrome? at db.rb:palindrome?

>db.rb:3:def palindrome?(word)


Рекомендуем почитать
Графика DirectX в Delphi

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


Вторая жизнь старых компьютеров

Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.


DirectX 8. Начинаем работу с DirectX Graphics

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.