Знаете, что такое волшебная библиотека Quick?

Пакет quick реализует служебные функции, помогающие в тестировании черного ящика.

Быстрая библиотека из пакета тестирования может использоваться для тестирования на основе свойств. Если вы знакомы с QuickCheck от Haskell, то они очень похожи.

Давайте сопоставим, что означают некоторые из этих терминов…

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

Тестирование методом «черного ящика» включает в себя тестирование компонента или системы без каких-либо предварительных знаний о ее внутренней работе.

Соединяя все эти части воедино, мы получаем, что если мы знаем, каковы свойства функций, мы можем протестировать их методом черного ящика, используя эту волшебную библиотеку!

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

вычитание

Давайте воспользуемся приведенным выше примером и придумаем несколько примеров его свойств:

  1. если a > b, результат будет положительным
  2. если b > a, результат будет отрицательным
  3. если a == b, результат будет ноль
  4. если b < 0, результат будет больше, чем a
  5. И список продолжается…

Я думаю, что номер 4 самый интересный пример! Давайте использовать это!

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

Теперь у нас есть простой пример тестирования на основе примеров, который проверяет номер свойства 4.

Однако действительно ли этого достаточно? Теперь давайте попробуем использовать тестирование на основе свойств на том же свойстве! 🔍

Это кажется разумным. Нас интересуют только тестовые случаи, где b меньше 0. Поэтому мы игнорируем все тестовые случаи, где b положительный.

Все, наше время пришло! Давайте запустим это!

--- FAIL: TestSubtractPropertyFour (0.00s)
    sub_test.go:19: #1: failed on input 9071749008449132817, -404711346371707334

Позвольте мне сделать это вручную…

Если a равно 9071749008449132817, а b равно -404711346371707334, это означает, что с математической точки зрения это 9071749008449132817 — (-404711346371707334), что означает, что 9071749008449132817 + 404711346371707334 должно быть выражением. Это явно означает, что наш номер свойства 4 верен.

Хорошо… Значит, что-то не так, пора найти эту проблему!

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

Это результат компилятора Go…

cannot use 9071749008449132817 - (-8970283718888711465) (untyped int constant 18042032727337844282) as int value in constant declaration (overflows)

🌊🌊🌊🌊🌊🌊 А… Так перелилось! 🌊🌊🌊🌊🌊🌊

Ну вот! Мы нашли тестовый пример, который взорвет нашу невинно выглядящую функцию вычитания.

Заключение

Мы были свидетелями того, насколько невероятным является тестирование на основе свойств. Вместо использования тестирования на основе примеров мы можем легко сгенерировать десятки тысяч рандомизированных тестовых случаев с помощью этой библиотеки. Конечно, не всегда просто найти свойство для каждой функции, которую вы пишете.

Даже если вы не сможете применить это сейчас, я уверен, что когда-нибудь это вам пригодится!