Единица 6 / 12

Автоматизация тестирования и обеспечение качества

Прибыль:

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

Тестирование — это механизм, который доказывает, что программное обеспечение действительно ведет себя так, как обещано. Хороший набор тестов за считанные секунды сообщит вам, нарушает ли что-либо изменение, и дает инженеру свободу действовать с уверенностью. ИИ ускоряет самую утомительную и наиболее пропускаемую часть написания тестов: создание множества сценариев, точек останова и негативных случаев. Но здесь есть хитрая ловушка: ИИ может писать тесты, которые проверяют текущее (возможно, ошибочное) поведение кода, а не его предполагаемое поведение; или он может создавать пустые тесты, которые всегда проходят успешно, фактически ничего не проверяя. Ценность теста не в том, пройден ли он, а в том, проверяется ли он на правильность и загорается красным, если он неправильный.

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

Понятия: Модульное тестирование: тестирует одну функцию/класс изолированно. Интеграционное тестирование: проверяет правильность совместной работы нескольких частей. Assert: оператор, проверяющий, что результат равен ожидаемому; Это суть теста. Охват: какая часть кода выполняется тестами; Большой охват не гарантирует качество.

Создание содержательных тестов

Хороший тест четко выполняет три задачи: устанавливает состояние, выполняет действие и утверждает результат. При печати тестов для ИИ укажите, какое поведение вы хотите проверить и какие сценарии оно должно охватывать; В противном случае он проводит поверхностные тесты, которые всегда проходят успешно.

  1. Определите поведение, которое будет тестироваться. «Что считать правильным?» Ответьте на вопрос четко.
  2. Спросите типы сценариев. Нормальное, предельное, отрицательное, ошибочное состояние.
  3. Импортируйте значимое утверждение. Он не просто «выдал ошибку», он «возвратил правильное значение».
  4. Проверьте точность теста. Становится ли тест красным, если вы сознательно нарушаете код?

Подсказка для создания комплексного теста: «Напишите модульные тесты для следующей функции applydiscount(сумма, купон). Имейте ПО МИНИМУМ один сценарий в следующих категориях: (1) нормальный действительный купон, (2) точки останова (сумма 0, скидка 100%), (3) отрицательный (недействительный купон, отрицательная сумма), (4) случай ошибки (нулевой купон). Утверждайте КОНКРЕТНОЕ ожидаемое значение в каждом тесте (а не просто «сработало»). Назовите тесты читабельными. Код: [код]"

Подсказка для извлечения граничных значений: «Выполните анализ граничных значений для входных данных этой функции. Для каждого параметра извлеките значения «прямо на границе», «чуть ниже границы», «чуть выше границы» в виде таблицы. Затем перечислите тестовые сценарии, охватывающие эти границы. Пока не пишите код, просто анализ и список сценариев. Функция: [подпись]»

Внимание: высокое покрытие тестами (например, 90%) не доказывает правильность кода. Покрытие измеряет количество выполненных строк; не то чтобы эти строки давали правильный результат. Тест без значимого утверждения увеличивает покрытие, но ничего не гарантирует. Содержание утверждения определяет качество, а не количество утверждений.

Тестирование самого теста: логика мутации

Самый практичный способ понять, действительно ли работает тест, созданный ИИ, — это намеренно взломать код (логика мутационного тестирования). Отмените условие, поставьте знак + -; Если ни один из тестов не стал красным, ваши тесты на самом деле не поддерживают такое поведение.

Подсказка для поиска уязвимостей при тестировании: «Скажите мне, какие потенциальные ошибки в этом коде НЕ МОГУТ обнаружить следующие тесты. Предложите 5 небольших изменений, которые можно внести в код (например, >= вместо >, - вместо +) и укажите для каждой, смогут ли существующие тесты их отловить. Для тех, кто не обнаружен, предложите тестирование, которое следует добавить. Код: [код] Тесты: [тест]»

Слабая подсказка/Сильная подсказка

СЛАБОЕ: «Напишите тест для этой функции». (Результат: обычно один удачный сценарий, слабая проверка; пропускает ошибки.) СИЛЬНЫЙ: «Напишите тест для этой функции 'passwordStrong'. Правило: требуется не менее 8 символов, 1 заглавная буква, 1 цифра. Охватите следующие сценарии как ОТДЕЛЬНЫЕ тесты: ровно 8 символов (предел), 7 символов (ниже предела), без заглавных букв, без цифр, пустая строка, только пробелы, слишком длинные (1000 символов). Явно утверждайте ожидаемое значение true/false в каждом тесте и назовите тест в соответствии с тем, что он проверяет».

