Меня зовут Ксения и я уже более 7 лет в IT. В данной статье хочу разобрать, что такое «классы эквивалентности» со стороны математического анализа — со стороны точной науки.

Начинала я с QA и прочитала достаточно много книг о тестировании. В университете у меня был предмет «математический анализ», на котором мы разобрали, что такое классы эквивалентности. В книгах по тестированию тоже были «классы эквивалентности», но ни одной формулы там не было. Подружить эти два понятия было достаточно сложно, но мы справились.

Зачем?

Во всех книгах по тестированию говорится о том, что самое важное в работе QA — это корректно применять техники тест дизайна, но далеко не во всех книгах говорится о том, как именно это делать. Идеальный список проверок — это список, в котором содержатся только те проверки, которых хватит для итогового вердикта по задаче. То есть проверок должно быть достаточно, но не избыточно. В этом нам должны помочь классы эквивалентности.

Классы эквивалентности в математическом анализе

Класс эквивалентности (Equivalence class) — это набор входных (или выходных) данных ПО, которые обрабатываются программой по одному алгоритму или приводят к одному результату. Это некое множество значений, которое вы можете подставлять в программу и получать один и тот же результат. Самые простые классы эквивалентности, на которые делятся проверки, это 2 основных класса: позитивные и негативные

Бинарное отношение R на множестве X называется отношением эквивалентности (англ. equivalence binary relation), если оно обладает следующими свойствами:

Свойства отношения эквивалентности
Свойства отношения эквивалентности

Например, Отношение равенства «=» является тривиальным примером отношения Рефлексивность: x = x — да
Симметричность: x = y и y = x — да
Транзитивность: если x = y, y = z, то x = z — да

Разберем отношение «жить в одном городе»

Рефлексивность: Иван живет в одном городе с самим собой, все верно — да
Симметричность: Иван живет в одном городе с Игорем, а Игорь живет в одном городе с Иваном — да
Транзитивность: Иван живет в одном городе с Игорем, Игорь живет в одном городе с Ольгой, из этого следуюет, что Иван живет в одном городе с Ольгой — да

Не является отношением эквивалентности отношение «быть знакомым» на множестве людей, так как оно не транзитивное

Классом эквивалентности эквивалентности Ma называется множество всех элементов M, находящихся в отношении R к элементу a, то есть множество, где любой элемент множества находится в отношении эквивалентности с другим.

Разбиением множества на классы эквивалентности

Совокупностью подмножеств Mi, где i∈ I (множеству индексов), множества M называется разбиением множества M на классы эквивалентности, если выполняются следующие условия:

Пока ничего не понятно, но очень интересно. Теперь вернемся в то, что нам говорят от классах эквивалентности книги о тестировании

В QA мы привыкли определять классы эквивалентности как

  1. Они тестируют одну и ту же вещь (функцию, модуль, часть системы).

  2. Если один из представителей класса эквивалентности ловит ошибку,
    то другой скорее всего тоже её поймает.

  3. Если один из представителей класса эквивалентности не ловит ошибку, то другой скорее всего тоже не поймает

Давайте на примере

Представим, что нам в тестирование пришла задача «Перевод рублей в евро». Давайте использовать все то, что мы уже читали выше, вспоминать, свойства и генерировать классы эквивалентности. Затем получившиеся классы эквивалентности проверять на свойства, чтобы понять, насколько хорошо или плохо, мы составили классы.

Свойства классов эквивалентности
Свойства классов эквивалентности

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

Отношение. При определении отношения нужно корректно определить его и проверить на то, является ли определенное нами отношение эквивалентным. Например, мы хотим выбрать «выдает ошибку». Или второй вариант» не выдает ошибку».

В голову приходит два класса эквивалентности: положительные и отрицательные числа на вход.

Бежим проверять наши два класса эквивалентности по свойствам:

  1. Есть только непустые множества — ДА

  2. Наши два класса не равны, так как, если мы возьмем положительное число — не будет ошибки, если возьмем отрицательное, будет ошибка — ДА

  3. Общих элементов нет — ДА

  4. НО Объединение положительных и отрицательных чисел не даст нам множество всех чисел, так как мы забыли 0.

Из этого следует, что мы некорректно разбили наше множество на классы эквивалентности.

Также можно придумать более сложные отношения эквивалентности. Например, «выдает в качестве ответа корректный результат».
Далее попытаемся понять, что для нас является корректным результатом — например, числа более 1, числа менее 1, ошибки при попытке ввести отрицательное число, ошибки при вводе букв.
Далее разбиваем на классы эквивалентности и проверяем каждый класс на свойства.

Что с этим делать?

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

  1. теперь мы умеем проверять отношение для разбиения на классы эквивалентности на то, что данное отношение действительно является отношением эквивалентности

  2. теперь мы умеем проверять наши классы эквивалентности на корректность по свойствам мат анализа

  3. теперь осталось только начать применять это в жизни

Попробуй использовать эти свойства и ты втянешься :)

Комментарии (3)


  1. mos1ch
    07.09.2024 15:04
    +1

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

    осталось только начать применять это в жизни

    что самое интересное)


  1. sera24
    07.09.2024 15:04

    То есть, разбив вводные данные на эквивалетности классы стоит проверить их по свойствам:
    - Класс не является пустым значением (пустое всегда смотрим отдельно, за скобками)
    - Класса не равны и действительно приводят к разным результам
    - В классах нет пересекающихся элементов
    - Объединение классов дает нам множество всех опций ввода
    Верно?


    1. KseniaMazalova Автор
      07.09.2024 15:04
      +1

      Привет! Да, все так