unittest tutorial test setup fail addopts python pytest unit-testing

python - setup - pytest tutorial



unittest Vs pytest (1)

1) En primer lugar, puede declarar esos aparatos no solo en conftest.py, sino en cada módulo de python que desee. Y puedes importar ese módulo. También puedes usar los accesorios de la misma manera que usaste el método de configuración:

@pytest.fixture(scope=''class'') def input(request): request.cls.varA = 1 request.cls.varB = 2 request.cls.varC = 3 request.cls.modified_varA = 2 @pytest.usefixtures(''input'') class TestClass: def test_1(self): do_something_with_self.varA, self.varB def test_2(self): do_something_with_self_modified_varA, self.varC

o puedes definir variables separadas en aparatos separados:

def fixture_a(): return varA def fixture_b(): return varB def fixture_c(): return varC def fixture_mod_A(): return modified_varA

o haga un accesorio que devuelva todas las variables (¿por qué no?) o incluso haga un accesorio parametrizado indirecto que devuelva las variables por su elección (de manera bastante confusa):

@pytest.fixture() def parametrized_iput(request): vars = {''varA'': 1, ''varB'': 2, ''varC'': 3} var_names = request.param return (vars[var_name] for var_name in var_names) @pytest.mark.parametrize(''parametrized_iput'', [(''varA'', ''varC'')], indirect=True) def test_1(parametrized_iput) varA, varC = parametrized_iput ...

O incluso usted puede hacer la fábrica de artefactos que lo hará sobre la marcha. Suena curioso cuando solo tienes 5 pruebas y 5 configuraciones de variables, pero cuando obtienes cientos de ambas, puede ser útil.

3) Por supuesto que puedes. Pero le recomiendo que no importe este archivo directamente, pero use la opción de línea de comando que apunta qué archivo importar. En este caso, puede elegir otro archivo con variables sin cambiar su código.

4) Utilizo clases en mis pruebas porque migre de Nosetest. No mencioné ningún problema con el uso de clases en pytest.

5) En ese caso, le propongo que haga lo siguiente: primero haga la función con las acciones deseadas:

def some_actions(a, b): # some actions here ... return c

entonces utilízalo tanto en la prueba como en el accesorio:

def test(): assert some_actions(1,2) == 10 @pytest.fixture() def some_fixture(): return some_actions(1,2)

En unittest, puedo configurar variables en una clase y luego los métodos de esta clase pueden elegir la variable que quiera usar ...

class test_class(unittest.TestCase): def setUp(self): self.varA = 1 self.varB = 2 self.varC = 3 self.modified_varA = 2 def test_1(self): do_something_with_self.varA, self.varB def test_2(self): do_something_with_self_modified_varA, self.varC

Así que en unittest, fue fácil juntar un montón de pruebas que podrían ir bajo una clase y luego usar muchas variables diferentes (varA y varB) para diferentes métodos. En pytest, creé un accesorio en conftest.py en lugar de una clase en unittest, como esto ...

@pytest.fixture(scope="module") def input1(): varA = 1 varB = 2 return varA, varB @pytest.fixture(scope="module") def input2(): varA = 2 varC = 3 return varA, varC

Alimento este input1 y input2 a mis funciones en un archivo diferente (digamos test_this.py) para dos funciones diferentes. Aquí están las preguntas basadas en la información anterior ...

  1. Como no puedo declarar variables locales en conftest.py, no puedo importar este archivo. ¿Hay una mejor manera de declarar diferentes variables aquí que se pueden usar en diferentes funciones en test_this.py? Tengo cinco configuraciones diferentes en mis pruebas reales para estas variables, definiendo que muchos aparatos diferentes en conftest.py y los uso como argumento de función en cinco funciones diferentes en test_this.py suena doloroso, preferiría volver a la estructura de clases de prueba de unidad, definir Mis variables y escoger y elegir lo que quiero.

  2. ¿Debo declarar variables globales en test_this.py y usarlas en las funciones como deseo? Parece un poco no pitónico. Estas variables solo son utilizadas por las funciones en este archivo.

  3. Digamos que tengo test_that.py y test_them.py también. Si tengo algunas variables compartidas entre estos diferentes archivos, ¿cómo los declararía? simplemente cree un archivo calle variables.py en el directorio donde están todos estos archivos de prueba y realice una importación cuando lo necesite. De esta manera puedo guardar todos los datos por separado.

  4. ¿Es mi impresión que Pytest no recomienda el uso de una clase para organizar tus funciones? Cada ejemplo que leo en línea, parece que emplean un montón de funciones solo con dispositivos. ¿Qué es una configuración para definir clases y métodos y organizar pruebas en pytest?

  5. Tengo un escenario de prueba en el que tengo que usar el resultado de una función en otra. Con pytest, tengo una aseveración que está al final de una función, no una devolución, por lo que no podré usar esta función como un accesorio. ¿Cómo logro esto? Sé que no es una buena práctica que mi prueba se base en otra, pero ¿hay algún problema?

Gracias de antemano por sus respuestas.