Главная - Литература

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 [170] 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294

менее реалистичными в зависимости от требуемой степени достоверности. Такие леса могут:

немедленно возвращать управление, не выполнив никаких действий;

тестировать полученные данные;

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

запрашивать возвращаемые значения у программиста;

возвращать стандартный ответ независимо от полученных данных;

впустую тратить ресурсы процессора, выделенные реальному объекту или методу;

играть роль более медленной, объемной, простой или менее точной версии реального объекта или метода.

Другим типом лесов является поддельный метод, вызывающий реальный тестируемый метод. Такой метод, называемый «драйвером» или иногда «тестовой сбруей» (test harness), может:

вызывать объект, передавая ему некоторые данные;

запрашивать информацию у программиста и передавать ее объекту;

принимать параметры командной строки (если ОС это поддерживает) и передавать их объекту;

читать аргументы из файла и передавать их объекту;

вызывать объект несколько раз, передавая ему при каждом вызове новый предопределенный набор входных данных.

Птттшй штп Грть Последний тип лесов, фиктивный файл (упрощенная вер-между ииструмеишй шщй- реального полноразмерного файла), включает такие же

шт и инструментами отпад- элементы. Небольшой фиктивный файл обладает двумя доки размыта. 06 инструментах стоинствами. Его небольшой объем позволяет держать в уме отладки см. раздел ве его содержимое и облегчает проверку правильности фай-

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

Очевидно, что создание лесов требует некоторой работы, но Шр: сс2ехош/2268 в сможете повторно использовать их даже при обнаружении

ошибки в классе. Кроме того, существуют многие инструменты, упрощающие создание поддельных объектов и других видов лесов. При тестировании класса леса позволяют исключить его взаимодействие с другими классами. Леса особенно полезны, если в программе применяются утонченные алгоритмы. Так, если тестируемый код встроен в другой блок кода, тесты могут выполняться неприемлемо медленно. Леса позволяют тестировать код непосредственно. Несколько минут, потраченных на создание лесов для тестирования кода, скрытого в самых глубинах программы, могуг сэкономить много часов на отладке.

Для создания лесов годится любая из многих доступных сред тестирования QUnit, CppUnit, NUnit и т. д.). Если ваша среда разработки не поддерживается ни одной из существующих сред тестирования, вы можете написать несколько методов класса и включить в файл метод тагпО для их тестирования, пусть даже эти методы не



Инструменты сравнения файлов

Регрессивное (или повторное) тестирование значительно

облегчают автоматизированные инструменты сравнения сйвиш жтированйи см. пораз* действительных выходных данных с ожидаемыми. Данные, ея «Повторное (регрессивное) выводимые на печать, легко проверить, перенаправив их в тестирование» раздела 22-6. файл и сравнив при помощи diff или другой утилиты сравнения файлов с другим файлом, в который ранее были записаны ожидаемые данные. Если файлы различаются, радуйтесь: вы обнаружили регрессивную ошибку

Генераторы тестовых данных

Вы также можете написать код для систематичного тестирования выбранных фрагментов программы. Несколько лет http: oc2e.com/2275 назад я разработал собственный алгоритм шифрования и

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

Я настроил генератор тестовых данных, который полностью тестировал шифровальную и дешифровальную части программы. Он генерировал файлы, состоящие из случайных символов и имеющие случайный объем в пределах от О до 500 кб. Он генерировал случайные пароли случайной длины в диапазоне от 1 до 255 символов. Для каждого случая он генерировал две копии случайного файла, шифровал одну копию, заново инициализировался, дешифровал копию и затем сравнивал дешифрованную копию с первоначальной. Если какие-нибудь байты различались, генератор печатал всю информацию, нужную мне для воспроизведения ошибки.

Я настроил генератор так, чтобы средний объем тестируемых файлов равнялся 30 Кб. Если бы я этого не сделал, файлы были бы равномерно распределены между О кб и 500 кб и имели средний объем 250 кб. Сокращение среднего объема позволило мне быстрее тестировать файлы, пароли, признаки конца файла, необычные объемы файлов и прочие возможные причины ошибок.

Результаты не заставили себя ждать. Выполнив лишь около 100 тестов, я нашел две ошибки. Обе возникали в специфических ситуациях, которые могли ни разу не случиться на практике, однако это все же были ошибки, и я был рад их обнаружить. После их исправления я тестировал программу несколько недель, зашиф-

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



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

Из этой истории можно извлечь ряд уроков, в том числе следующие.

Правильно спроектированные генераторы случайных данных способны генерировать комбинации тестовых данных, о которых вы могли бы не подумать.

Генераторы случайных данных могут протестировать программу тщательнее, чем вы сами.

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

Модульное проектирование сполна окупается во время тестирования. Я смог отделить код шифрования и дешифрования и задействовать его независимо от кода пользовательского интерфейса, что упростило задачу написания тестового драйвера.

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

Мониторы покрытия кода тестами

Карл Вигерс сообщает, что тестирование, выполняемое без измерения покрытия кода тестами, обычно охватывает только 50-60% кода (Wiegers, 2002). Монитор покрытия - это инструмент, который следит за тем, какой код тестировался, а какой нет. Монитор покрытия особенно полезен для систематичного тестирования, потому что он говорит вам, полностью ли код покрывается конкретным набором тестов. Если вы выполнили полный набор тестов, а монитор покрытия сообщает, что какой-то код все еще не протестирован, значит, нужны дополнительные тесты.

Регистраторы данных

Некоторые инструменты могут следить за программой и http; cc2e.com/2282 собирать информацию о ее состоянии в случае краха по-

добно «черному ящику», устанавливаемому в самолетах для определения причин крушения. Эффективная регистрация данных облегчает диагностику ошибок и сопровождение программы после ее выпуска.

Вы можете создать собственный регистратор данных, записывающий сведения о важных событиях в файл. Записывайте в файл состояние системы до ошибки и подробные сведения об условиях возникновения ошибки. Можете использовать эту функциональность в предварительных версиях программ и блокировать в окончательных версиях. Если вы используете для хранения зарегистрированных данных самоочищающееся хранилище и тщательно продумали размещение и содержание сообщений об ошибках, можете оставлять функции регистрации данных и в итоговых версиях программ.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 [170] 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294



0.0037