gadget59.ru лекции
Тестирование ПО · Лекция 1 · 28 слайдов

Введение в тестирование программного обеспечения: виды и методы

Введение в тестирование программного обеспечения

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

🔍 Тестирование 🐞 Ошибки 🛠 Отладка ⚫ Чёрный ящик ⚪ Белый ящик
Это первая лекция из цикла по тестированию. Мы разберём, зачем нужно тестирование, чем оно отличается от отладки, какие бывают виды тестирования и как не запутаться в терминах. Материал подходит и будущим программистам, и будущим юристам в сфере ИТ.
Формат: лекция + практика в конце. В следующих лекциях — более сложные темы: классы эквивалентности, покрытие кода, автоматизация тестов.

План лекции

Сегодня мы заложим фундамент. Вот что вы узнаете.

  • 1 Что такое тестирование и зачем оно нужно
  • 2 Чем тестирование отличается от отладки
  • 3 Кто такой тестировщик
  • 4 Что такое ошибка, дефект и сбой
  • 5 Виды тестирования: статическое и динамическое
  • 6 Тестирование «чёрным ящиком»
  • 7 Тестирование «белым ящиком»
  • 8 Уровни тестирования: модульное, интеграционное, системное, приёмочное
  • 9 Пирамида тестирования
  • 10 Типичные мифы о тестировании
  • 11 Итоги и практика
Если вы никогда не сталкивались с тестированием — не переживайте. Мы начнём с самых основ и будем двигаться маленькими шагами.

Что такое тестирование?

Тестирование программного обеспечения — это процесс проверки программы на соответствие требованиям и ожиданиям. Простыми словами: это способ убедиться, что программа делает то, что должна, и не делает того, чего не должна.

Официальное определение (IEEE 610.12): тестирование — это процесс анализа программного продукта для обнаружения различий между его реальным и ожидаемым поведением.

Представьте, что вы написали программу «Калькулятор». Она должна складывать, вычитать, умножать и делить. Тестирование — это когда вы сами (или другой человек) вводите разные числа и проверяете, что результат правильный.

🎯
Цель тестирования
Найти ошибки, пока их не нашли пользователи.
💰
Экономия
Чем раньше найдена ошибка, тем дешевле её исправить.

Почему тестирование важно?

Ошибки в программном обеспечении могут стоить очень дорого. Вот несколько реальных примеров.

  • 1996 год. Ракета Ariane 5 взорвалась через 37 секунд после запуска. Причина — ошибка в программном обеспечении, которая не была обнаружена при тестировании. Ущерб — около 370 миллионов долларов.
  • 2018–2019 годы. Boeing 737 MAX. Две катастрофы, 346 погибших. Причина — ошибка в программном обеспечении системы управления.
  • 2024 год. Крупный сбой в работе облачного провайдера привёл к остановке работы тысяч компаний по всему миру на несколько часов.
Это не абстрактные страшилки. Это реальные катастрофы, которых можно было избежать, если бы тестированию уделялось достаточно внимания.
Тестирование — это не «дополнительная работа». Это обязательная часть разработки любого серьёзного программного обеспечения.

Тестирование vs отладка

Эти два слова часто путают, но это разные вещи. Давайте разберёмся.

КритерийТестированиеОтладка Что делаетищет ошибкиисправляет ошибки Кто выполняеттестировщикпрограммист Результатотчёт об ошибкеисправленный код Цельнайти несоответствиеустранить причину
Тестирование
→
Найдена ошибка
→
Отладка
→
Исправлено
→
Тестирование
Тестирование и отладка — это цикл. Тестировщик находит ошибку, программист её исправляет, тестировщик проверяет снова. И так до тех пор, пока программа не станет работать правильно.

Кто такой тестировщик?

Тестировщик (по-английски QA-инженер, от Quality Assurance — «обеспечение качества») — это специалист, который проверяет программное обеспечение на наличие ошибок.

🔍
Ищет ошибки
Проверяет, что программа работает по требованиям.
📝
Описывает ошибки
Составляет отчёты, которые помогают программистам исправить проблему.
🤝
Работает в команде
Общается с разработчиками, аналитиками и менеджерами.
🧠
Думает как пользователь
Пытается сломать программу так, как это сделал бы реальный человек.
Тестировщик не исправляет ошибки. Его задача — найти и описать проблему. Исправляет программист.
Хороший тестировщик — это не тот, кто «просто нажимает кнопки». Это человек, который умеет думать о том, что может пойти не так, и проверять самые неожиданные сценарии.

