Принципы тестирования

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

Тестирование – процесс творческий, т.е. неформализуемый.

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

Описание предполагаемых значений выходных данных или результа­тов должно быть необходимой частью тестового набора.

Нарушение этого очевидного принципа представляет одну из наибо­лее распространенных ошибок. Ошибочные, но правдоподобные резуль­таты могут быть признаны правильными, если результаты теста не были заранее определены. Здесь мы сталкиваемся с явлением психологии: мы видим то, что мы хотим увидеть. Другими словами, несмотря на то, что тестирование по определению – поиск ошибок, у проводящих его есть подсознательное желание видеть корректный результат. Один из способов борьбы с этим явлением состоит в поощрении детального анализа выход­ных переменных заранее при разработке теста. Поэтому тест должен включать две компоненты: описание входных данных и описание точного и корректного результата, соответствующего набору входных данных.

Следует избегать тестирования программы ее автором.

Этот принцип следует из предыдущего положения.

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

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

Отсюда вовсе не следует, что программист не может тестировать свою программу. Многие программисты с этим вполне успешно справля­ются. Здесь лишь делается вывод о том, что тестирование является более эффективным, если оно выполняется кем-либо другим. Заметим, что все наши рассуждения не относятся к отладке, т.е. к исправлению уже извест­ных ошибок. Эта работа эффективнее выполняется самим автором про­граммы.

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

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

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

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

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

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

Не следует выбрасывать тесты.

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

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

Такую ошибку обычно допускают руководители проекта, исполь­зующие неверное определение тестирования как процесса демонстрации отсутствия ошибок в программе, корректного функционирования про­граммы.

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

Этот принцип, не согласующийся с интуитивным представлением, иллюстрируется на рис. 3.5.

Принципы тестирования - №1 - открытая онлайн библиотека Принципы тестирования - №2 - открытая онлайн библиотека
Рис. 3.5. Неожиданное соотношение числа оставшихся и числа обнаруженных ошибок

На первый взгляд он лишен смысла, но тем не менее подтверждается многими программами. Например, допустим, что некоторая программа со­стоит из модулей или подпрограмм А и В. К определенному сроку в мо­дуле А обнаружено пять ошибок, а в модуле В – только одна, причем мо­дуль А не подвергался более тщательному тестированию. Тогда из рас­сматриваемого принципа следует, что вероятность необнаруженных оши­бок в модуле А больше, чем в модуле В. Справедливость этого принципа подтверждается еще и тем, что для ошибок свойственно располагаться в программе в виде неких скоплений, хотя данное явление пока никем еще не объяснено. Преимущество рассматриваемого принципа заключается в том, что он позволяет ввести обратную связь в процесс тестирования. Если в какой-нибудь части программы обнаружено больше ошибок, чем в дру­гих, то на ее тестирование должны быть направлены дополнительные уси­лия.

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

Тестирование – это процесс выполнения программ с целью обнару­жения ошибок.

Хорошим считается тест, который имеет высокую вероятность обнаружения еще не выявленной ошибки.

Удачным считается тест, который обнаруживает еще не выяв­ленную ошибку.