Pregunta primero, luego una explicación si estás interesado.generar pruebas de py.test en python
En el contexto de py.test, ¿cómo puedo generar un gran conjunto de funciones de prueba a partir de un pequeño conjunto de plantillas de funciones de prueba?
Algo así como:
models = [model1,model2,model3]
data_sets = [data1,data2,data3]
def generate_test_learn_parameter_function(model,data):
def this_test(model,data):
param = model.learn_parameters(data)
assert((param - model.param) < 0.1)
return this_test
for model,data in zip(models,data_sets):
# how can py.test can see the results of this function?
generate_test_learn_parameter_function(model,data)
Explicación:
estoy tratando de entrar en la unidad de pruebas. Codigo para 'ciencia', porque estoy escribiendo código que creo que es matemáticamente complicado pero no tan malo desde el punto de vista de la programación, es decir, tengo cinco funciones para probar. El hecho de que vengo de 'ciencia' significa que soy bastante nuevo para las pruebas unitarias, pero me he convencido de que es lo que se debe hacer.
El código que estoy escribiendo toma una estructura de modelo, algunos datos y aprende los parámetros del modelo. Así que mi unidad de prueba consiste en un conjunto de estructuras de modelos y conjuntos de datos pregenerados, y luego un conjunto de aproximadamente 5 tareas de aprendizaje automático para completar en cada estructura + datos.
Así que si doy la clave para esto, necesito una prueba por modelo por tarea. Cada vez que se me ocurre un nuevo modelo, necesito copiar y pegar las 5 tareas, cambiando la estructura en escabeche + datos a los que estoy apuntando. Esto me parece una mala práctica. Idealmente, lo que me gustaría es 5 funciones de plantilla que definan cada una de mis 5 tareas y luego escupir las funciones de prueba para obtener una lista de las estructuras que especifico.
La búsqueda en Google me lleva a a) fábricas ob) cierres, los cuales atormentan mi cerebro y me sugieren que debe haber una manera más fácil, ya que este problema debe ser enfrentado regularmente por programadores adecuados. Entonces, ¿está ahí?
EDITAR: Así que aquí está cómo resolver este problema.
def pytest_generate_tests(metafunc):
if "model" in metafunc.funcargnames:
models = [model1,model2,model3]
for model in models:
metafunc.addcall(funcargs=dict(model=model))
def test_awesome(model):
assert model == "awesome"
¡Esto aplicará la prueba test_awesome a cada modelo en mi lista de modelos! Gracias @dfichter!
(NOTA: afirmar que siempre pasa, por cierto)
Por lo general, es una mala idea para generar dinámicamente código de prueba como esa. Porque entonces tiene que escribir pruebas para el código de prueba, etc. 'copie y pegue las 5 tareas' Creo que esto muestra que en lugar de generar código nuevo o copiar y pegar, puede encontrar aspectos comunes que sus funciones pueden probar sin saber exactamente qué estoy probando – Falmarri
Por el momento estoy escribiendo pruebas que se ven como def test_learn: para modelo en modelos: assert (error
@Falmarri: http://en.wikipedia.org/wiki/Copy_and_paste_programming Por favor evítelo a toda costa. – lpapp