Ошибка, дефект, сбой: в чём разница?

В тестировании есть три важных термина, которые часто путают. Давайте разберёмся.

ТерминЧто значитПример Ошибка (error)действие человека, которое привело к неправильному результатупрограммист перепутал знак «+» и «-» Дефект (defect)недостаток в коде или документациив коде написано a - b вместо a + b Сбой (failure)ситуация, когда программа работает неправильнокалькулятор выдаёт 1 вместо 3 при сложении 1 и 2
Цепочка простая: человек ошибается → в коде появляется дефект → при работе возникает сбой. Тестирование нужно для того, чтобы найти дефект до того, как он приведёт к сбою у пользователя.
В повседневной речи все три слова часто называют просто «багом» (от английского bug — «жук»). Но на профессиональном уровне важно различать эти понятия.

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

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

По доступу к коду
⚫ Чёрный ящик · ⚪ Белый ящик · ⚫⚪ Серый ящик
По запуску программы
📄 Статическое · ▶️ Динамическое
По уровню
🧩 Модульное · 🔗 Интеграционное · 🌐 Системное · ✅ Приёмочное
Мы разберём основные виды. Запомните главное: каждый вид тестирования решает свою задачу, и на практике их используют вместе.

Статическое и динамическое тестирование

Это деление по тому, запускаем ли мы программу во время тестирования.

📄
Статическое
Программа не запускается. Проверяются код, документация, требования. Пример: чтение кода коллегой, анализ документации.
▶️
Динамическое
Программа запускается. Проверяется, как она работает на реальных данных. Пример: ввод чисел в калькулятор и проверка результата.
Статическое — «проверка на бумаге».
Динамическое — «проверка в деле».
Статическое тестирование дешевле. Опечатку в коде можно заметить глазами и исправить за минуту. А если она попадёт в работающую программу — на поиск и исправление уйдут часы.

Тестирование «чёрным ящиком»

Тестирование «чёрным ящиком» (black box testing) — это когда тестировщик не знает, как устроена программа внутри. Он проверяет только то, что видно снаружи: входные данные и результат.

Аналогия. Представьте, что у вас есть запечатанная коробка. Вы не знаете, что внутри. Вы нажимаете кнопки, дёргаете рычаги — и смотрите, что происходит. Это и есть тестирование «чёрным ящиком».
// Пример: тестирование функции сложения // Мы не знаем, как она устроена, но проверяем: // 2 + 2 = 4 → правильно // 2 + 3 = 5 → правильно // -1 + 1 = 0 → правильно
Тестирование «чёрным ящиком» — самый распространённый подход. Именно так проверяют программы обычные пользователи.

Тестирование «белым ящиком»

Тестирование «белым ящиком» (white box testing) — это когда тестировщик знает, как устроена программа, видит её код и может проверить внутреннюю логику.

Аналогия. Теперь коробка прозрачная. Вы видите все шестерёнки, провода и рычаги. Вы можете проверить, что каждая деталь работает правильно.
// Пример: смотрим код функции сложения int add(int a, int b) { // Проверяем: что будет, если a = 2, b = 3? // Что будет, если a = -1, b = 1? // Что будет, если a = MAX_INT, b = 1? (переполнение) return a + b; }
Тестирование «белым ящиком» позволяет найти ошибки, которые не видны снаружи. Например, ошибку переполнения, когда программа работает «неправильно» только на очень больших числах.

Тестирование «серым ящиком»

Серый ящик — это что-то среднее между чёрным и белым. Тестировщик знает часть внутреннего устройства, но не всё.

ТипЧто видит тестировщикПример Чёрныйтолько вход и выходобычный пользователь Серыйчасть кода и структурытестировщик, который знает архитектуру Белыйвесь кодпрограммист, который пишет тесты
На практике тестировщики часто работают именно «серым ящиком»: они знают, как устроена система в целом, но не углубляются в каждую строчку кода.

Уровни тестирования

Тестирование можно проводить на разных «уровнях» — от самой маленькой части программы до всей системы целиком.

🧩 Модульное (unit)
🔗 Интеграционное
🌐 Системное
✅ Приёмочное
Каждый уровень отвечает на свой вопрос: «работает ли эта функция?», «работают ли функции вместе?», «работает ли вся система?», «доволен ли заказчик?».

