Настройването на тестов пакет за вашия код може да се почувства като препятствие, за което не сте готови, но тази библиотека поема голяма част от напрежението.
Тестването е съществена част от разработката на софтуер. Помага за ранно откриване на грешки и намалява вероятността от грешки надолу по линията.
Pytest е една от най-популярните рамки за тестване на Python. Позволява ви да пишете малки и четливи тестове, които могат да се мащабират с разрастването на вашето приложение. Научете как да настроите и използвате Pytest с вашия Python код.
Настройване на Pytest
Преди да инсталирате Pytest, най-добре е да създайте виртуална среда за да изолирате вашата тестова среда, така че да избегнете конфликти с други пакети и зависимости.
За да създадете виртуална среда, изпълнете следната команда, преди да инсталирате Pytest.
python -m venv тестове
Това ще създаде нова виртуална среда, наречена tests в текущата ви директория. За да активирате средата, изпълнете тази команда, ако сте на Linux или Mac:
източник тестове/bin/активиране
За Windows изпълнете тази команда:
тестове\\Скриптове\\активиране
За да инсталирате Pytest, можете да използвате pip, мениджъра на пакети на Python, с тази команда във вашия терминал:
pip инсталирайте pytest
Ако нямате Pip, не се притеснявайте; можеш инсталирайте Pip на Windows, Mac и Linux.
Изпълнете следната команда, за да проверите дали сте инсталирали Pytest правилно.
pytest --версия
Това трябва да върне номера на инсталираната версия.
Създаване на вашия първи тест
Помислете за следната функция, която събира две числа и връща резултата.
дефдобавяне на числа(а, б):
връщане a + b
Няколко неща могат да се объркат с тази функция. Например, помислете какво се случва, ако извикате функцията с нечислови стойности като None или стойност от тип string. Това са някои от потенциалните крайни случаи, които могат да причинят неуспех на функцията.
Един от първите тестове, които пишете, трябва да провери дали функцията връща очаквания резултат. За да направите това, можете да използвате ключовата дума assert, за да сравните действителния изход на функцията с очаквания изход. В случай на функцията add_numbers, тестовата функция може да изглежда така:
дефтест_добавяне на числа():
твърдят add_numbers(2, 3) == 5
твърдят add_numbers(-1, 1) == 0
твърдят add_numbers(0, 0) == 0
Тази тестова функция включва три оператора assert, всеки от които сравнява изхода на функцията add_numbers с очаквана стойност. Първият тест проверява дали добавянето на 2 и 3 връща 5, вторият тест проверява дали добавянето на -1 и 1 връща 0, а третият тест проверява дали добавянето на 0 и 0 връща 0.
Как да стартирате тестове с Pytest
След като сте написали вашите тестове, следващата стъпка е да ги изпълните. За да направите това с Pytest, отидете до директорията, съдържаща вашия тестов файл, и изпълнете командата pytest:
pytest
Ако всичко работи според очакванията, ще видите съобщение, което показва, че всички тестове са преминали успешно. Въпреки това, ако някое от твърденията е неуспешно, Pytest ще докладва грешка и ще ви покаже входните стойности, които са причинили неуспеха.
Да приемем например, че сте изпълнили следната тестова функция за функцията add_numbers:
дефтест_добавяне на числа():
твърдят add_numbers(2, 3) == 6
твърдят add_numbers(-1, 1) == 0
твърдят add_numbers(0, 0) == 0
Първото твърдение ще се провали, защото очакваната стойност е 6, но действителната стойност е 5 (сумата от 2 и 3). Pytest ще върне следното съобщение:
Това съобщение ви показва входните стойности, които са причинили стойността, и също така ви казва каква трябва да бъде действителната стойност. Това улеснява бързото идентифициране и коригиране на грешки във вашия код.
Използване на Pytest.raises за потвърждаване на изключения
Сега нека напишем тест, който да покрие един от крайните случаи на функцията add_numbers. Когато подадете нечислов аргумент като None към функцията, Python трябва да предизвика изключение TypeError.
Вече трябва да сте обработка на изключения във вашите програми на Pythonи можете да тествате дали вашият код също ги повдига правилно.
За да направите това, копирайте следната тестова функция във вашия файл. Той използва контекстния мениджър pytest.raises, за да провери дали извикването на функцията add_number с „Няма“ предизвиква изключение TypeError.
импортиране pytest
дефtest_add_numbers_with_invalid_inputs():
с pytest.raises (TypeError):
add_numbers(Нито един, 2)
След това стартирайте Pytest от командния ред. Ако изключението не бъде повдигнато, тестът ще бъде неуспешен.
Можете да отидете по-далеч и да проверите подробностите за съобщението за изключение. Контекстният мениджър създава обект ExceptionInfo с подробностите.
Например в тази тестова функция заявете съобщението за изключение по следния начин:
дефtest_add_numbers_with_invalid_inputs():
с pytest.raises(TypeError) като exc_info:
add_numbers(Нито един, 2)
твърдят exc_info.value.args [0] == "неподдържан(ни) тип(ове) операнд(и) за +: 'NoneType' и 'int'"
Ако съобщението не съвпада с това в теста, Pytest ще посочи грешка.
Как да използвате параметризирано тестване за тестване на множество входове наведнъж
Вместо ръчно извикване на функция с множество входове като това:
дефтест_добавяне на числа():
твърдят add_numbers(2, 3) == 6
твърдят add_numbers(-1, 1) == 0
твърдят add_numbers(0, 0) == 0
Pytest предоставя функция за параметризирано тестване, която ви позволява да правите същото по-лесно. Ето как можете да пренапишете тестовата функция по-горе:
импортиране pytest
@pytest.mark.parametrize("a, b, очаквано", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
дефтест_добавяне на числа(a, b, очаквано):
твърдятдобавяне на числа(а, б)== очаквано
Как да стартирате множество тестове
Досега сте написали само два теста за функцията add_numbers. За по-сложни функции с повече тестове може да искате да ги групирате в клас.
Например, ето как бихте създали тестов клас за функцията add.
класTestAddFunction:
@pytest.mark.parametrize("a, b, очаквано", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
дефтестово_събиране_с_числа(сам, a, b, очаквано):
твърдят add_numbers (a, b) == се очаква
дефtest_add_numbers_with_invalid_inputs(себе си):
с pytest.raises (TypeError) като exc_info:
add_numbers(Нито един, 2)
твърдят exc_info.value.args [0] == "неподдържан(ни) тип(ове) операнд(и) за +: 'NoneType' и 'int'"
Обърнете внимание, че трябва да поставите пред името на класа „Test“, така че Pytest да може да го идентифицира като тестов клас и да го изпълни.
Pytest има много повече функции
Използвайки Pytest, можете автоматично да потвърдите, че вашият код работи както очаквате. Pytest предлага много други функции като приспособления, които ви позволяват да настройвате и премахвате тестови данни и марки за настройка на метаданни на вашите тестови функции.
Освен това можете да интегрирате Pytest във вашия CI тръбопровод и да започнете да изпълнявате тестове автоматично и непрекъснато, когато промените кода си.