Prueba de Python con pytest. Complementos CAPÍTULO 5

Atrás Siguiente


Un potente Pytest desde el primer momento, se pone aún mejor cuando le agregas una mezcla de complementos. La base de código pytest está estructurada por configuraciones y extensiones, y hay ganchos disponibles para modificaciones y mejoras a través de complementos.



Los ejemplos en este libro están escritos usando Python 3.6 y pytest 3.2. pytest 3.2 es compatible con Python 2.6, 2.7 y Python 3.3+.


El código fuente para el proyecto Tareas, así como para todas las pruebas que se muestran en este libro, está disponible en el enlace en la página web del libro en pragprog.com . No necesita descargar el código fuente para comprender el código de prueba; El código de prueba se presenta de forma conveniente en los ejemplos. Pero para seguir las tareas del proyecto o adaptar ejemplos de prueba para probar su propio proyecto (¡sus manos están desatadas!), Debe ir a la página web del libro y descargar el trabajo. Allí, en la página web del libro, hay un enlace para mensajes de erratas y un foro de discusión .

Debajo del spoiler hay una lista de artículos en esta serie.



¡Vamos más allá!


Es posible que se sorprenda al saber que ya ha escrito algunos complementos si trabajó en los capítulos anteriores de este libro. Cada vez que coloca accesorios y / o funciones de conftest.py archivo conftest.py nivel conftest.py del proyecto, crea un complemento de conftest local. Es solo un pequeño trabajo adicional convertir estos archivos conftest.py en complementos instalables que puede compartir entre proyectos, con otras personas o con el mundo.


Comenzamos este capítulo respondiendo a la pregunta de dónde buscar complementos de terceros. Hay bastantes complementos disponibles, por lo que hay una buena posibilidad de que alguien ya haya escrito los cambios que desea realizar en pytest . Dado que consideraremos los complementos de código abierto, si el complemento hace casi lo que desea hacer, pero no del todo, puede desarrollarlo o utilizarlo como referencia para crear su propio complemento. Aunque este capítulo trata sobre la creación de sus propios complementos, se incluye el Apéndice 3, el complemento Sampler Pack , en la página 163 para darle una idea de lo que es posible.


En este capítulo aprenderá cómo crear complementos y le mostraré la dirección correcta para realizar pruebas, empaques y distribución. El tema completo de empaquetado y distribución de Python es demasiado extenso y pretende ser su propio libro, por lo que no cubriremos todo. Pero obtendrá suficiente información para poder intercambiar complementos con su equipo. También hablaré sobre algunas formas simples de crear complementos con soporte para PyPI y la menor cantidad de trabajo.


Buscar complementos


Puede encontrar complementos de pytest de terceros en varios lugares. Los complementos enumerados en el Apéndice 3, Paquete de muestra de complementos, en la página 163, están disponibles para su descarga desde PyPI. Sin embargo, este no es el único lugar para encontrar excelentes complementos de pytest.


https://docs.pytest.org/en/latest/plugins.html


El sitio principal de documentación de pytest tiene una página que habla sobre la instalación y el uso de complementos de pytest y enumera algunos complementos comunes.


https://pypi.python.org


El Python Package Index (PyPI) es un excelente lugar para obtener muchos paquetes de Python, pero también es un excelente lugar para buscar complementos de pytest. Al buscar complementos de pytest, simplemente ingrese "pytest", "pytest -" o "-pytest" en el campo de búsqueda, ya que la mayoría de los complementos de pytest comienzan con "pytest -" o terminan con "-pytest".


https://github.com/pytest-dev


El grupo pytest-dev en GitHub es donde se almacena el código fuente de pytest. Además, aquí puede encontrar complementos populares de pytest que el equipo del núcleo de pytest debería admitir a largo plazo.


Instalación de complementos


Los complementos de Pytest se instalan con pip, como otros paquetes de Python. Sin embargo
puedes usar pip de varias maneras para instalar complementos.


Instalar desde PyPI


Dado que PyPI es la ubicación predeterminada para pip, la instalación de complementos desde PyPI es el método más fácil. pytest-cov complemento pytest-cov :


 $ pip install pytest-cov 

Se instalará la última versión estable de PyPI.


Instalar una versión específica desde PyPI


Si desea una versión específica del complemento, puede especificar la versión después de == :


 $ pip install pytest-cov==2.4.0 

