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 pip
instalació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á assert
la 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.py
y test_*.py
documentos.
En estos archivos, se ejecutan todos los test
métodos o funciones prefijados. Entre ellos, si el método de la clase necesita Test
comenzar 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 TestClassOne
dos pruebas en ejecución pueden usar comandos:
pytest test_class2.py::TestClassOne
Solo la TestClassOne
prueba en ejecución test_one
puede usar el comando:
pytest test_class2.py::TestClassOne::testone
5. Mostrar información de impresión
Al realizar la prueba, se pueden agregar print
declaraciones al código para generar cierta información. Puede utilizar parámetros -s
para pytest
generar 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 num
es 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 num
es el número de reintentos:
pytest test_*.py -reruns num
8. Afirmación
8.1 Afirmación
assert
Para determinar una expresión, la condición de expresión se False
activa cuando es anormal. El formato de sintaxis es:
assert Expression
Equivalente a
if not expression:
raise AssertionError
assert
También puede seguir los parámetros para iniciar el tipo de error correspondiente. También se pytest
mostrará 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.approx
para 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.testing
para ayudar en la comparación. Para obtener más información, consulte su documentación .