Хотя книга «Искусство тестирования программ» не обладает присущими работе Кнута фундаментальностью и объемом, ее авторы тем не менее добились того, что она стала руководством к действию для людей, стремящихся достичь совершенства в занятии не менее сложном, чем программирование, — в тестировании ПО. Издательство «Диалектика» представляет перевод на русский язык уже третьего издания этой книги — первое увидело свет в 1979 году. Но несмотря на произошедшие революционные перемены в мире ИТ, которые не могли не затронуть и дисциплины разработки и тестирования программного обеспечения, работа своей актуальности не теряет. Секрет в том, что авторы не сосредотачиваются на конкретных методиках и приемах тестирования для определенных языков программирования и сред разработки, а предлагают читателям овладеть общей философией и принципами тестирования, которые не устаревают. При этом ценно, что новое издание не оставляет без внимания современные явления в ИТ, оказывающие самое непосредственное влияние на тестирование. Отдельные главы книги посвящены применению сформулированных авторами общих принципов тестирования в agile-средах, в тестировании систем электронной коммерции и мобильных приложений.
Во введении к книге отмечается, что в год выхода первого издания в индустрии разработки ПО действовало эмпирическое правило — примерно 50% времени и более 50% общей стоимости типичного программного проекта тратится на тестирование разрабатываемой системы. Это остается справедливым и сегодня. Тестирование является ключевым и одним из наиболее сложных этапов любого проекта разработки ПО, при этом за прошедшие годы оно получило неплохую поддержку в инструментах автоматизации, но не нашло серьезных научных обоснований и, как замечают авторы, остается, вероятно, наименее изученным этапом разработки и одновременно одним из наименее популярных среди специалистов. Книга «Искусство тестирования программ» не ставит задачей сформулировать теоретические основы тестирования, но дает множество полезных практических советов нынешним и будущим тестировщикам, в том числе советов психологического характера, помогая не только освоить, но и полюбить непростое занятие тестирования программ.
Не претендуя на фундаментальность, авторы тем не менее кладут в основу своего изложения очень важные философские концепции тестирования, проясняющие глобальное назначение этой работы и помогающие правильно выстроить ее на практике. Основополагающий философский принцип тестирования следующий: тесты должны доказывать не то, что приложение работает правильно, а то, что оно не работает на предоставленных примерах. Авторы настаивают, что непонимание сути процесса тестирования является одной из главных причин его неудач. Как правило, разработчики считают, что целью тестирования является демонстрация отсутствия ошибок в программе, что оно призвано показать корректность выполнения программой заданных функций. Однако это не так — тестирование предназначено не для того, чтобы показать, что программа работает правильно, а для того, чтобы обнаружить в ней ошибки. «Программу тестируют для того, чтобы придать ей дополнительную ценность, — пишут авторы. — Повышение ценности программы путем ее тестирования связано с улучшением ее качества и надежности. В свою очередь, улучшение надежности программы означает обнаружение и устранение содержащихся в ней ошибок».
Однако правильное понимание сути тестирования создает определенные психологические проблемы для тестировщиков, и потому авторы предваряют разбор технических практик тестирования специальной главой, посвященной психологическим и экономическим аспектам тестирования ПО. Постановка задачи — найти как можно больше ошибок, а не продемонстрировать правильность работы программы — определяет деструктивный характер процесса тестирования, который накладывает серьезный отпечаток на отношение к нему специалистов. Но они должны отдавать себе отчет в том, что именно такой взгляд на тестирование является единственно правильным и направлен на достижение вполне позитивной цели — создания качественной и надежной программы. А экономика тестирования базируется на понимании того факта, что никакой даже самый обширный набор тестов не способен обнаружить абсолютно все имеющиеся в программе ошибки. Необходимо выработать определенные стратегии тестирования, чтобы процесс имел оправданную с экономической точки зрения трудоемкость.
Последующие главы книги описывают различные методы и практические приемы тестирования, включая различные способы просмотра кода вручную, модульное тестирование, разные типы высокоуровневого тестирования, крайне важное для множества современных приложений тестирование удобства использования, а также отладку кода. Изложение сопровождается примерами, написанными с использованием наиболее популярных сегодня языков программирования.
Книга «Искусство тестирования программ» адресована трем категориям читателей. Первая — это профессиональные разработчики, которые уже владеют определенными методиками и приемами тестирования, но могут с помощью книги расширить свои знания. Авторы считают, что «даже если почерпнутые программистом сведения помогут ему дополнительно обнаружить всего одну ошибку в какой-либо программе, то деньги, потраченные на покупку книги, окупятся сторицей». Вторая категория — это менеджеры программных проектов, которым книга поможет правильно определить цели тестирования и использовать эффективные практики управления процессом тестирования. Ну и конечно, студенты, в отношении которых авторы преследуют двоякую цель: «продемонстрировать, с какими проблемами им придется столкнуться при тестировании ПО, и предложить набор эффективных методик тестирования». Хотя авторы рекомендуют студентам использовать книгу как дополнение к изучаемым курсам программирования, представляется, что в российских вузах она вполне могла бы стать основой отдельного курса, которых в подготовке отечественных специалистов в области программной инженерии пока явно недостаточно.
Гленфорд Майерс, Том Баджетт, Кори Сандлер. Искусство тестирования программ, 3-е изд.: Пер. с англ. — М.: ООО «И.Д. Вильямс», 2012. — 272 с.: ил