Instalar desde un archivo .tar.gz o .whl


Los paquetes PyPI se distribuyen como archivos zip con las extensiones .tar.gz y / o .whl . A menudo se les conoce como bolas y ruedas de alquitrán. Si tiene problemas para tratar de trabajar con PyPI directamente (lo que puede suceder con los firewalls y otras complicaciones de la red), puede descargar .tar.gz o .whl e instalar desde esto o aquello.


No necesita desempacar o bailar con una pandereta; solo apúntele pip:


 $ pip install pytest-cov-2.4.0.tar.gz # or $ pip install pytest_cov-2.4.0-py2.py3-none-any.whl 

Instalación desde el directorio local


Puede tener los complementos para complementos (y otros paquetes de Python) en un directorio local o compartido en .whl .tar.gz o .whl y usar esto en lugar de PyPI para instalar complementos:


 $ mkdir some_plugins $ cp pytest_cov-2.4.0-py2.py3-none-any.whl some_plugins/ $ pip install --no-index --find-links=./some_plugins/ pytest-cov 

--no-index le dice a pip no se conecte a PyPI. --find-links=./some_plugins/ le dice a pip que busque en el directorio some_plugins . Este método es especialmente útil si tiene complementos nativos y de terceros almacenados localmente, así como si está creando nuevos entornos virtuales para una integración continua o con tox. (Hablaremos sobre tox e integración continua en el capítulo 7, usando pytest con otras herramientas, en la página 125).


Tenga en cuenta que con el método de instalación del directorio local puede instalar varias versiones y especificar qué versión desea agregando == y el número de versión:


 $ pip install --no-index --find-links=./some_plugins/ pytest-cov==2.4.0 

Instalar desde el repositorio de Git


Puede instalar complementos directamente desde el repositorio de Git en este caso GitHub:


 $ pip install git+https://github.com/pytest-dev/pytest-cov 

También puede especificar la etiqueta de versión:


 $ pip install git+https://github.com/pytest-dev/pytest-cov@v2.4.0 

O puede especificar una rama:


 $ pip install git+https://github.com/pytest-dev/pytest-cov@master 

La instalación desde el repositorio de Git es especialmente útil si está almacenando su propio trabajo en Git o si falta la versión requerida del complemento o complemento de PyPI.


Nota del traductor:

pip admite la instalación desde Git, Mercurial, Subversion y Bazaar y define el tipo de VCS utilizando los prefijos de url: "git +", "hg +", "svn +", "bzr +".
Consulte la documentación de PyPI para más detalles.

Escribiendo tus propios complementos


Muchos complementos de terceros contienen mucho código. Esta es una de las razones por las que los usamos para ahorrarnos tiempo desarrollando todo esto por nuestra cuenta. Sin embargo, para su código específico, sin duda obtendrá accesorios especiales y modificaciones para ayudarlo a probarlo. Al crear un complemento, puede compartir fácilmente incluso varios accesorios que desee compartir entre varios proyectos. Puede compartir estos cambios con varios proyectos, y posiblemente con el resto del mundo, desarrollando y distribuyendo sus propios complementos. Esto es bastante fácil de hacer. En esta sección, desarrollaremos una pequeña modificación del comportamiento de pytest, lo empaquetaremos como un complemento, lo probaremos y consideraremos cómo distribuirlo.


Los complementos pueden incluir funciones de enlace que modifican el comportamiento de pytest. Dado que pytest fue diseñado para permitir que los complementos cambien ligeramente el comportamiento de pytest, hay muchas funciones de enlace disponibles. los ganchos para pytest se enumeran en el sitio de documentación de pytest . En nuestro ejemplo, crearemos un complemento que cambiará la apariencia del estado de la prueba. Agregue un parámetro de línea de comando para habilitar este nuevo comportamiento. Agregue texto al encabezado de salida. En particular, cambiaremos todos los indicadores de estado FALLIDO (fallido) a "OPORTUNIDAD (prospectiva) para mejorar", cambiaremos F a O y agregaremos "Gracias por ejecutar las pruebas" al encabezado. Para hacer esto, usaremos la opción --nice .


Para mantener los cambios de comportamiento separados de la discusión sobre la mecánica de los complementos, realizaremos cambios en conftest.py antes de convertirlo en un complemento redistribuible. No necesita ejecutar complementos de esta manera. Pero a menudo, los cambios que pretendía utilizar en un solo proyecto serán lo suficientemente útiles como para compartirlos y convertirlos en un complemento. Por lo tanto, comenzamos agregando funcionalidad al archivo conftest.py, y luego, después de que todo funciona en conftest.py, movemos el código al paquete.


