Prueba de depuración de Python-pytest

pytest

En ingeniería y aplicaciones prácticas, a menudo nos encontramos con lugares donde necesitamos realizar pruebas. Y pytest es una herramienta muy conveniente y fácil de usar para pequeñas pruebas.
Para obtener más información, consulte el documento oficial.

1. Instalación

Puede usar la pipinstalación directamente , ingrese el siguiente comando:

pip install -U pytest

Puede verificar el número de versión correspondiente a través del siguiente comando:

pytest --version

2 escribe una prueba

El uso de pytest consiste esencialmente en buscar el archivo correspondiente en el directorio y ejecutar y verificar si hay un error. El siguiente es un ejemplo simple:

# content of test_sample.py
def func(x):
    return x + 1
def test_answer():
    assert func(3) == 5 # 该测试会失败,func(3)应该为4

Después de escribir el programa, escriba la línea de comando en el directorio:

pytest ./test_sample.py

Luego detectará assertla autenticidad del contenido afirmado y mostrará la información correspondiente:

========================================== test session starts ========================================== 
platform win32 -- Python 3.7.7, pytest-6.0.1, py-1.9.0, pluggy-0.13.1
rootdir: C:\Users\dell\Desktop\TEST\py_tmp
collected 1 item

test_sample.py F                                                                                  [100%]

=============================================== FAILURES ================================================
______________________________________________ test_answer ______________________________________________

    def test_answer():
>       assert func(3) == 5 # 该测试会失败,func(3)应该为4
E       assert 4 == 5
E        +  where 4 = func(3)

test_sample.py:5: AssertionError
======================================== short test summary info ======================================== 
FAILED test_sample.py::test_answer - assert 4 == 5
=========================================== 1 failed in 0.04s =========================================== 

Donde [100%] significa que se han probado todos los casos de prueba. Una vez completada la prueba, pytest mostrará un informe de falla porque func (3) no devuelve 5 sino 4.

3. convenciones pytest

pytest probará el directorio actual como todos los formularios *_test.pyy test_*.pydocumentos.
En estos archivos, se ejecutan todos los testmétodos o funciones prefijados. Entre ellos, si el método de la clase necesita Testcomenzar con la clase y no hay ningún __init__()método.

4. Categorizar las pruebas

Puede usar clases para distinguir diferentes pruebas, por ejemplo:

# content of test_class.py
class TestClass:
    def test_one(self):
        x = "this"
        assert "h" in x

    def test_two(self):
        x = "hello"
        assert hasattr(x, "check")

En este punto, pytest probará dos pruebas en la clase Prueba. Puede utilizar los parámetros de comando -q( -quite) para indicar una salida simplificada. La prueba pasará una y no pasará una. Los resultados específicos son:

pytest -q test_class.py
.F                                                                   [100%]
================================= FAILURES =================================
____________________________ TestClass.test_two ____________________________

self = <test_class.TestClass object at 0xdeadbeef>

    def test_two(self):
        x = "hello"
>       assert hasattr(x, "check")
E       AssertionError: assert False
E        +  where False = hasattr('hello', 'check')

test_class.py:8: AssertionError
========================= short test summary info ==========================
FAILED test_class.py::TestClass::test_two - AssertionError: assert False
1 failed, 1 passed in 0.12s

Cuando hay varias clases de prueba en un archivo, de la siguiente manera:

# content of test_class2.py
class TestClassOne(object):
    def test_one(self):
        x = "this"
        assert 't'in x

    def test_two(self):
        x = "hello"
        assert hasattr(x, 'check')


class TestClassTwo(object):
    def test_one(self):
        x = "iphone"
        assert 'p'in x

    def test_two(self):
        x = "apple"
        assert hasattr(x, 'check')

Puede usar comandos para especificar pruebas dentro de una determinada clase:
solo TestClassOnedos pruebas en ejecución pueden usar comandos:

pytest test_class2.py::TestClassOne

Solo la TestClassOneprueba en ejecución test_onepuede usar el comando:

pytest test_class2.py::TestClassOne::testone

5. Mostrar información de impresión

Al realizar la prueba, se pueden agregar printdeclaraciones al código para generar cierta información. Puede utilizar parámetros -spara pytestgenerar esta información en tiempo de ejecución :

pytest test_se.py -s

6. Prueba de ejecución multiproceso

Cuando el número de pruebas es grande, el tiempo de ejecución será mayor. En este momento, se pueden utilizar varios procesos para realizar pruebas. Necesita descargar e instalar primero pytest-xdist:

pip install -U pytest-xdist

Cuando use pytest, simplemente especifique los parámetros -n num, que numes el número de procesos:

pytest test_*.py -n num

7. Vuelva a intentar ejecutar la prueba

A veces, la prueba puede fallar debido a otras razones y debe volver a intentar ejecutar una prueba varias veces. Necesita descargar e instalar pytest-rerunfailures:

pip install -U pytest-rerunfailures

Cuando use pytest, especifique los parámetros --reruns num, que numes el número de reintentos:

pytest test_*.py -reruns num 

8. Afirmación

8.1 Afirmación

assertPara determinar una expresión, la condición de expresión se Falseactiva cuando es anormal. El formato de sintaxis es:

assert Expression

Equivalente a

if not expression:
    raise AssertionError

assertTambién puede seguir los parámetros para iniciar el tipo de error correspondiente. También se pytestmostrará correspondientemente en el mensaje de error en uso .

assert expression [, arguments]

8.2 Las afirmaciones son casi iguales

Cuando se usan aserciones, los números de punto flotante no pueden usar aserciones directamente para hacer juicios, y el resultado generalmente será un fracaso. La razón es que el truncamiento de números de punto flotante da como resultado una ligera desviación del valor real.
Varios métodos de escritura comunes son:

assert x - esp <= y <= x + esp		# esp = 1e-6
assert abs(x-y) < esp				# esp = 1e-6

Pero para matrices, tuplas, diccionarios, etc., los datos deben extraerse para compararlos. De hecho, podemos utilizar pytest.approxpara afirmar que son casi iguales. Un ejemplo es el siguiente:

assert 2.2 == pytest.approx(2.3)		
# 失败,默认允许2.3e-6的误差
assert 2.2 == pytest.approx(2.3, 0.1)	
# 成功,指定误差是0.1
assert [0.1 + 0.2, 0.2 + 0.4] == pytest.approx([0.3, 0.6])
# 成功,适用于断言一维数组
assert {
    
    'a': 0.1+0.2} == pytest.approx({
    
    'a': 0.3})
# 成功,适用于断言字典
assert [[0.1 + 0.2], [0.2 + 0.4]] == pytest.approx([[0.3], [0.6]])
# 失败,目前pytest不支持多维数组等类型

De hecho, también podemos usarlo numpy.testingpara ayudar en la comparación. Para obtener más información, consulte su documentación .

Supongo que te gusta

Origin blog.csdn.net/weixin_43762938/article/details/108094778
Recomendado
Clasificación