¿A dónde van las pruebas unitarias de Python? [cerrado]
Si estás escribiendo una biblioteca o una aplicación, ¿a dónde van los archivos de prueba unitaria?
Es bueno separar los archivos de prueba del código principal de la aplicación, pero es incómodo colocarlos en un subdirectorio "pruebas" dentro del directorio raíz de la aplicación, porque dificulta la importación de los módulos que probará.
¿Existe una mejor práctica aquí?
Para un archivo module.py
, normalmente se debe llamar a la prueba unitaria test_module.py
, siguiendo las convenciones de nomenclatura de Pythonic.
Hay varios lugares comúnmente aceptados para colocar test_module.py
:
- En el mismo directorio que
module.py
. - En
../tests/test_module.py
(al mismo nivel que el directorio de códigos). - En
tests/test_module.py
(un nivel debajo del directorio de códigos).
Prefiero el número 1 por su simplicidad para encontrar las pruebas e importarlas. Cualquiera que sea el sistema de compilación que esté utilizando, puede configurarse fácilmente para ejecutar archivos que comiencen con test_
. En realidad, el patrón predeterminado unittest
utilizado para el descubrimiento de pruebas estest*.py
.
Sólo 1 archivo de prueba
Si solo hay 1 archivo de prueba, se recomienda colocarlo en un directorio de nivel superior:
module/
lib/
__init__.py
module.py
test.py
Ejecute la prueba en CLI
python test.py
Muchos archivos de prueba
Si tiene muchos archivos de prueba, colóquelos en una tests
carpeta:
module/
lib/
__init__.py
module.py
tests/
test_module.py
test_module_function.py
# test_module.py
import unittest
from lib import module
class TestModule(unittest.TestCase):
def test_module(self):
pass
if __name__ == '__main__':
unittest.main()
Ejecute la prueba en CLI
# In top-level /module/ folder
python -m tests.test_module
python -m tests.test_module_function
Usarunittest discovery
unittest discovery
Encontrará todas las pruebas en la carpeta del paquete.
Crear una carpeta __init__.py
entests/
module/
lib/
__init__.py
module.py
tests/
__init__.py
test_module.py
test_module_function.py
Ejecute la prueba en CLI
# In top-level /module/ folder
# -s, --start-directory (default current directory)
# -p, --pattern (default test*.py)
python -m unittest discover
Referencia
pytest
Buenas prácticas para el diseño de pruebas.unittest
Marco de prueba unitaria
- nariz
- nariz2
- pytest
Una práctica común es colocar el directorio de pruebas en el mismo directorio principal que su módulo/paquete. Entonces, si su módulo se llamara foo.py, el diseño de su directorio se vería así:
parent_dir/
foo.py
tests/
Por supuesto que no hay una única forma de hacerlo. También puede crear un subdirectorio de pruebas e importar el módulo usando la importación absoluta .
Dondequiera que coloques tus pruebas, te recomendaría que uses nose para ejecutarlas. Nariz busca pruebas en sus directorios. De esta manera, puede realizar pruebas donde tengan más sentido desde el punto de vista organizativo.
Tuvimos la misma pregunta al escribir Pythoscope ( https://pypi.org/project/pythoscope/ ), que genera pruebas unitarias para programas Python. Encuestamos a las personas en la lista de pruebas en Python antes de elegir un directorio, hubo muchas opiniones diferentes. Al final elegimos poner un directorio de "pruebas" en el mismo directorio que el código fuente. En ese directorio generamos un archivo de prueba para cada módulo en el directorio principal.