De vuelta al proyecto Tareas. En la sección "Esperando excepciones" en la página 30, escribimos varias pruebas que verificaban si se generaban excepciones si alguien llamaba incorrectamente a la función API. Parece que hemos perdido al menos algunos posibles estados de error.


Aquí hay un par de pruebas más:


ch5 / a / task_proj / tests / func / test_api_exceptions.py

 """     API wrong.""" import pytest import tasks from tasks import Task @pytest.mark.usefixtures('tasks_db') class TestAdd(): """,   tasks.add().""" def test_missing_summary(self): """  ,  summary missing.""" with pytest.raises(ValueError): tasks.add(Task(owner='bob')) def test_done_not_bool(self): """  ,  done   bool.""" with pytest.raises(ValueError): tasks.add(Task(summary='summary', done='True')) 

Ejecútelos para verificar si pasan:


 $ cd /path/to/code/ch5/a/tasks_proj $ pytest ===================== test session starts ====================== collected 57 items tests/func/test_add.py ... tests/func/test_add_variety.py ............................ tests/func/test_add_variety2.py ............ tests/func/test_api_exceptions.py .F....... tests/func/test_unique_id.py . tests/unit/test_task.py .... =========================== FAILURES =========================== __________________ TestAdd.test_done_not_bool __________________ self = <func.test_api_exceptions.TestAdd object at 0x103a71a20> def test_done_not_bool(self): """Should raise an exception if done is not a bool.""" with pytest.raises(ValueError): > tasks.add(Task(summary='summary', done='True')) E Failed: DID NOT RAISE <class 'ValueError'> tests/func/test_api_exceptions.py:20: Failed ============= 1 failed, 56 passed in 0.28 seconds ============== 

Vamos a ejecutarlo nuevamente con -v para más detalles. Como ya has visto el rastro, puedes desactivarlo presionando --tb=no .


Ahora centrémonos en las nuevas pruebas con -k TestAdd , que funciona porque no hay otras pruebas con nombres que contengan "TestAdd".


Podríamos "dejar todo" e intentar arreglar esta prueba (y lo haremos más tarde), pero ahora nos centraremos en tratar de hacer que las fallas sean más agradables para los desarrolladores.


Comencemos agregando un mensaje de agradecimiento al encabezado, que puede hacer con un gancho de pytest_report_header() llamado pytest_report_header() .


ch5 / b / task_proj / tests / conftest.py

 def pytest_report_header(): """    .""" return "Thanks for running the tests." 

Obviamente, escribir una nota de agradecimiento es bastante estúpido. Sin embargo, la capacidad de agregar información al encabezado se puede ampliar. Puede agregar un nombre de usuario, indicar el equipo utilizado y las versiones a probar. En general, todo lo que puede convertir en una cadena se puede insertar en el título de la prueba.


Luego cambiaremos el informe de estado de la prueba para cambiar F a O y FAILED a OPPORTUNITY for improvement . Hay un gancho que permite este asunto: pytest_report_teststatus() :


ch5 / b / task_proj / tests / conftest.py

 def pytest_report_teststatus(report): """   .""" if report.when == 'call' and report.failed: return (report.outcome, 'O', 'OPPORTUNITY for improvement') 

Y ahora tenemos la solución que estábamos buscando. Una sesión de prueba sin el indicador --verbose muestra O para fallas, es decir, son posibles mejoras:


 $ cd /path/to/code/ch5/b/tasks_proj/tests/func $ pytest --tb=no test_api_exceptions.py -k TestAdd ===================== test session starts ====================== Thanks for running the tests. collected 9 items test_api_exceptions.py .O ====================== 7 tests deselected ====================== ======= 1 failed, 1 passed, 7 deselected in 0.06 seconds ======= 

Con la bandera -v o --verbose sería mejor:


 $ pytest -v --tb=no test_api_exceptions.py -k TestAdd ===================== test session starts ====================== Thanks for running the tests. collected 9 items test_api_exceptions.py::TestAdd::test_missing_summary PASSED test_api_exceptions.py::TestAdd::test_done_not_bool OPPORTUNITY for improvement ====================== 7 tests deselected ====================== ======= 1 failed, 1 passed, 7 deselected in 0.07 seconds ======= 

