Знаете ли какво представлява магическата бърза библиотека?

Пакетът 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)

🌊🌊🌊🌊🌊🌊 А… Значи преля! 🌊🌊🌊🌊🌊🌊

Ето! Намерихме тестов случай, който ще взриви нашата невинно изглеждаща функция за изваждане.

Заключение

Свидетели сме колко невероятно е тестването, базирано на имоти. Вместо да използваме базирано на примери тестване, можем лесно да генерираме десетки хиляди случайни тестови случаи лесно с тази библиотека. Разбира се, не винаги е проста задача да намерите свойството за всяка функция, която пишете.

Въпреки че може да не можете да приложите това сега, сигурен съм, че ще ви бъде полезно някой ден!