Контролен списък за писане на тестове с PyTest, Бележки на програмиста

Ръководство за писане на тестове с PyTest

Да кажем, че се разработва проект. Проектът трябва да напише интеграционни и системни тестове, както и евентуално тестове за натоварване и някои други. Python е идеален за тази задача. В което скоро ще се убедим, като се запознаем с рамката на PyTest и някои плъгини за нея.

За да имаме какво да тестваме, нека създадем прост модул fibgen, чиято пълна реализация е дадена по-долу:

def fibgen ( num ) : """ Генерира числа на Фибоначи

:param num: колко числа да се генерират :return: генератор на първите числа на Фибоначи

>>> list(fibgen(10)) [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] """ ако типът ( num ) не е int : повишаване на TypeError ( "типът на аргумента num трябва да бъде int" ) ако num с pytest. повдига , както в test_type_error.

Внимателните читатели може да заподозрат тест, базиран на свойства в кода:

Добра идея е винаги да използвате подробен режим, за да видите кои тестове са изпълнени, да видите изцяло кои твърдения и защо са се провалили и т.н.:

Флагът -l позволява показването на променливи стойности, когато тестът е неуспешен:

Изпълнение на конкретен тестов пакет, кратка версия:

Изпълнение на тестове от конкретен файл:

От конкретен клас:

Изпълнение на конкретен метод:

Можете да посочите няколко теста:

Примери за тестване на код от документация (doctest):

Определяне на покритието на модула fibgen с тестове, показване на броя на непокритите линии в терминала и генериране на отчет за покритие в HTML:

Между другото, оказва се, че PyCharm Community Edition не поддържа кодово покритие, тази функционалност е достъпна само в Professional Edition.

° Сгенериране на junit.xml:

С генериране на HTML:

За съжаление горната команда генерира един голям HTML файл за всички тестови пакети. Можете да разрешите този проблем с командата:

Но, уви, в този случай ще загубим кодове за връщане, което не работи добре със системи за непрекъсната интеграция като Jenkins.

Така че в крайна сметка написах нещо подобно:

import os import re import подпроцес

html_prefix="./html/" idx_html="

за root, dirs, файлове в os. ходене ( "тестове") : за fname във файлове: ако е . търсенето (" \\ .py$", fname) не е None: sname = os. път. join ( root , fname ) html = html_prefix + sname + ".html" cmd = "PYTHONPATH=.py.test --doctest-modules -v -l " + \ sname + " --html=" + html code = subprocess . повикване (cmd, shell = True) статус = "

" ако код != 0 : статус = "

с отворен ( html_prefix + "index.html", "w") като f: f. напиши (idx_html)

И накрая, както обикновено, няколко връзки по темата:

Използвате ли PyTest и какво всъщност тествате с него?

Допълнение: Пример за използване на PyTest за тестване на C/C++ проекти може да бъде намерен в публикацията на CMake.