El último cambio que haremos es agregar un parámetro de línea de comando, --nice, para que los cambios en nuestro estado solo ocurran si sustituye --nice :


 def pytest_addoption(parser): """ nice    --nice.""" group = parser.getgroup('nice') group.addoption("--nice", action="store_true", help="nice: turn failures into opportunities") def pytest_report_header(): """    .""" if pytest.config.getoption('nice'): return "Thanks for running the tests." def pytest_report_teststatus(report): """   .""" if report.when == 'call': if report.failed and pytest.config.getoption('nice'): return (report.outcome, 'O', 'OPPORTUNITY for improvement') 

Vale la pena señalar que para este complemento usamos solo un par de ganchos. Hay muchos otros que se pueden encontrar en el sitio principal de documentación de Pytest .


Ahora podemos probar manualmente nuestro complemento simplemente ejecutándolo en nuestro ejemplo. Primero, sin la opción --nice , para asegurarse de que solo se muestre el nombre de usuario:


 $ cd /path/to/code/ch5/c/tasks_proj/tests/func $ pytest --tb=no test_api_exceptions.py -k TestAdd ===================== test session starts ====================== collected 9 items test_api_exceptions.py .F ====================== 7 tests deselected ====================== ======= 1 failed, 1 passed, 7 deselected in 0.07 seconds ======= 

Ahora con --nice :


 $ pytest --nice --tb=no test_api_exceptions.py -k TestAdd ===================== test session starts ====================== Thanks for running the tests. collected 9 items test_api_exceptions.py .O ====================== 7 tests deselected ====================== ======= 1 failed, 1 passed, 7 deselected in 0.07 seconds ======= 

Ahora con --nice y --verbose :


 $ pytest -v --nice --tb=no test_api_exceptions.py -k TestAdd ===================== test session starts ====================== Thanks for running the tests. collected 9 items test_api_exceptions.py::TestAdd::test_missing_summary PASSED test_api_exceptions.py::TestAdd::test_done_not_bool OPPORTUNITY for improvement ====================== 7 tests deselected ====================== ======= 1 failed, 1 passed, 7 deselected in 0.06 seconds ======= 

Genial Todos los cambios que queríamos hacer se realizaron en aproximadamente diez líneas de código para el archivo conftest.py . A continuación, trasladaremos este código a la estructura del complemento.


Crear un complemento instalable


El proceso de compartir complementos con otros usuarios está claramente definido. Incluso si nunca incluye su propio complemento en PyPI, pasar por este proceso le facilitará la lectura del código de los complementos de código abierto, y tendrá más oportunidades de evaluar si le ayudarán o no.


Sería superfluo cubrir completamente el empaque y la distribución de los paquetes de Python en este libro, ya que este tema está bien documentado en otra parte. Aquí y aquí y aquí en ruso. Sin embargo, pasar del complemento de configuración local que creamos en la sección anterior a algo instalado usando pip no es gran cosa. ,


Primero, necesitamos crear un nuevo directorio para alojar nuestro código de complemento. No importa cómo lo llames, pero como estamos creando un complemento para la bandera agradable, vamos a llamarlo pytest-nice. Tendremos dos archivos en este nuevo directorio: pytest_nice.py y setup.py. (El catálogo de prueba se analizará en la sección "Complementos de prueba" en la página 105).


 │ LICENSE │ pytest_nice.py │ setup.py │ └───tests │ conftest.py │ test_nice.py 

En pytest_nice.py , colocamos el contenido exacto de nuestro conftest.py que estaba asociado con esta función (y lo extraemos de tasks_proj/tests/conftest.py ):


ch5 / pytest-nice / pytest_nice.py


 """  pytest-nice .""" import pytest def pytest_addoption(parser): """ nice    --nice.""" group = parser.getgroup('nice') group.addoption("--nice", action="store_true", help="nice: turn FAILED into OPPORTUNITY for improvement") def pytest_report_header(): """    .""" if pytest.config.getoption('nice'): return "Thanks for running the tests." def pytest_report_teststatus(report): """   .""" if report.when == 'call': if report.failed and pytest.config.getoption('nice'): return (report.outcome, 'O', 'OPPORTUNITY for improvement') 

En setup.py necesitamos la llamada mínima a setup() :


