2010-07-30 14 views
13

Tengo algunos métodos escritos en un objeto django.test.TestCase que me gustaría ejecutar desde el manage.py shell en mi base de datos real. Pero cuando trato de una instancia del objeto TestCase para ejecutar el método de ensayo, me sale este error:¿Cómo ejecuto django TestCase manualmente/contra otra base de datos?

ValueError: no such test method in <class 'track.tests.MentionTests'>: runTest 

¿Hay una manera de crear instancias de los objetos TestCase? ¿O hay una forma de ejecutar un método de prueba contra una base de datos que no es de prueba?

Respuesta

1

Desde el Django testing docs:

Running tests

Once you've written tests, run them using the test subcommand of your project's manage.py utility:

$ ./manage.py test

By default, this will run every test in every application in INSTALLED_APPS. If you only want to run tests for a particular application, add the application name to the command line. For example, if your INSTALLED_APPS contains 'myproject.polls' and 'myproject.animals', you can run the myproject.animals unit tests alone with this command:

$ ./manage.py test animals

Note that we used animals, not myproject.animals. New in Django 1.0: You can now choose which test to run.

You can be even more specific by naming an individual test case. To run a single test case in an application (for example, the AnimalTestCase described in the "Writing unit tests" section), add the name of the test case to the label on the command line:

$ ./manage.py test animals.AnimalTestCase

And it gets even more granular than that! To run a single test method inside a test case, add the name of the test method to the label:

$ ./manage.py test animals.AnimalTestCase.testFluffyAnimals

El último ejemplo debería ser aplicable en su caso.

Si esto es lo que está haciendo, tendrá que publicar una descripción más detallada del código empleado en su caso de prueba.

+0

Claro, pero eso crea una nueva base de datos de prueba contra la cual ejecutar. ¿Cómo lo ejecuto contra la base de datos principal (sin prueba)? – Leopd

11

Aquí hay un método que encontré recientemente. No he encontrado nada mejor todavía.

from django.test.utils import setup_test_environment 
from unittest import TestResult 
from my_app.tests import TheTestWeWantToRun 

setup_test_environment() 
t = TheTestWeWantToRun('test_function_we_want_to_run') 
r = TestResult() 
t.run(r) 
r.testsRun # prints the number of tests that were run (should be 1) 
r.errors + r.failures # prints a list of the errors and failures 

De acuerdo con los documentos, hay que llamar setup_test_environment() cuando se ejecuta manualmente pruebas. django.test usa unittest para probar, así podemos usar TestResult de unittest para capturar resultados al ejecutar la prueba.

En Django 1.2, DjangoTestRunner podría usarse para pruebas más estructuradas. No he probado esto todavía.

+1

Cuando hago esto, mi TestCase no puede acceder a self.client. ¿También es posible ejecutar todas las funciones de prueba dentro de TestCase sin manipular getattr, etc.? – pielgrzym

+1

lo que realmente quiero es ejecutar el caso de prueba bajo pdb. – mcr

+0

Esto es increíble, ¡gracias! –

1

me encontré con esto, y elaboró ​​la siguiente solución:

En su miaplicacion/tests.py, preparar las cosas de esta manera:

# get the straight-up Python unittest without the Django machinery                                                     
# NOTE: this is unittest2, a backport of unit testing features from Python 2.7                                                 
# (running 2.6 at the time of writing)                                                
from django.utils import unittest 
# get the Django wraps                                           
from django.test import TestCase as DjangoTestCase 

# [..] 
# your normal Django unit tests, inheriting from DjangoTestCase 
# [..] 

class MyTest(unittest.TestCase): 
    def runTest(self): # NOTE: required name 
     self.failUnless(True is True) 

def runNonDjangoTests(): 
    return MyTest() # or unittest.TestSuite([ MyTest(), .. ]) 

Ejecuta esta prueba con

~$ unit2 myapp.tests.runNonDjangoTests 

Para obtener más información, ver http://pypi.python.org/pypi/unittest2

Esto también le permite ejecutar pruebas unitarias contra la base de datos principal, con todos los efectos secundarios potencialmente destructivos. Tenga en cuenta que unidad2 es bastante peligroso en este contexto, si llama a unidad2 myapp.tests ejecutará todas las pruebas normales de Django sin tenerlas en una base de datos de prueba.

2

El problema "runTest" suele aparecer ya que las personas pasan por alto el hecho de que unittest.TestCase tiene un argumento predeterminado en su constructor. Echar un vistazo a lib/python/unittest/case.py

class TestCase: 
    def __init__(self, methodName='runTest'): 

en cuenta que la clase base "TestCase" no proporciona una implementación por defecto de "def runTest" pero sí nethertheless tratar de invocarlo. De ahí viene el error. La confusión real proviene del hecho de que el uso de "unittest.main()" no necesita un método de prueba de ejecución, pero todavía llamará a todas las funciones de "def test *". Esto funciona ... pero no por un comportamiento predeterminado de TestCase, sino por el código de inspección de unittest.principal - esto está haciendo algo como lo siguiente:

class MyTest(unittest.TestCase): 
    def test_001(self): 
     print "ok" 

if __name__ == "__main__": 
    suite = unittest.TestSuite() 
    for method in dir(MyTest): 
     if method.startswith("test"): 
      suite.addTest(MyTest(method)) 
    unittest.TextTestRunner().run(suite) 

Respondiendo a la pregunta original "Tengo algunos métodos escritos en una django.test.TestCase": hay que añadir cada método de forma individual en un banco de pruebas mediante el uso de su testclass y proporcionar el nombre del método de destino como el primer argumento sobre la creación del objeto.

Cuestiones relacionadas