Мощная подсказка дает правила и полные сценарии. Пары границ, такие как «ровно 8/7 символов», являются наиболее распространенными местами ошибок (путают > с >=). Слабое приглашение обходит эти границы и переносит ошибку в производство.

Типы тестов и где их использовать

Тип теста

Что это подтверждает?

Вклад ИИ

Внимание

единица

Одна функция/класс

Быстро генерирует несколько сценариев

Требуется значимое утверждение

интеграция

Части работают вместе

Проект сценария и макета данных

Настоящее аддиктивное поведение

завершить/принять

Весь пользовательский поток

Список шагов и ожидания

склонен к хрупкости

регресс

Старая ошибка не возвращается

Тестирование конкретных неисправностей

Должен быть добавлен к каждому исправлению

Мини-кейсы

Случай 1. Тест, который всегда проходит. ИИ записывает в функцию 12 тестов, и все они проходят. Инженер становится подозрительным и намеренно искажает возвращаемое значение функции; Только 3 теста становятся красными. Остальные 9 тестов не содержат значимых утверждений. Тестирование усиливается за счет охоты за мутациями; реальная защита достигается в 9 сценариях.

Случай 2 — Ошибка границы. Функция проверки возраста должна сообщать: «18 лет и старше допустимо», но написано >18, что означает, что возраст 18 лет отклоняется. Ошибка сразу же проявляется при тестировании, поскольку ИИ генерирует сценарий «ровно 18» посредством анализа точек останова. Единая проверка пределов предотвращает любые жалобы реальных пользователей.

Случай 3 — Исправление текущего поведения. Когда ИИ говорят «написать тест на основе этого кода», он создает тест, который принимает как «правильную» ошибку округления, уже существующую в коде. Когда инженер печатает тест в соответствии с требованием (ожидаемое правильное значение), а не кодом, тест становится красным и возникает реальная ошибка. Тесты должны основываться на ожиданиях, а не на основе кода.

Распространенные ошибки

  • Бессмысленное утверждение. «Не выдало ошибку» недостаточно; Правильное значение необходимо проверить.
  • Путаница объема с качеством. Высокий охват не является гарантией точных результатов.
  • Печать теста по коду. Исправляет текущую ошибку на «истину»; Тесты должны основываться на ожиданиях.
  • Пропуск предельных значений. Путать > с >= — самая распространенная ошибка; граничные пары должны быть проверены.
  • Не проверяя сам тест. Тест, который не становится красным при взломе кода, не обеспечивает защиту.

В заключение

Хороший набор тестов — ключ к уверенному внесению изменений. ИИ быстро генерирует множество сценариев, границ и негативных ситуаций; Но если он извлекает тесты из кода, а не из требований, он может исправить существующие ошибки или написать бессмысленные тесты, которые всегда проходят успешно. Укажите конкретное ожидаемое значение в каждом тесте, включите связанные пары и убедитесь, что ваши тесты действительно защищают, намеренно нарушая код. Качество утверждения, а не количество областей, определяет качество.

Задача приложения

Выберите функцию и создайте тесты в четырех категориях (нормальные, предельные, отрицательные, ошибки) с подробной подсказкой создания тестов; В каждом тесте должно быть указано конкретное ожидаемое значение. Затем запустите тестовую подсказку поиска уязвимостей, предложите 5 небольших мутаций в коде и запустите тесты, чтобы проверить, какие из них они обнаруживают. Добавьте новый тест хотя бы для одной мутации, которая не была обнаружена, и покажите, что она теперь в минусе.

контрольный список

  • [ ] Я распечатал тесты на основе ожидаемого/правильного поведения, а не кода.
  • [ ] Я рассмотрел нормальный, предельный, негативный и ошибочный сценарии.
  • [ ] Я утверждал конкретное ожидаемое значение в каждом тесте.
  • [ ] Я тестировал пары границ (чуть выше-ниже/чуть выше-ниже).
  • [ ] Сознательно взломав код, я подтвердил, что тесты стали красными.
  • [ ] Я добавил новый тест на необнаруженные мутации.