ch5 / pytest-nice / setup.py

 """Setup  pytest-nice plugin.""" from setuptools import setup setup( name='pytest-nice', version='0.1.0', description=' Pytest,   FAILURE into OPPORTUNITY', url='https:////////', author=' ', author_email='your_email@somewhere.com', license='proprietary', py_modules=['pytest_nice'], install_requires=['pytest'], entry_points={'pytest11': ['nice = pytest_nice', ], }, ) 

Necesitará más información en la configuración si la va a distribuir a un público amplio o en Internet. Sin embargo, para un equipo pequeño o solo para usted, esto será suficiente.


Puede incluir algunos otros parámetros para la setup() ; y aquí solo tenemos los campos obligatorios. El campo de versión es la versión de este complemento. Y depende totalmente de usted cuando aparezca la versión. El campo URL es obligatorio. Puede dejarlo en blanco, pero recibirá una advertencia. Los author_email author y author_email se pueden reemplazar con maintainer y maintainer_email , pero uno de estos pares debería estar allí. El campo de license es un campo de texto corto. Podría ser una de las muchas licencias de código abierto, su nombre o empresa, o algo adecuado para usted. La py_modules enumera pytest_nice como nuestro único módulo para este complemento. Aunque esta es una lista, y puede incluir más de un módulo, si tuviera más de uno, usaría el paquete y colocaría todos los módulos en un directorio.


Hasta ahora, todas las opciones de setup() son estándar y son utilizadas por todos los instaladores de Python. La parte que es diferente para los complementos de Pytest es el parámetro entry_points . Hemos enumerado entry_points={'pytest11': ['nice = pytest_nice', ], },. La función entry_points es estándar para setuptools , pero pytest11 es el identificador especial que pytest está buscando. En esta línea, le decimos a pytest que nice es el nombre de nuestro complemento, y pytest_nice nombre del módulo en el que vive nuestro complemento. Si utilizamos el paquete, nuestra entrada aquí sería:


Todavía no he hablado sobre el archivo README.rst . Alguna forma de README es un requisito de setuptools. Si te lo pierdes, obtendrás esto:


 ... warning: sdist: standard file not found: should have one of README, README.rst, README.txt ... 

Mantener README como la forma estándar de incluir información del proyecto es una buena idea de todos modos. Esto es lo que puse en el archivo para pytest-nice:


ch5 / pytest-nice / README.rst

 pytest-nice : A pytest plugin =============================   pytest     .  -------- -   ,     pytest. -  ``--nice`` , : -  ``F``  ``O`` -  ``-v``,  ``FAILURE``  ``OPPORTUNITY for improvement``  ------------ ,    Pytest    .tar.gz    PATH,  : :: $ pip install PATH/pytest-nice-0.1.0.tar.gz $ pip install --no-index --find-links PATH pytest-nice  ----- :: $ pytest --nice 

Hay muchas opiniones sobre lo que debería estar en el archivo README. Esta es una versión muy recortada, pero funciona.


Complementos de prueba


Los complementos son códigos que deben probarse como cualquier otro código. Sin embargo, probar los cambios en una herramienta de prueba es un poco más complicado. Cuando desarrollamos el código del complemento en la sección "Escribir sus propios complementos", en la página 98, lo verificamos manualmente usando un archivo de prueba de muestra, ejecutando pytest con él y verificando la salida para asegurarnos de que fuera correcto. Podemos hacer lo mismo en modo automático usando un complemento llamado pytester , que viene con pytest pero está deshabilitado de forma predeterminada.


Hay dos archivos en nuestro directorio de prueba para pytest-nice: conftest.py y test_nice.py . Para usar pytester , necesitamos agregar solo una línea a conftest.py :


ch5 / pytest-nice / tests / conftest.py

 """pytester is needed for testing plugins.""" pytest_plugins = 'pytester' 

Esta línea incluye el complemento pytester . Utilizaremos un dispositivo llamado testdir , que estará disponible cuando pytester encienda pytester .
A menudo, las pruebas para complementos toman la forma que describimos manualmente:


  1. Haz un archivo de prueba de ejemplo.
  2. Ejecute pytest con o sin algunos parámetros en el directorio que contiene el archivo de muestra.
  3. Verifique la salida.
  4. Posible, para verificar el código de resultado es 0 para todos los pases, 1 para algunos fallos.

Veamos un ejemplo:


