dependencias de prueba de instalación de pip para tox de setup.py

Hice mi proyecto con setuptools y quiero probarlo con tox . tests_require las dependencias en una variable y las agregue al parámetro setup() ( tests_require y extras_require ). Mi proyecto necesita instalar todas las dependencias enumeradas en tests_require para probar, pero pip install no las está instalando.

Intenté esto pero no funcionó:

 install_command = pip install {opts} {packages}[tests] 

¿Cómo puedo instalar dependencias de prueba sin tener que administrar varias listas de dependencias (es decir, tener todas las dependencias enumeradas en test_requirements.txt y la variable tests_require )?

Lo he logrado cometiendo un ligero abuso de requisitos adicionales . Casi estabas allí para probar la syntax de los extras, solo que tests_require deps no están disponibles automáticamente de esa manera.

Con un setup.py como este:

 from setuptools import setup test_deps = [ 'coverage', 'pytest', ] extras = { 'test': test_deps, } setup( # Other metadata... tests_require=test_deps, extras_require=extras, ) 

Luego, puede instalar las dependencias de prueba con la syntax adicional, por ejemplo, desde el directorio raíz del proyecto:

 $ pip install .[test] 

Dale esa misma syntax a Tox en tox.ini , no es necesario ajustar el tox.ini de tox.ini predeterminado:

 [testenv] commands = {posargs:pytest} deps = .[test] 

Ahora no necesita mantener la lista de dependencias en dos lugares, y se expresan donde deberían estar para un paquete publicado: en los metadatos de empaquetado en lugar de requirements.txt archivos de requirements.txt .

Parece que este pequeño truco adicional no es tan raro .

Lo que puede hacer es tener un solo archivo (llamado test_requirements.txt ) y enumerar las dependencias de prueba así:

 dnspython==1.12.0 easydev==0.8.3 enum34==1.0.4 fabric==1.10.1 ... 

Luego, en setup.py , setup.py y almacene el contenido del archivo en una lista y pase esa lista a la setup :

 tests_require = [line.strip() for line in open('test_requirements.txt') if line.strip() and not line.strip().startswith('--')] setuptools.setup( ... tests_require=tests_require, ... ) 

Si usa el siguiente comando, Tox instalará sus test_requires antes de ejecutar las pruebas:

 commands = {envpython} setup.py test 

También deberá agregar a setup.py dónde están las pruebas con esto:

 test_suite="tests_module" 

Finalmente, aquí hay una respuesta para una pregunta similar con un buen ejemplo.