Перейти к содержанию

Как составить тесты по классам эквивалентности

К общим материалам · К лабораторным

Что такое класс эквивалентности

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

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

Как найти группы

  1. Выпишите все входные величины и условия из ТЗ.
  2. Для каждой величины выделите разрешённый диапазон и области за его границами.
  3. Проверьте связи между величинами: например, полезная мощность не выше подведённой.
  4. Добавьте ошибки чтения: не прочитано первое число, прочитана только часть данных.
  5. Для допустимых данных найдите случаи, важные для формулы: нулевой результат, ненулевой результат, деление без остатка и с потерей дробной части — где это применимо.
  6. Выберите конкретный ввод для каждой группы и заранее найдите ожидаемый результат.

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

Пример: площадь прямоугольника

ТЗ: прочитать a и b в метрах, вычислить s = a * b. Ограничения: 1 <= a <= 10, 1 <= b <= 10. Чтение не удалось — Input error; число вне диапазона — Data error. Для нормального результата используем printf("S = %.10lf m^2\n", s).

Группа Условие Ввод Ожидаемый вывод
1 Обе величины допустимы 2 3 S = 6.0000000000 m^2
2 a < 1, значение b допустимо 0 3 Data error
3 a > 10, значение b допустимо 11 3 Data error
4 b < 1, значение a допустимо 2 0 Data error
5 b > 10, значение a допустимо 2 11 Data error
6 Первое число прочитать невозможно abc 3 Input error
7 Первое число прочитано, второе — нет 2 abc Input error

При ошибке строка с площадью не должна появляться. Приглашение ко вводу в таблице опущено. Если в программе другие подписи величин, укажите в тестах именно их.

Для группы 1 добавьте дробный пример: 2.5 1.2, математический результат — 3 м². Это проверка внутри допустимой группы, полезная для обнаружения случайного применения int.

Как выглядит тест в исходном файле

/*
Тесты по классам эквивалентности

Группа 1. Допустимые размеры.
Условия: 1 <= a <= 10 и 1 <= b <= 10.
Пример ввода: 2 3
Ожидаемый вывод: S = 6.0000000000 m^2
Проверка вручную: s = 2 * 3 = 6 м².

Группа 2. Первая сторона меньше нижней границы.
Условия: a < 1, значение b допустимо.
Пример ввода: 0 3
Ожидаемый вывод: Data error. Площадь не вычисляется.

Группа 7. Второе число не прочитано.
Условия: первое число прочитано, на месте второго — текст.
Пример ввода: 2 abc
Ожидаемый вывод: Input error. Площадь не вычисляется.
*/

Это сокращённый пример записи: в своей работе опишите все найденные группы.

Как проверять границы

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

Проверка a при b = 3 Ввод Ожидается
Ниже нижней границы 0.999 3 Data error
Нижняя граница 1 3 S = 3.0000000000 m^2
Выше нижней границы 1.001 3 S = 3.0030000000 m^2
Ниже верхней границы 9.999 3 S = 29.9970000000 m^2
Верхняя граница 10 3 S = 30.0000000000 m^2
Выше верхней границы 10.001 3 Data error

Аналогично проверьте b. Для целочисленного ввода берите соседние целые: например, 0, 1, 2 у нижней границы 1. Для связанного условия pout <= pin проверьте pout < pin, pout = pin и pout > pin при фиксированном допустимом pin.

Граничные проверки могут принадлежать уже описанным группам. Не нужно каждый тест объявлять новым классом только потому, что в нём другие числа.

Что добавить для сравнения типов

При исследовании точности отдельно проверьте допустимые данные, для которых получается:

  • целое значение, одинаково представимое во всех трёх типах;
  • дробное значение: int теряет дробную часть;
  • дробь, которая не представляется точно в двоичной записи: float и double округляют её.

Последние два признака могут встречаться в одном тесте; это не обязательно разные непересекающиеся классы. Эксперименты с точностью не заменяют группы для проверки входных ограничений.