ch5 / pytest-nice / tests / test_nice.py

 def test_pass_fail(testdir): #     Pytest testdir.makepyfile(""" def test_pass(): assert 1 == 1 def test_fail(): assert 1 == 2 """) #  pytest result = testdir.runpytest() # fnmatch_lines    result.stdout.fnmatch_lines([ '*.F', # .  Pass, F  Fail ]) # ,      '1'  testsuite assert result.ret == 1 

Fixture testdir crea automáticamente un directorio temporal para alojar archivos de prueba. Tiene un método makepyfile() que le permite colocar el contenido de un archivo de prueba. En este caso, creamos dos pruebas: una que pasa y la otra que no pasa .


Ejecutamos pytest para un nuevo archivo de prueba usando testdir.runpytest() . Puede pasar parámetros si lo desea. El valor de retorno puede considerarse más adelante y es del tipo RunResult .


Por lo general, miro stdout y ret . , , , fnmatch_lines , , , , ret 0 1 . , fnmatch_lines , . . , , :


ch5/pytest-nice/tests/test_nice.py

 @pytest.fixture() def sample_test(testdir): testdir.makepyfile(""" def test_pass(): assert 1 == 1 def test_fail(): assert 1 == 2 """) return testdir 

, , sample_test , . :


ch5/pytest-nice/tests/test_nice.py

 def test_with_nice(sample_test): result = sample_test.runpytest('--nice') result.stdout.fnmatch_lines(['*.O', ]) # . for Pass, O for Fail assert result.ret == 1 def test_with_nice_verbose(sample_test): result = sample_test.runpytest('-v', '--nice') result.stdout.fnmatch_lines([ '*::test_fail OPPORTUNITY for improvement', ]) assert result.ret == 1 def test_not_nice_verbose(sample_test): result = sample_test.runpytest('-v') result.stdout.fnmatch_lines(['*::test_fail FAILED']) assert result.ret == 1 

. , :


ch5/pytest-nice/tests/test_nice.py

 def test_header(sample_test): result = sample_test.runpytest('--nice') result.stdout.fnmatch_lines(['Thanks for running the tests.']) def test_header_not_nice(sample_test): result = sample_test.runpytest() thanks_message = 'Thanks for running the tests.' assert thanks_message not in result.stdout.str() 

, , .


:


ch5/pytest-nice/tests/test_nice.py

 def test_help_message(testdir): result = testdir.runpytest('--help') # fnmatch_lines    result.stdout.fnmatch_lines([ 'nice:', '*--nice*nice: turn FAILED into OPPORTUNITY for improvement', ]) 

, , , .


pytest-nice , . .zip.gz , :


 $ cd /path/to/code/ch5/pytest-nice/ $ pip install . Processing /path/to/code/ch5/pytest-nice Requirement already satisfied: pytest in /path/to/venv/lib/python3.6/site-packages (from pytest-nice==0.1.0) Requirement already satisfied: py>=1.4.33 in /path/to/venv/lib/python3.6/site-packages (from pytest->pytest-nice==0.1.0) Requirement already satisfied: setuptools in /path/to/venv/lib/python3.6/site-packages (from pytest->pytest-nice==0.1.0) Building wheels for collected packages: pytest-nice Running setup.py bdist_wheel for pytest-nice ... done ... Successfully built pytest-nice Installing collected packages: pytest-nice Successfully installed pytest-nice-0.1.0 

, , :


 $ pytest -v ===================== test session starts ====================== plugins: nice-0.1.0 collected 7 items tests/test_nice.py::test_pass_fail PASSED tests/test_nice.py::test_with_nice PASSED tests/test_nice.py::test_with_nice_verbose PASSED tests/test_nice.py::test_not_nice_verbose PASSED tests/test_nice.py::test_header PASSED tests/test_nice.py::test_header_not_nice PASSED tests/test_nice.py::test_help_message PASSED =================== 7 passed in 0.34 seconds =================== 

