Эталонный результат для каждого входа недоступен: какой подход позволит проверить корректность преобразования данных?
Следует применить метаморфное тестирование. Вместо сравнения каждого результата с заранее известным эталоном проверяют предсказуемое соотношение между результатами для исходного и изменённого входа.
Например, если к входным данным применено преобразование, не меняющее смысл, результат системы должен сохранить соответствующее свойство. Такой подход не доказывает абсолютную корректность, но выявляет нарушения отношений, которые должны выполняться для связанных наборов входов.
Обычные автотесты требуют оракула тестирования — способа определить правильный результат. Для расчётов, сложных преобразований, рекомендательных систем или обработки изображений полный эталон часто трудно получить: его подготовка дорога, а ручная проверка субъективна.
Метаморфное тестирование возникло как способ проверять такие системы через закономерности между несколькими запусками. Оно дополняет примеры с заранее известным результатом, а не обязательно заменяет их полностью.
Если тест содержит только входные данные без проверяемого ожидаемого свойства, он может подтвердить лишь факт выполнения операции. Проверка отсутствия ошибки или сравнение с самими собой не показывает, что преобразование корректно.
Неверно выбранный подход создаёт два риска. Слишком слабая проверка пропустит дефект, а попытка вручную подготовить эталоны для всех вариантов приведёт к малому покрытию, высокой стоимости поддержки и зависимости от ошибок эталонных данных.
Сначала формулируют метаморфное отношение: что должно произойти с результатом, если вход изменить известным образом. Затем тест выполняет систему на исходном входе, применяет допустимое преобразование к этому входу, повторяет запуск и проверяет отношение между двумя результатами.
Примеры отношений:
Главная ценность метода — проверка связи между запусками, а не угадывание каждого результата по отдельности. Исходные данные можно генерировать автоматически, но генерация сама по себе не заменяет метаморфное свойство.
Отношение должно быть достаточно строгим, чтобы обнаруживать дефекты, но соответствовать реальному контракту продукта. Слабое свойство даст много пропущенных ошибок, а чрезмерно строгое — ложные падения при допустимом поведении.
Метод имеет ограничения. Для каждой функции нужно найти достоверное метаморфное свойство; не всякая система обладает простыми отношениями. Кроме того, прохождение всех выбранных отношений не гарантирует правильность для каждого входа, поэтому тесты с известными эталонами, граничными случаями и проверками инвариантов остаются необходимыми.
Команда тестирует сервис обработки изображений. Полный набор эталонных изображений для разных форматов, размеров и параметров слишком велик, а ручная оценка результата не масштабируется.
Рассматривались следующие варианты:
Выбрали комбинацию золотых файлов для ключевых сценариев и метаморфных проверок для массового набора вариантов. Например, после изменения размера изображения проверяли согласованность заявленных размеров результата с параметрами операции, а перестановка независимых входных элементов не должна была менять итоговое множество.
В результате команда получила более широкий автоматический охват без подготовки эталона для каждого случая. При этом отдельные эталонные сценарии сохранили роль проверки абсолютного качества результата.
Инвариант проверяет свойство одного результата или состояния, которое не должно нарушаться. Метаморфное тестирование проверяет отношение между результатами нескольких запусков, связанных преобразованием входа. Инвариант может быть частью метаморфного отношения, но эти понятия не полностью взаимозаменяемы.
Нет. Случайная генерация отвечает на вопрос, какие входы подать системе, но не определяет, как оценить результат без эталона. Метаморфный тест дополнительно задаёт преобразование входа и ожидаемую связь между результатами. Поэтому случайные данные могут использоваться внутри метаморфного теста, но сами по себе им не являются.
Нужно выяснить, является ли это дефектом, ограничением контракта или особенностью численной точности. Если допустимы небольшие расхождения, проверка должна использовать согласованный критерий эквивалентности, например допустимую погрешность или нормализацию результата. Если поведение зависит от класса входа, метаморфное отношение следует уточнить условиями применимости, а не безусловно ослаблять проверку.