Модульное тестирование

Модульное тестирование (unit testing) — это проверка отдельных маленьких частей программы: функций, методов, классов.

  • Проверяет одну функцию или метод.
  • Изолирует её от остальной программы.
  • Обычно пишется программистом, а не тестировщиком.
  • Запускается автоматически.
// Пример модульного теста для функции сложения void testAdd() { // Проверяем, что 2 + 2 = 4 if (add(2, 2) != 4) { System.out.println("Ошибка!"); } }
Модульные тесты — это «первая линия обороны». Они ловят ошибки в самом начале, когда исправить их дешевле всего.

Интеграционное тестирование

Интеграционное тестирование (integration testing) — это проверка того, как несколько модулей работают вместе.

Аналогия. Модули — это детали конструктора. Каждая деталь может быть идеальной. Но если их неправильно соединить — самолёт не полетит. Интеграционное тестирование проверяет, что детали соединяются правильно.
  • Проверяет взаимодействие между модулями.
  • Ищет ошибки в «стыках» — там, где один модуль передаёт данные другому.
  • Проводится после модульного тестирования.
Пример: функция сложения работает правильно, функция вывода на экран — тоже. Но если между ними неправильно передаётся число — пользователь увидит неправильный результат. Интеграционное тестирование найдёт эту ошибку.

Системное тестирование

Системное тестирование (system testing) — это проверка всей системы целиком, как единого целого.

  • Проверяет, что система выполняет все требования.
  • Имитирует работу реального пользователя.
  • Проводится после интеграционного тестирования.
  • Может включать тестирование производительности, безопасности, удобства использования.
// Пример: системное тестирование калькулятора // Проверяем всё вместе: // 1. Запуск программы // 2. Ввод выражения "2 + 2" // 3. Нажатие кнопки "=" // 4. Вывод результата "4"
Системное тестирование — это «финальная проверка» перед тем, как показать программу заказчику.

Приёмочное тестирование

Приёмочное тестирование (acceptance testing) — это последняя проверка перед сдачей программы заказчику или выпуском на рынок.

  • Проводится заказчиком или конечным пользователем.
  • Отвечает на вопрос: «Доволен ли заказчик?»
  • Проверяет, что программа решает бизнес-задачи, а не просто «работает».
УровеньВопросКто проводит МодульноеФункция работает?Программист ИнтеграционноеМодули работают вместе?Тестировщик СистемноеСистема работает целиком?Тестировщик ПриёмочноеЗаказчик доволен?Заказчик
Приёмочное тестирование — это «экзамен» для программы. Если заказчик принял работу — программа готова к использованию.

Пирамида тестирования

Все уровни тестирования можно представить в виде пирамиды. Чем ниже уровень — тем больше тестов и тем быстрее они выполняются.

✅ Приёмочное (мало тестов, медленно)
🌐 Системное
🔗 Интеграционное
🧩 Модульное (много тестов, быстро)
Идеальное соотношение: много модульных тестов, меньше интеграционных, ещё меньше системных и совсем мало приёмочных. Это называется «пирамидой тестирования».
Если перевернуть пирамиду — получится «рожок мороженого». Это плохо: много медленных и дорогих тестов, мало быстрых. Так делать не нужно.

Миф 1: «Тестирование доказывает, что программа работает»

Это один из самых распространённых мифов. На самом деле тестирование не доказывает, что программа работает правильно.

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

Почему? Потому что проверить все возможные варианты работы программы невозможно. Даже для простого калькулятора количество комбинаций чисел и операций — бесконечное.

Аналогия. Если вы проверили 100 яблок из корзины и все они оказались спелыми, это не значит, что 101-е тоже спелое. Вы просто не проверили его.
Цель тестирования — не «доказать, что всё хорошо», а найти как можно больше проблем, пока их не нашли пользователи.

Миф 2: «Тестирование можно сделать в конце»

Многие думают: «Сначала напишем программу, потом протестируем». Это неправильный подход.

Чем раньше начато тестирование, тем дешевле исправлять ошибки. Тестирование должно идти параллельно с разработкой.
Когда найдена ошибкаСтоимость исправления На этапе требований1× На этапе проектирования10× На этапе кодирования100× После выпуска1000×
Это не выдуманные цифры. Это реальная статистика из практики разработки программного обеспечения. Ошибка, найденная поздно, стоит в тысячи раз дороже.