. : , . .
 platform win32 -- Python 3.6.5, pytest-3.9.3, py-1.7.0, pluggy-0.8.0 -- c:\venv36\scripts\python.exe collected 7 items tests/test_nice.py::test_pass_fail FAILED [ 14%] tests/test_nice.py::test_with_nice OPPORTUNITY for improvement [ 28%] tests/test_nice.py::test_with_nice_verbose OPPORTUNITY for improvement [ 42%] tests/test_nice.py::test_not_nice_verbose FAILED [ 57%] tests/test_nice.py::test_header PASSED [ 71%] tests/test_nice.py::test_header_not_nice PASSED [ 85%] tests/test_nice.py::test_help_message PASSED [100%] ================================== FAILURES =================================== _______________________________ test_pass_fail ________________________________ 



  result.stdout.fnmatch_lines([ '*.F', # . for Pass, F for Fail ]) 


en
  result.stdout.fnmatch_lines([ '*.F*', # . for Pass, F for Fail ]) 


* F

test_with_nice , test_with_nice_verbose , test_not_nice_verbose

pytest.
c
'test_with_nice.py .O [100%]'
.
,

RemovedInPytest4Warning: usage of Session.Class is deprecated, please use pytest.Class instead

!
 (venv36) c:\_BOOKS_\pytest_si\bopytest-code\code\ch5\pytest-nice>pytest -v ============================= test session starts ============================= platform win32 -- Python 3.6.5, pytest-3.9.3, py-1.7.0, pluggy-0.8.0 -- c:\venv36\scripts\python.exe cachedir: .pytest_cache rootdir: c:\_BOOKS_\pytest_si\bopytest-code\code\ch5\pytest-nice, inifile: plugins: nice-0.1.0 collected 7 items tests/test_nice.py::test_pass_fail PASSED [ 14%] tests/test_nice.py::test_with_nice PASSED [ 28%] tests/test_nice.py::test_with_nice_verbose PASSED [ 42%] tests/test_nice.py::test_not_nice_verbose PASSED [ 57%] tests/test_nice.py::test_header PASSED [ 71%] tests/test_nice.py::test_header_not_nice PASSED [ 85%] tests/test_nice.py::test_help_message PASSED [100%] ============================== warnings summary =============================== tests/test_nice.py::test_pass_fail c:\venv36\lib\site-packages\_pytest\compat.py:332: RemovedInPytest4Warning: usage of Session.Class is deprecated, please use pytest.Class instead return getattr(object, name, default) 

¡Hurra! . (pytest-nice), Python
pytest-:


 $ pip uninstall pytest-nice Uninstalling pytest-nice-0.1.0: Would remove: \path\to\venv\lib\site-packages\pytest_nice-0.1.0.dist-info\* ... Proceed (y/n)? y Successfully uninstalled pytest-nice-0.1.0 

— , pytest, PyPI.



, . , setup.py :


 $ cd /path/to/code/ch5/pytest-nice $ python setup.py sdist running sdist running egg_info creating pytest_nice.egg-info ... running check creating pytest-nice-0.1.0 ... creating dist Creating tar archive ... $ ls dist pytest-nice-0.1.0.tar.gz 

( , sdist source distribution — “ .”)


pytest-nice dist pytest-nice-0.1.0.tar.gz .


, , :


 $ pip install dist/pytest-nice-0.1.0.tar.gz Processing ./dist/pytest-nice-0.1.0.tar.gz ... Installing collected packages: pytest-nice Successfully installed pytest-nice-0.1.0 

.tar.gz , .



pip , , , , , , .tar.gz . , pytest-nice-0.1.0.tar.gz myplugins .


pytest-nice myplugins :


 $ pip install --no-index --find-links myplugins pytest-nice 

--no-index pip PyPI, , .
The --find-links myplugins tells PyPI to look in myplugins for packages to install. And of course, pytest-nice is what we want to install.
--find-links myplugins PyPI myplugins . , pytest-nice — , .


myplugins , , --upgrade :


 $ pip install --upgrade --no-index --find-links myplugins pytest-nice 

pip , --no-index --find-links myplugins .


PyPI


, , . , . , , , Python Packaging .


pytest, — cookiecutter-pytest-plugin :


 $ pip install cookiecutter $ cookiecutter https://github.com/pytest-dev/cookiecutter-pytest-plugin 

. , . ; , , . pytest, , .


Ejercicios


ch4/cache/test_slower.py autouse fixture, check_duration() . 4. .


  1. pytest-slower, , , « » . 102.
  2. , pytest-slower , .
  3. .
  4. Python Package Index «pytest-». pytest, .
  5. Tasks.

Que sigue


conftest.py . , pytest, pytest.ini . , , .


Atrás Siguiente

Source: https://habr.com/ru/post/448794/


All Articles