Захаров Виктор
Тестирование программного обеспечения. Основы
Настольная книга специалиста по тестированию
Первое издание
Бердск, 2024
Погрузитесь в увлекательный мир тестирования программного обеспечения вместе с книгой, которая является настоящим концентратом чистейших знаний для новичков и профессионалов! Автор делится секретами мастерства, подробно рассказывая о более 15 видах тестирования и более 20 методах проектирования тестов. И это только вершина айсберга знаний, изложенных в книге. Вы будете поражены глубиной информации и открытием знаний, о которых даже не догадывались. Книга насыщена ценнейшими советами, основанными на практическом опыте. Многочисленные примеры помогут быстрее освоить представленный в книге материал. Вооружившись знаниями из этой книги, вы будете уверенно разбираться в нюансах тестирования программного обеспечения и с лёгкостью применять знания на практике! Книга может по праву считаться настольной книгой специалиста по тестированию.
На момент написания данной книги я работаю в одной из крупнейших компаний на должности руководителя управления, отвечающего за качество программного обеспечения. За плечами у меня 17 лет опыта в области информационных технологий, из них 13 лет я руковожу подразделениями тестирования.
В процессе работы регулярно возникала необходимость подбора новых сотрудников. Проводя собеседования, я видел низкую квалификацию кандидатов и большие провалы в знаниях и навыках тестирования. На должность специалистов приходят плохо подготовленные кадры!
Многие проходят курсы по тестированию, которые в наше время не создаёт только ленивый. По заверениям многих учебных центров их обучающие курсы ведут сертифицированные специалисты (сертификат ISTQB[1]). Однако огромному их количеству рано учить, им надо учиться. Это я понял, когда знакомился с программами, материалами и лекциями преподаваемых курсов. Я был разочарован качеством!
Тогда я принял решение создать учебную программу, где все имеющиеся у меня знания будут чётко структурированы, где не окажется противоречий, где есть большой практический блок, способный помочь в обучении собственных сотрудников. После длительной кропотливой работы был разработан курс для начинающих специалистов по тестированию, содержащий фундаментальные основы по тестированию.
Создавался он около года: писались материалы, проводилась сверка со стандартами, разрабатывалось программное обеспечение для практической работы и так далее. В подготовке мне помогала супруга. Через год курс был готов. Новые сотрудники, приходящие в подразделение, начали обучаться, повышая квалификацию. Результат не заставил себя долго ждать.
Курс представлял собой концентрат чистейших знаний по тестированию. В ходе разработки было подготовлено и переработано множество материалов, и в процессе обучения сотрудников он постоянно совершенствовался. Мне пришла в голову мысль, что все имеющиеся у меня на руках и в голове знания и опыт необходимо передать всем желающим. Настал момент написания книги.
Сейчас вы читаете ту самую книгу, которая поможет вам постичь фундаментальные основы тестирования программного обеспечения. Написана она простым и доступным языком. Материал будет понятен даже неискушённому читателю. Книга интересна и полезна как новичкам, так и опытным специалистам – каждый найдёт для себя необходимые знания и советы!
Располагайтесь удобнее. Мы с вами начинаем постигать таинственный мир тестирования программного обеспечения. Вас ждут новые открытия и знания. В добрый путь.
История тестирования компьютерных программ началась в 1950-х годах, когда впервые появились компьютеры. В то время программисты[2] самостоятельно проверяли свои программы на работоспособность, чтобы убедиться, что они работают правильно. В эти годы появилось одно из определений: тестирование – это процесс проверки программы с целью демонстрации её правильной работы.
Первые серьёзные программы создавались для научных исследований и для нужд министерств обороны. Требовалась чёткая и бесперебойная работа, а также отсутствие ошибок. В связи с этим процесс решили формализовать и стандартизировать. Проверка работоспособности программ проводилась формализовано с фиксированием всех изучаемых данных и полученных результатов.
В 1960-е годы люди стремились охватить программы полностью, то есть проверять все возможные передаваемые программе данные и все варианты выполнения программ. К примеру, программа может складывать большие числа, и вместо проверки сложения нескольких чисел, пробовали все возможные варианты без исключения: 1 + 1, 1 + 2, 1 + 3… 2 + 10, 2 + 11… 1259 + 15, 1259 + 16… и так далее.
Миллионы проверок! Это оказалось нереально, поскольку существует много данных, которые необходимо вводить или передавать в программу, много вариантов обработки передаваемых данных, и на их проверку уйдут годы. Также в документах, где описано, как создавать программу, присутствовало большое количество ошибок, которые трудно было найти. Поэтому метод полной проверки отклонили и признали неработоспособным. Появился один из принципов тестирования – исчерпывающее тестирование невозможно.
До 1970-х годов проверка программы означала демонстрацию её правильной работы. Но это занимало много времени и не давало полной информации о качестве программы. Подход оказался неэффективным. В 1970-х годах произошли изменения: вместо демонстрации правильной работы программы использовали поиск существующих в ней ошибок. Удачной проверкой считалась та, с помощью которой обнаруживали ранее неизвестную ошибку. В эти годы появилось очередное определение тестирования – это процесс проверки программы с целью нахождения ошибок.
В 1980-е годы начинается формирование концепции тестирования, дошедшей до наших дней. Проверка программ включила в себя такое понятие как «предупреждение ошибок».
Предупреждение ошибок – это информирование о возможной ошибке до того, как она станет серьёзной проблемой.
Это помогает исправить ошибку прежде, чем программа попадёт к пользователям и станет критической. Одним из эффективных способов предотвращения ошибок является проектирование тестов. То есть перед тем, как проверять программу, необходимо продумать, какие проверки мы будем делать, далее зафиксировать их списком и только после этого проверять работоспособность программы по составленному списку проверок.
В эти же годы стало понятно: необходимо сформировать принципы и подходы тестирования. Это позволит решать конкретные задачи и формализует процесс, чтобы он стал управляемым, дающим возможность контролировать качество программ на протяжении всех этапов их создания. В дальнейшем мы познакомимся с каждым этапом.
Тестирование, существовавшее до начала 1980-х годов, проверяло только собранные и работающие программы. Это означает, что проверялась программа, которую можно было запустить и работать с ней. Однако с течением времени специалисты по тестированию начали принимать участие на всех этапах её создания, что позволяло выявлять проблемы заранее и уменьшать сроки и стоимость разработки. Тестирование стало больше чем просто поиск ошибок или демонстрация правильной работы программы.
В 1990-е годы понятие «тестирование» означало не только проверку программы, но и планирование процесса проверки, создание, поддержку и выполнение тестов, а также окружений, в которых работала и проверялась программа. Тогда тестирование стало важной составляющей для поддержания и улучшения качества программ. Это дало развитие инструментам, используемым для поддержки процессов тестирования: многофункциональные системы и инструменты для автоматизации тестирования; инструменты формирования отчётов; системы написания и хранения тестов и проведения тестирования; системы для проверки работы программ под высокой нагрузкой.
В настоящее время тестирование является важным инструментом для гарантии качества программ и уверенности в их правильной работе. Оно продолжает развиваться и не стоит на месте. Инновации в данной области позволяют постоянно улучшать качество и надёжность программ. Сейчас специалисты по тестированию играют важную роль в процессе разработки программ.
Мы пользуемся множеством различных программ каждый день, даже не задумываясь об этом. Например, покупая что-то в магазине, используются кассовые аппараты; снимая наличные деньги, мы используем банкоматы; посещая различные сайты, мы используем компьютеры, все это работает благодаря специальным программам.
Кто-то разрабатывает их, а кто-то проверяет работоспособность – тестирует. Специалистов, тестирующих программы, называют «специалистами по тестированию» или «тестировщиками». Есть профессиональный стандарт, где указано чёткое наименование профессии – «специалист по тестированию», поэтому в данной книге будем использовать термин оттуда.
Те, кто никогда не сталкивались с тестированием, иногда заблуждаются, думая, будто специалисты по тестированию – это люди, которые в процессе работы бессмысленно нажимают различные кнопки в проверяемой программе. Это не так. Тогда кто же он – этот специалист по тестированию?
Этот человек проверяет программы и в процессе проверки проводит их глубокий анализ и исследование. Он имеет аналитический склад ума, постоянно развивает навыки логически мыслить и анализировать большой объём информации, прежде чем решать поставленные перед ним задачи. Благодаря гибкости ума он моделирует различные ситуации, в которых программа может работать. И если она работает не так, как должна, а её ожидаемое поведение обязательно закреплено в специальной документации, специалист по тестированию должен сообщить программистам об ошибке. Специалисту по тестированию в этот момент понадобится важный для его профессии навык – умение чётко формулировать мысли и грамотно доносить информацию до других. Зачем нужен этот навык? Если программист не поймёт, что именно работает неправильно, он не сможет исправить ошибку или потратит на поиск непозволительно много времени.
Однако на этом работа специалиста по тестированию не заканчивается. Он следит за тем, чтобы программу или оборудование, в которое встроена программа, было удобно использовать. Например, если кто-то разместит монитор банкомата на уровне колен человека, пользоваться им будет затруднительно. Тестировщик должен сообщать о подобных недочётах тем, кто отвечает за проектирование удобства использования, чтобы исправить проблему до того, как такой банкомат перешёл в массовое производство. Аналогичная ситуация и с программами. Если с интерфейсом существуют значительные проблемы в удобстве её использования, специалист по тестированию должен сообщать об этом.
Он хорошо знает, как работает программа, которую проверяет. Порой даже лучше программистов, которые её создают. Если программа очень большая, команда программистов делится на группы. Каждая знает только ту часть, за разработку которой отвечает, а тестировщикам приходится изучать и знать функционирование всей программы целиком, чтобы проверять её работу комплексно. По опыту могу сказать: программисты ценят квалифицированных специалистов по тестированию, и когда у новых программистов возникают вопросы связанные с работой программы, они идут к ним за помощью. Встречались ситуации, когда новые программисты или аналитики[3], изучая работу новой для них программы, обучались у опытных тестировщиков.
Надо помнить, что на плечи специалистов по тестированию ложится ответственность за качество работы программ. И от качества их работы зависит очень многое: от размера прибыли компании до жизни людей. Практически каждая компания, связанная с разработкой программ, имеет в своём штате тестировщиков.
Никто не идеален, все мы допускаем ошибки. Они могут быть как незначительными, так и очень серьёзными, некоторые имеют разрушительные последствия. Поэтому, когда мы создаём какой-либо продукт, в том числе компьютерные программы, необходима проверка, чтобы его использование было безопасным и эффективным. В этот момент и нужны специалисты по тестированию.
У многих возникает вполне закономерный вопрос: «Зачем привлекать специалистов по тестированию для проверки программ, если это могут делать программисты, разрабатывавшие её?». В некоторых компаниях, где нет специалистов по тестированию, так и происходит. Программисты сами и разрабатывают, и тестируют. Однако не всё так просто.
Во-первых, если программист сам занимается тестированием своей программы, у него будет меньше времени, чтобы фокусироваться на прямых обязанностях: разработке программы и устранении ошибок. Таким образом, время, которое уходит на разработку и тестирование в целом, значительно больше, чем если тестирование выполняется специалистами по тестированию. Конечно же программист проверяет программу перед тем, как передать её специалистам по тестированию, однако делает это поверхностно, чтобы удостовериться, что логика, которую он реализовал, работает. Если он этого не сделает, и программа, переданная на тестирование, не будет функционировать, специалисты по тестированию вернут её на доработку.
Во-вторых, программист не всегда может предусмотреть все возможные способы использования программы, поскольку его мышление отличается от мышления специалиста по тестированию. Последний задумывается обо всех возможных способах использования программы, в том числе, учитывая и возможные варианты её сломать, так как пользователь программы, если у него что-то не получается, может начать щелкать все по очереди, надеясь, что что-то заработает. Программист обычно думает, как правильно использовать программу, и может не предусматривать случаи, когда программа может сломаться. В результате, такой подход способен привести к пропуску критических ошибок, которые могут обнаружить конечные пользователи.
В-третьих, специалист по тестированию, используя различные техники, методы и виды тестирования проводит более тщательную проверку, ведь это его профессия, он совершенствует навыки годами.
Отсюда и вывод: специалисты по тестированию нужны везде, где есть программисты. Программисты разрабатывают, а специалисты по тестированию – тестируют.
В предыдущих главах мы упоминали программы, которые разрабатываются и тестируются. В жизни вы слышали термин «программное обеспечение». Кто работает в сфере информационных технологий, могли ещё слышать термин «информационная система». Многие считают, что программа, программное обеспечение и информационная система – это одно и то же. Давайте попробуем открыть завесу тайны и понять, что означают данные термины.
Начнём с «программы». Сначала приведём общепринятое понятие.
Программа – это набор инструкций, написанных на определённом языке программирования, которые компьютер может исполнять, для выполнения определённой задачи.
Простыми словами: программа представляет собой рецепт для компьютера. Когда мы готовим еду, нужен рецепт, чтобы знать, что и как делать. То же самое и с компьютером – ему необходима программа, чтобы выполнить определённую задачу. Рецепт содержит инструкции, как приготовить блюдо. Аналогично и программа содержит программные инструкции в коде. Но в отличие от рецепта, компьютерная программа исполняет инструкции автоматически или при определённом условии. Это значит, что, когда мы запускаем программу на компьютере, она самостоятельно выполняет определённые инструкции, прописанные в ней, или выполняет прописанные инструкции при определённом действии пользователя.
Рассмотрим пример простой программы, где есть две инструкции:
1) При нажатии на кнопку «Сложить» выполнить операцию сложения чисел и вывести результат сложения.
2) При нажатии на кнопку «Очистить» очистить все имеющиеся у программы поля.
Данная программа для сложения чисел будет сопровождать нас на протяжении всей книги, поэтому можете скачать её для ознакомления на сайте автора[4].
Переходим к термину «программное обеспечение».
Программное обеспечение (ПО) – совокупность программ, используемых для управления компьютером.
Исходя из определения можно сказать, что программное обеспечение – это набор программ, установленных на компьютере и предоставляющих возможности для выполнения различных задач. Данный набор включает все программы на компьютере или устройстве, необходимые для их работы.
Теперь мы понимаем, что программа и программное обеспечение – это два разных понятия. Программа – часть программного обеспечения, а программное обеспечение – совокупностью всех программ, установленных на компьютере.
Вы часто будете сталкиваться с ситуациями, когда под словами «программное обеспечение» люди подразумевают программу. Так повелось, и на это надо реагировать спокойно.
Теперь нам предстоит понять, что такое «информационная система».
Информационная система – это комплекс программ и устройств, которые работают вместе для сбора, обработки, хранения, предоставления и передачи информации с целью решения определённых задач.
Информационные системы могут состоять из программ, компьютеров, сети передачи информации, баз данных[5], устройств ввода-вывода[6] и так далее. Цель информационных систем – облегчение, повышение эффективности и производительности процессов. Они используются для решения широкого спектра задач.
Теперь рассмотрим все три понятия в связке на простом примере. Мы покупаем компьютер. На нём ничего не установлено, и это является оборудованием. Далее устанавливаем операционную систему, которая включает набор различных программ: калькулятор, редактор текста и т. д. Теперь у нас есть компьютер с программным обеспечением.
Мы разрабатываем программу, в которой можно заполнять налоговые отчёты. Она установлена на первом компьютере. На втором устанавливаем базу данных, в которой наша программа хранит все данные включая созданные отчёты. На третий устанавливаем программу, которая получает из базы данных информацию по отчётам и автоматически отправляет их в налоговые органы. Всё описанное является информационной системой, включающей три компьютера, без которых не будут функционировать программы; программы для создания отчётов, их отправки, база данных; программное обеспечение с операционными системами со всеми перечисленными программами; сеть, которой связаны компьютеры и по которой они обмениваются информацией.
Есть ли элемент меньше программы? Есть – программный компонент.
Программный компонент – это автономный наименьший элемент программы, который создан для выполнения конкретных функций или задач.
Можно сказать, что программные компоненты – кирпичики, из которых строятся программы. Как и в случае с настоящими кирпичиками, программисты могут использовать различные готовые компоненты в своих программах, чтобы не приходилось писать новый программный код с нуля.
Рассмотрим на примере. Представим, что нам необходимо создать программу для рисования. Вместо того, чтобы писать код для каждой функции программы (например, для создания линий, окружностей, прямоугольников), можно использовать готовые компоненты, созданные не нами, которые уже выполняют эти функции. Это бывает как стандартный набор графических компонентов, предоставляемый операционной системой, так и специализированные компоненты, которые мы можем загрузить из интернета.
Другой пример: создание онлайн-магазина. Вместо того, чтобы писать код для каждой функции, такой как добавление товаров в корзину, оформление заказа, обработка платежей и отправка уведомлений покупателям, мы можем использовать готовые компоненты, в которых уже реализованы данные функции.
В процессе чтения книги вы будете сталкиваться со всеми рассмотренными понятиями: программа, программное обеспечение, информационная система, компонент. Это сделано для того, чтобы вы привыкали к данным понятиям. Они будут использоваться, только если это уместно в определённом контексте.
В разделе, описывающем виды тестирования, мы столкнёмся с понятиями клиент-серверной архитектуры. В связи с этим разберём, что это такое. Также данная информация будет вам полезна для общего понимания работы ряда информационных систем.
Клиент-серверная архитектура – это принцип построения информационных систем и программ, которые работают через интернет или локальную сеть.
Это как разделение обязанностей между компьютерами. В данной системе есть два типа компьютеров: «клиент» – клиентская часть, «сервер» – серверная часть. Они являются двумя составными частями информационных систем и программ, работающих по сети. Давайте посмотрим на них на примере интернет-магазина.
Клиентская часть – то, что работает у пользователя на компьютере или телефоне. В нашем случае – сайт или программа интернет-магазина, его интерфейс, где отображается каталог товаров, корзина, личный кабинет.
Серверная часть – это программа или набор программ, установленных на удалённом компьютере или компьютерах организации. Там хранятся все данные о товарах, заказах, пользователях. Туда приходят ваши запросы из клиентской части при нажатии на кнопки, а обратно с сервера приходят данные в клиентскую часть для отображения.
Клиентская часть информационной системы – это то, что использует пользователь напрямую, а серверная работает на стороне организации, обеспечивая все основные функции. Таким образом, первая ориентирована на взаимодействие с пользователем, в то время как вторая заботится о более сложных задачах и обеспечивает функциональность, которую видит пользователь в клиентской части. Вместе они образуют работающую информационную систему.
Программа для сложения чисел, текстовый редактор не имеют клиент-серверной архитектуры и их можно назвать «автономными программами». Им не требуется для работы серверная часть. Интернет-магазины, мобильные программы различных магазинов, сетевые игры – информационные системы с клиент-серверной архитектурой. Для их работы нужна серверная часть.