2010-01-30 8 views
5

El siguiente código se usa para ejecutar doctests en una aplicación de Google App Engine. ¿Cómo harías esto para las pruebas escritas como pruebas unitarias en lugar de como docámenes?En Python, ¿cómo se ejecutan programáticamente las pruebas unitarias almacenadas en una cadena?

#The solution and tests are untrusted code passed in to the GAE app. 
solution = 'b=5' 
unittest = 'assertEqual(b, 5)' 

#Here is the doctest version as a reference. 
solution = 'b=5' 
doctest = '>>> b \n 5' 

#Compile and exec the untrusted solution provided by the user. 
compiled = compile(solution, 'submitted code', 'exec') 
sandbox = {} 
exec compiled in sandbox 

#Compile and exec each of the doctests 
test_cases = doctest.DocTestParser().get_examples(doctest) 
    for test in test_cases: 
    if not test.want: 
     exec test.source in sandbox 
+0

La frase "doctests written as unittests" realmente no tiene ningún sentido. Es doctests o no? –

+0

Lennart, estamos creando todos nuestros problemas con doctests hoy. Ahora estamos viendo cómo ofrecer la opción de crear problemas en el formato de prueba de Python en lugar del formato doctest. De esta forma, un profesor podría ingresar algo como 'self.assertEqual (b, 5)' en lugar de '>>> b \ n 5 'como una prueba que debe pasar la solución de un estudiante. – Chris

Respuesta

3

métodos de una clase, tales como unittest.TestCase.assertEqual, no se ejecutan fuera del contexto proporcionado por una instancia de esa clase. Entonces, una cadena como su 'assertEqual(b, 5)' es realmente una muy, MUY mala, tenga en cuenta que la cadena como está escrita nunca se ejecutará correctamente (debe anteponer, al menos, algo así como 'self.', y luego self debe estar hecho en una instancia de la clase, etc., etc.).

No estoy seguro exactamente por qué quiere apoyar este tipo de construcciones desastrosos, pero, en caso de que esté firme en que se hace a toda costa quiere, entonces esa es la idea general: hacer que una instancia de la unittest.Testcase clase, antepone el nombre de referencia de instancia y un punto a esa cadena y ejecuta esa cadena compuesta. Luego, por supuesto, se mete en todo tipo de otros requisitos divertidos, como capturar la excepción que puede surgir (ya que realmente no tiene un corredor de prueba para hacer todas las tareas de limpieza para usted). Yecch.

Cuestiones relacionadas