Миф 3: «Тестировщик — это тот, кто не смог стать программистом»

Это обидный и неправильный миф. Тестирование — это отдельная профессия со своими навыками и знаниями.

🧠
Аналитическое мышление
Умение находить нестандартные сценарии.
📝
Документирование
Умение точно описывать ошибки.
💬
Коммуникация
Умение общаться с разработчиками.
⚙️
Технические знания
Понимание баз данных, сетей, API.
Хороший тестировщик часто знает о программе больше, чем программист, который её писал. Потому что он смотрит на неё с другой стороны.

Практическое задание

Давайте попробуем применить теорию на практике. Представьте, что вы тестируете простой калькулятор.

Задание 1

Придумайте 5 тестовых примеров для функции сложения двух чисел. Для каждого укажите входные данные и ожидаемый результат.

Задание 2

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

Задание 3

Объясните своими словами, чем отличается тестирование «чёрным ящиком» от тестирования «белым ящиком».

Решения разберём на практическом занятии. Не бойтесь ошибаться — в тестировании главное не найти «правильный» ответ, а научиться думать о том, что может пойти не так.

Шпаргалка

Сохраните этот слайд — здесь все основные понятия лекции.

ТерминЧто значит Тестированиепроверка соответствия программы требованиям Отладкаисправление найденных ошибок Тестировщикспециалист, который ищет ошибки Ошибка (error)действие человека, приведшее к неправильному результату Дефект (defect)недостаток в коде Сбой (failure)неправильная работа программы Чёрный ящиктестирование без знания кода Белый ящиктестирование с доступом к коду Статическоебез запуска программы Динамическоес запуском программы Модульноепроверка одной функции Интеграционноепроверка взаимодействия модулей Системноепроверка всей системы Приёмочноепроверка заказчиком

Итоги лекции

Подведём итоги. Вот что вы теперь знаете.

  • ✅ Тестирование — это проверка программы на соответствие требованиям.
  • ✅ Тестирование ≠ отладка. Тестировщик ищет, программист исправляет.
  • ✅ Ошибка → дефект → сбой — цепочка возникновения проблем.
  • ✅ Статическое тестирование — без запуска, динамическое — с запуском.
  • ✅ Чёрный ящик — без знания кода, белый ящик — с доступом к коду.
  • ✅ Уровни тестирования: модульное → интеграционное → системное → приёмочное.
  • ✅ Пирамида тестирования: много модульных, меньше интеграционных, ещё меньше системных, мало приёмочных.
  • ✅ Тестирование не доказывает отсутствие ошибок. Оно помогает их найти.
В следующей лекции мы разберём классы эквивалентности и граничные значения — это два главных метода тестирования «чёрным ящиком», без которых не обходится ни один тестировщик.

Домашнее задание

Задания для самостоятельной работы. Первые два обязательны, остальные — для оценки «отлично».

  1. Найдите в интернете один пример реальной катастрофы из-за ошибки в программном обеспечении. Опишите, что произошло и как можно было этого избежать.
  2. Напишите своими словами (5–7 предложений), чем тестирование отличается от отладки.
  3. Придумайте 5 тестовых примеров для функции «деление двух чисел».
  4. Объясните, почему тестирование «чёрным ящиком» не может найти ошибку переполнения.
  5. Нарисуйте пирамиду тестирования и подпишите каждый уровень.
Если задание кажется сложным — разбейте его на части. Например, «найти пример» → «прочитать» → «написать вывод».

Что дальше?

В этом блоке по тестированию у нас ещё несколько материалов.

  • Лекция 2: классы эквивалентности и граничные значения.
  • Лекция 3: тест-кейсы, чек-листы, баг-репорты.
  • Практика 1: тестирование калькулятора «чёрным ящиком».
  • Практика 2: модульное тестирование в Visual Studio (C#) или pytest (Python).
Тестирование — это навык, который пригодится и программистам, и юристам, и менеджерам. Умение находить ошибки — универсально.

Спасибо за внимание!

🔍

Тестирование — это не про «поиск виноватых»

Это про заботу о пользователе. Чем лучше протестирована программа, тем меньше проблем у того, кто ей пользуется.

🔍 Тестирование 🐞 Ошибки ⚫ Чёрный ящик ⚪ Белый ящик 🚀 практика