Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / Питер_Гудлиф_Ремесло_программиста_Практика_написания_хорошего_кода.pdf
Скачиваний:
16
Добавлен:
19.04.2024
Размер:
9.23 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

8

Время испытаний

Черная магия тестирования

В этой главе:

Зачем тестировать?

Кто отвечает за тестирование?

Как правильно тестировать?

Виды тестирования

Все испытывайте, хорошего держитесь.

Первое послание к Фессалоникийцам 5:21

Можно написать сколько угодно кода и быть уверенным только в одном: с первого раза он не заработает идеально. Это не зависит от то% го, сколь долго и тщательно вы разрабатыва% ли код; ошибки обладают мерзким свойст% вом проникать в любую программу. Чем больше кода вы напишете, тем больше оши% бок в нем окажется. Чем быстрее вы будете писать, тем больше будет ошибок. Я еще не встречал действительно плодовитого про% граммиста, код которого хотя бы с натяжкой можно было считать свободным от ошибок.

Как с этим борются? Путем тестирования кода. Это делается, чтобы найти имеющие% ся проблемы, а после их решения сохранять уверенность в коде по мере того, как мы его модифицируем. Выпускать программное обеспечение, не протестировав его, – просто

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

184m

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

Глава 8. Время испытанийClick

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

самоубийство, каким бы замечательным программистом вы себя ни считали. Программное обеспечение, не прошедшее тестирования, не% избежно приведет к сбоям; тестирование – важная составная часть на% шего ремесла. Очень многие профессиональные производители ПО не% дооценивают важность тщательного тестирования или пытаются про% вести его в течение жалкого времени, остающегося перед поставкой продукта. И это дает о себе знать.

Тестирование нельзя рассматривать как процедуру, относящуюся к са% мому завершению процесса разработки и служащую подтверждением того, что вы выпустили стоящий продукт. Если вы так воспринимаете его, то всегда будете выпускать очень слабый код. Тестирование – цен% тральный элемент создания программного продукта. Только путем тестирования, не дожидаясь окончания работ, вы можете убедиться, что каждый фрагмент кода работает. Как еще можно в этом убедить% ся? Почему многие производители ПО считают, что могут обойтись без достаточного тестирования?

Терминология

Термин bug (программная ошибка) чрезвычайно многозначен и крайне неточен. Нет ничего проще, чем произносить слова, не понимая их действительного смысла. Использование специаль% ной терминологии помогает лучше определить свои действия. Следующие определения навеяны стандартами IEEE (IEEE 84):

Ошибка (error)

То, что вы сделали неправильно. Деятельность, приведшая к появлению дефекта в программном продукте. Например, ес% ли вы забыли проверить условие в коде (скажем, размер масси% ва C, перед тем как обратиться к его элементу), то это ошибка.

Неисправность (fault)

Неисправность – это следствие ошибки, введенной в про% граммном продукте. Я сделал ошибку, и это привело к неис% правности в коде. Первоначально проблема скрыта. Если на% писанный мною код никогда не будет выполняться, то эта не% исправность никогда не проявится. Если выполнение часто передается коду, в котором есть неисправность, но всегда в та% ких условиях, что неисправность не проявит себя, мы нико% гда не заметим ее наличия.

Это обстоятельство весьма затрудняет отладку программ. Не% исправная строка кода может годами прекрасно работать, по% ка вдруг не вызовет совершенно необъяснимое раздражение системы; странно будет подозревать код, который безупречно работал годами.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

Проверкаm

на подлинность

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

185Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

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

Отказ (failure)

При столкновении с неисправностью может возникнуть от# каз. Но не обязательно. Отказ как проявление неисправности – это то, что нас должно действительно беспокоить. Возможно, это единственное, на что мы обратим внимание. Отказ – это отклонение работы программы от технических требований и предполагаемого поведения. Здесь мы вступаем в область философии. Если в лесу рухнуло дерево, услышим ли мы звук падения? Если в работающей программе ошибка ничем не проявилась, есть в ней неисправность или нет? Попробуем от% ветить на этот вопрос с помощью определений.

Ошибка, баг (bug)

Баг – разговорное слово, часто используемое как синоним для неисправности (fault). По преданию первым компьютерным багом был настоящий баг (жук). Его обнаружил адмирал Грэйс Хоппер в 1947 году в Гарварде. Мотылек, застрявший между двумя электрическими реле машины Mark II Aiken Relay Calculator, вызвал аварию и отключение всей машины.

Проверка на подлинность

Два простых вопроса – Что такое тестирование? и Зачем нужно тес# тирование? – кажутся до боли очевидными. И тем не менее очень час% то тестирование осуществляется неправильно или на неправильно вы% бранном этапе разработки. Умелое тестирование – это искусство. Ре% альное проведение тестирования – это уровень, которого многие про% граммисты не достигают; от одного упоминания о тестировании они покрываются холодным потом. «В тестировании главное правило – это провести его» (Kernighan Pike 99).

Тестирование – это особый вид деятельности, не совпадающий с отлад% кой, хотя границы между ними четко не определены и их часто смеши% вают. Тестирование – это методология доказательства наличия или отсутствия неисправностей в программном обеспечении. Отладка – это действия, направленные на выяснение причин такого неисправно% го поведения. Тестирование приводит к отладке, а отладка приводит к устранению неисправностей, что требует повторного тестирования (с целью доказать действенность исправлений).

Тестирование – это не отладка. Не путайте между собой эти виды работы. Каждый требует особых навыков. Следите за тем, чем вы заняты – тести& рованием или отладкой.