Estoy probando la integración de un sistema, utilizando solo las API públicas. Tengo una prueba que se parece a esto:
def testAllTheThings():
email = create_random_email()
password = create_random_password()
ok = account_signup(email, password)
assert ok
url = wait_for_confirmation_email()
assert url
ok = account_verify(url)
assert ok
token = get_auth_token(email, password)
a = do_A(token)
assert a
b = do_B(token, a)
assert b
c = do_C(token, b)
# ...and so on...
Básicamente, estoy tratando de probar todo el "flujo" de una sola transacción. Cada paso del flujo depende del paso anterior siguiente. Debido a que me estoy restringiendo a la API externa, no puedo simplemente introducir valores en la base de datos.
Entonces, o tengo un método de prueba realmente largo que hace `A; afirmar; SI; afirmar; C; afirmar ... ", o lo divido en métodos de prueba separados, donde cada método de prueba necesita los resultados de la prueba anterior antes de que pueda hacer lo suyo:
def testAccountSignup():
# etc.
return email, password
def testAuthToken():
email, password = testAccountSignup()
token = get_auth_token(email, password)
assert token
return token
def testA():
token = testAuthToken()
a = do_A(token)
# etc.
Creo que esto huele. ¿Hay una mejor manera de escribir estas pruebas?
Separaría el código de prueba del código de configuración. Quizás:
Recuerde, toda la información aleatoria que se genera debe incluirse en la afirmación en caso de que falle; de lo contrario, su prueba podría no ser reproducible. Incluso podría registrar la semilla aleatoria utilizada. Además, cada vez que falla un caso aleatorio, agregue esa entrada específica como una prueba codificada para evitar la regresión.
fuente
No es mucho mejor, pero al menos puede separar el código de configuración del código de afirmación. Escriba un método separado que cuente la historia completa paso a paso y tome un parámetro que controle cuántos pasos debe tomar. Luego, cada prueba puede decir algo como
simulate 4
osimulate 10
y luego afirmar lo que sea que pruebe.fuente
Bueno, es posible que no obtenga la sintaxis de Python aquí mediante "codificación aérea", pero supongo que tiene la idea: puede implementar una función general como esta:
lo que te permitirá escribir tus exámenes así:
Por supuesto, es discutible si vale la pena usar la pérdida de legibilidad de este enfoque, pero reduce un poco el código repetitivo.
fuente