Читаем Экстремальное программирование: Разработка через тестирование полностью

Прежде всего, у нас должна быть возможность создать тест и запустить тестовый метод. Например: TestCase("testMethod"). run(). Возникает проблема: мы собираемся написать тест для программного кода, который мы будем использовать для написания тестов. Так как у нас пока еще нет даже намека на инфраструктуру тестирования, мы вынуждены проверить правильность нашего самого первого шага вручную. К счастью, мы достаточно хорошо отдохнули, а значит, вероятность того, что мы допустим ошибку, относительно невелика. Однако чтобы сделать ее еще меньше, мы планируем двигаться маленькими-маленькими шажками, тщательно проверяя все, что мы делаем. Вот список задач, который приходит на ум, когда начинаешь размышлять о разработке собственной инфраструктуры тестирования:


Вызов тестового метода

Вызов метода setUp перед обращением к методу

Вызов метода tearDown после обращения к методу

Метод tearDown должен вызываться даже в случае неудачи теста

Выполнение нескольких тестов

Отчет о результатах


Конечно же, мы по-прежнему работаем в стиле «сначала тесты». Для нашего прототеста нам потребуется небольшая программа, которая должна отображать на экране значение «истина», если произошло обращение к тестовому методу, и значение «ложь» в противном случае. Теперь представим, что у нас есть тест, который устанавливает флаг внутри тестового метода, в этом случае мы могли бы после выполнения теста отобразить состояние флага на экране и самостоятельно убедиться в том, что флаг установлен правильно. Выполнив проверку вручную, мы сможем попробовать автоматизировать процесс.

Итак, у нас наметилась следующая стратегия. Мы создаем объект, который соответствует нашему тесту. В объекте содержится флаг. Перед выполнением тестового метода флаг должен быть установлен в состояние «ложь». Тестовый метод устанавливает флаг в состояние «истина». После выполнения тестового метода мы должны проверить состояние флага. Назовем наш тестовый класс именем WasRun[10], так как объект этого класса будет сигнализировать нам о том, был ли выполнен тестовый метод. Флаг внутри этого класса также будет называться wasRun (это несколько сбивает с толку, однако wasRun – такое подходящее имя). Собственно объект (экземпляр класса WasRun) будет называться просто test. То есть мы сможем написать инструкцию assert test.wasRun (assert – встроенная инструкция языка Python).

Язык программирования Python является интерпретируемым – команды исполняются по мере чтения их из файла с исходным кодом. Поэтому, чтобы выполнить тестирование, мы можем написать следующий короткий файл и попробовать запустить его:


test = WasRun(«testMethod»)

print(test.wasRun)

test.testMethod()

print(test.wasRun)


Мы ожидаем, что эта миниатюрная программа напечатает None до выполнения тестового метода и 1 – после. (В языке Python значение None является аналогом null или nil и наряду с числом 0 соответствует значению «ложь».) Однако программа не делает того, что мы от нее ждем. И немудрено – мы еще не определили класс WasRun (сначала тесты!).


WasRun

class WasRun:

pass


(Ключевое слово pass используется в случае, если реализация класса или метода отсутствует.) Теперь интерпретатор сообщает нам, что в классе WasRun нет атрибута с именем wasRun. Создание атрибута происходит в момент создания объекта (экземпляра класса), то есть в процессе выполнения конструктора (для удобства конструктор любого класса называется __init__). Внутри конструктора мы присваиваем флагу wasRun значение None (ложь):


WasRun

class WasRun:

def __init__(self, name):

self.wasRun = None


Теперь программа действительно отображает на экране значение None, однако после этого интерпретатор сообщает нам, что мы должны определить в классе WasRun метод testMethod. (Было бы неплохо, если бы среда разработки автоматически реагировала на это: самостоятельно создавала бы функцию-заглушку и открывала редактор с курсором, установленным в теле этой функции. Не правда ли, это было бы просто здорово? Кстати, некоторые производители IDE уже додумались до этого.)


WasRun

def testMethod(self):

pass


Запускаем файл и видим на экране два значения: None и None[11]. Нам хотелось бы видеть None и 1. Чтобы получить желаемый результат, в теле метода testMethod присвоим флагу wasRun желаемое значение:


WasRun

def testMethod(self):

self.wasRun = 1


Запускаем программу – то, что нужно! Мы получили желаемый результат. Зеленая полоса – ур-р-ра! Нам предстоит сложный рефакторинг, однако если мы видим перед собой зеленую полосу, значит, мы добились прогресса.

Теперь, вместо того чтобы напрямую обращаться к нашему тестовому методу, мы должны использовать наш реальный интерфейс – метод run(). Изменим тест следующим образом:


test= WasRun(«testMethod»)

print(test.wasRun)

test.run()

print(test.wasRun)


Чтобы заставить тест работать, достаточно воспользоваться следующей несложной реализацией:


WasRun

def run(self):

self.testMethod()


Перейти на страницу:

Все книги серии Библиотека программиста

Программист-фанатик
Программист-фанатик

В этой книге вы не найдете описания конкретных технологий, алгоритмов и языков программирования — ценность ее не в этом. Она представляет собой сборник практических советов и рекомендаций, касающихся ситуаций, с которыми порой сталкивается любой разработчик: отсутствие мотивации, выбор приоритетов, психология программирования, отношения с руководством и коллегами и многие другие. Подобные знания обычно приходят лишь в результате многолетнего опыта реальной работы. По большому счету перед вами — ярко и увлекательно написанное руководство, которое поможет быстро сделать карьеру в индустрии разработки ПО любому, кто поставил себе такую цель. Конечно, опытные программисты могут найти некоторые идеи автора достаточно очевидными, но и для таких найдутся темы, которые позволят пересмотреть устоявшиеся взгляды и выйти на новый уровень мастерства. Для тех же, кто только в самом начале своего пути как разработчика, чтение данной книги, несомненно, откроет широчайшие перспективы. Издательство выражает благодарность Шувалову А. В. и Курышеву А. И. за помощь в работе над книгой.

Чед Фаулер

Программирование, программы, базы данных / Программирование / Книги по IT

Похожие книги

Как справиться с компьютерной зависимостью
Как справиться с компьютерной зависимостью

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

Виктория Сергеевна Тундалева , Елена Вячеславовна Быковская , М О Носатова , Н Р Казарян , Светлана Викторовна Краснова

Зарубежная компьютерная, околокомпьютерная литература / Прочая компьютерная литература / Книги по IT
Компьютер в помощь астрологу
Компьютер в помощь астрологу

Книга поможет овладеть основами астрологии и научит пользоваться современными программами для астрологических расчетов. На понятном обычному человеку уровне дано объяснение принципов и идеологии астрологии «докомпьютерных» времен. Описана техника работы с программами, автоматизирующими сложные астрологические расчеты. Рассмотрены основные инструменты практикующего астролога: программы семейства Uranus для новичков, ZET 8 и Stalker — для специалистов, Almagest — для экспертов. Для всех этих программ дано развернутое описание интерфейса и приведены инструкции расчета гороскопов различного типа. Изложены методы интерпретации гороскопов с помощью компьютера. Все астрологические расчеты приведены в виде подробных пошаговых процедур, которые позволят даже начинающему получать астрологические результаты профессионального уровня. Прилагаемый компакт-диск содержит видеокурс по работе с популярными астропроцессорами.Для широкого круга пользователей.

А. Г. Жадаев , Александр Геннадьевич Жадаев

Зарубежная компьютерная, околокомпьютерная литература / Прочая компьютерная литература / Книги по IT