如何手动/对其他数据库运行django TestCase?

时间:2010-07-30 19:17:13

标签: python django unit-testing

我有一些方法写入django.test.TestCase对象,我想从中运行 我真实数据库上的manage.py shell。但是,当我尝试实例化TestCase对象以运行测试方法时,我收到此错误:

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

有没有办法实例化TestCase个对象?或者有没有办法针对非测试数据库运行测试方法?

4 个答案:

答案 0 :(得分:12)

这是我最近发现的一种方法。我还没有找到更好的东西。

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

根据文档,我们应该在手动运行测试时调用setup_test_environment()django.test使用unittest进行测试,因此我们可以使用unittest中的TestResult来运行测试时捕获结果。

在Django 1.2中,DjangoTestRunner可用于更结构化的测试。我还没试过这个。

答案 1 :(得分:2)

&#34; runTest&#34;问题通常会出现,因为人们忽略了unittest.TestCase在其构造函数中确实有一个默认参数的事实。看一下lib / python / unittest / case.py

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

注意基类&#34; TestCase&#34;没有提供&#34; def runTest&#34;的默认实现。但它确实尝试调用它。这就是错误的来源。实际的混淆来自于使用&#34; unittest.main()&#34;不需要runTest方法,但它仍然会调用所有&#34; def test *&#34;功能。这可行...但不是因为TestCase的默认行为,而是来自unittest.main的检查代码 - 这样做的内容如下:

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)

回答原始问题&#34;我有一些方法写入django.test.TestCase&#34;:你需要通过使用你的测试类并将目标方法名称作为第一个单独添加到测试套件上关于对象创建的论证。

答案 2 :(得分:1)

来自Django testing docs

  

运行测试

     

编写完测试后,运行它们   使用你的test子命令   project的manage.py实用程序:

     

$ ./manage.py test

     

默认情况下,这将运行每个测试   在每个应用程序中   INSTALLED_APPS。如果你只想   为特定的运行测试   应用程序,添加应用程序名称   到命令行。例如,如果   您的INSTALLED_APPS包含   'myproject.polls'和   'myproject.animals',你可以运行   myproject.animals单独测试单元   使用此命令:

     

$ ./manage.py测试动物

     

请注意,我们使用的是动物,而不是   myproject.animals。 Django 1.0中的新功能:   您现在可以选择要运行的测试。

     

你可以更加具体   命名一个单独的测试用例。跑步   应用程序中的单个测试用例   (例如,AnimalTestCase   在“写作单元测试”中描述   部分),添加测试的名称   case到命令行上的标签:

     

$ ./manage.py测试   animals.AnimalTestCase

     

它变得更加精细   那!运行单个测试方法   在测试用例中,添加名称   标签的测试方法:

     

$ ./manage.py测试   animals.AnimalTestCase.testFluffyAnimals

最后一个例子应该适用于你的情况。

如果您正在进行此操作,则需要发布测试用例中所用代码的更详细说明。

答案 3 :(得分:1)

我遇到了这个,并制定了以下解决方案:

myapp / tests.py 中,设置如下:

# 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(), .. ] )

您使用

运行此测试
~$ unit2 myapp.tests.runNonDjangoTests

有关详细信息,请参阅http://pypi.python.org/pypi/unittest2

这也允许您对主数据库运行单元测试,具有所有潜在的破坏性副作用。请注意,如果你打电话, unit2 在这种情况下非常危险 unit2 myapp.tests 它将运行所有正常的Django测试,而不会将它们分配到测试数据库。