Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Бек К. -> "Экстремальное программирование: разработка через тестирование " -> 39

Экстремальное программирование: разработка через тестирование - Бек К.

Бек К. Экстремальное программирование: разработка через тестирование — СПб.: Питер, 2003. — 224 c.
ISBN 5-8046-0051-6
Скачать (прямая ссылка): bek-k..pdf
Предыдущая << 1 .. 33 34 35 36 37 38 < 39 > 40 41 42 43 44 45 .. 81 >> Следующая


method = getattr(self. self.name)

methodO except:

result.testFailedO self .tearDown ()

Теперь мы можем облагородить обращение к тестовым методам в конце файла:

suite= TestSuiteO

sui te. add (TestCaseTest("testTemplateMethod"))

suite.add(TestCaseTest("testResult"))

suite.add(TestCaseTest("testFailedResultFormatting"))

suite.add(TestCaseTest("testFai ledResult"))

suite.add(TestCaseTest("testSuite"))

result= TestResultO

suite.run(result)

print result.summary()

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

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

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

Метод tearDown должен быть вызван даже в случае, если тестовый метод

не сработал

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

Отчет о результатах Строко журнала в классе WasRun Отчет о не сработавших тестах Перехват и отчет об ошибках setup

Создать объект TestSuite автоматически на основе класса TestCase

Глава 23 • Оформляем тесты в набор 121

Здесь слишком много дублирования, от которого можно избавиться, если обеспечить способ конструирования набора тестов автоматически, исходя из предоставленного класса TestCase.

Однако вначале восстановим корректное выполнение четырех не сработавших тестов (эти тесты используют старый интерфейс функции run() без аргументов):

TestCaseTest

def testTemplateMethod(self): test= WasRun("testMethod") result= TestResultO test.run(result)

assert("setup testMethod tearDown " == test.log)

def testResult(self):

test= WasRun("testMethod") result= TestResultO test.run(result)

assertC'l run, 0 failed" == result.summaryO) def testFailedResult(self):

test= WasRunC'testBrokeriMethod") result= TestResultO test.run(result)

assertC'l run. 1 failed" == result.summaryO) def testFai1edResultFormatting(self):

result= TestResultO result.testStartedO result.testFailedO

assertC'l run. 1 failed" == result.summaryO)

Обратите внимание, что каждый из тестов создает экземпляр класса TestResult — эту операцию можно выполнить однократно внутри метода set(Jp(). Благодаря реализации этой идеи мы упростим тесты, однако сделаем их несколько более сложными в прочтении:

TestCaseTest

def setUp(self):

self.result= TestResultO def testTemplateMethod(self):

test= WasRun("testMethod")

test.run(self.result)

assert("setup testMethod tearDown " == test.log) def testResult(self):

test= WasRun("testMethod") test.run(self.result)

assertC'l run, 0 failed" = self .result. summaryO) def testFailedResult(self): • test= WasRunC'testBrokeriMethod") test.run(self.result)

assertC'l run, 1 failed" == self .result, summary O) def testFailedResultFormatting(self): self .result. testStartedO

self. result. testFailedO

assertC'l run. 1 failed" = self .result. summaryO) def testSuite(self): suite= TestSuiteO suite.add(WasRun("testMethod")) suite.add(WasRun("testBrokenMethod")) suite.run(self.result)

assert("2 run. 1 failed" = self .result. summaryO) Вызор тестового метода

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

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

Метод tearDown должен быть вызван даже в случае, если тестовый метод

не сработал

Выполнение нескольких тестов Отчет о результатах Строка журі юло в классе WosRun Отчет о не сроботовших теетох Перехват и отчет об ошибках setUp

Создать объект TestSuite автоматически на основе класса TestCase

Все эти бесчисленные ссылки self выглядят ужасно, однако без этого в языке Python никак не обойтись. Если бы этот язык изначально был объектно-ориентированным, наверное, в этих ссылках не было бы надобности, а ссылки на глобальные переменные требовали бы квалификации. Однако язык Python изначально является интерпретируемым языком с добавленной в него поддержкой объектов (надо отметить, что поддержка объектов в этом языке реализована великолепно). В результате по умолчанию переменные считаются глобальными, а явные ссылки на self — необходимыми.

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

Чтобы подвести итог, напомню, что в данной главе мы:

• написали тест для класса TestSuite;

• написали часть реализации, однако не добились срабатывания тестов — это нарушение правил (я уверен, что существует простая поддельная реализация, которая заставила бы тесты срабатывать, благодаря чему мы могли бы выполнять рефакторинг, имея перед глазами зеленую полоску, однако сейчас я не хочу думать на эту тему);

• изменили интерфейс метода run(), благодаря чему набор тестов можно использовать точно так же, как и отдельный тест, — в результате тесты, наконец, сработали;

• выполнили рефакторинг имеющихся тестов — переместили общий код создания объекта результатов в метод setUpQ.

Ретроспектива xUnit

Если перед вами встала задача разработки своей собственной инфраструктуры тестирования, методика, описанная в части II данной книги, послужит вам руководством. Не следует слишком много внимания уделять деталям реализации, — значительно больший интерес представляют тесты. Если вы напишете код, обеспечивающий срабатывание представленных здесь тестов, значит, в вашем распоряжении окажется минимальная инфраструктура тестирования, пригодная для запуска тестов в условиях изоляции и обеспечивающая композицию тестов. Вы сможете приступить к разработке программного кода в стиле TDD.
Предыдущая << 1 .. 33 34 35 36 37 38 < 39 > 40 41 42 43 44 45 .. 81 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100