Python 如何手动/针对其他数据库运行django测试用例?

Python 如何手动/针对其他数据库运行django测试用例?,python,django,unit-testing,Python,Django,Unit Testing,我有一些方法被写入了django.test.TestCase对象中,我希望从 manage.py shell在我的真实数据库上。但是,当我尝试实例化TestCase对象以运行测试方法时,会出现以下错误: ValueError: no such test method in <class 'track.tests.MentionTests'>: runTest ValueError:runTest中没有此类测试方法 是否有方法实例化TestCase对象?或者有没有办法对非测试数据库

我有一些方法被写入了
django.test.TestCase
对象中,我希望从
manage.py shell
在我的真实数据库上。但是,当我尝试实例化TestCase对象以运行测试方法时,会出现以下错误:

ValueError: no such test method in <class 'track.tests.MentionTests'>: runTest
ValueError:runTest中没有此类测试方法
是否有方法实例化
TestCase
对象?或者有没有办法对非测试数据库运行测试方法?

来自:

运行测试

编写测试后,运行它们 使用 项目的manage.py实用程序:

$./manage.py测试

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

$./manage.py试验动物

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

你甚至可以通过 命名单个测试用例。运行 应用程序中的单个测试用例 (例如,AnimalTestCase 在“编写单元测试”中描述 节),添加测试的名称 命令行上标签的大小写:

$./manage.py测试 动物实验

它变得比以前更细粒 那个运行单个测试方法的步骤 在测试用例中,添加 标签的试验方法:

$./manage.py测试 动物.AnimalTestCase.testFluffyAnimals

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


如果这就是您正在做的,那么您需要发布测试用例中使用的代码的更详细描述。

以下是我最近发现的一种方法。我还没有找到更好的

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
根据文档,我们应该在手动运行测试时调用
django.test
使用
unittest
进行测试,因此我们可以在运行测试时使用from
unittest
来捕获结果


在Django 1.2中,可用于更结构化的测试。不过我还没有尝试过这个方法。

我遇到了这个问题,并想出了以下解决方案:

在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
有关详细信息,请参阅

这还允许您对主数据库运行单元测试,并具有所有潜在的破坏性副作用。请注意,如果您调用 unit2 myapp.tests它将运行所有正常的Django测试,而不将它们转移到测试数据库。

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

class TestCase:
    def __init__(self, methodName='runTest'):
请注意,基类“TestCase”不提供“def runTest”的默认实现,但它确实尝试调用它。这就是错误的来源。实际的混乱源于这样一个事实,即使用“unittest.main()”不需要runTest方法,但它仍将调用所有“def test*”函数。这很有效。。。但这并不是因为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)

回答最初的问题“我在django.test.TestCase中编写了一些方法”:您需要使用testclass将每个方法单独添加到testsuite中,并在创建对象时提供目标方法名称作为第一个参数。

当然,但这会创建一个新的测试数据库来运行。如何在主(非测试)数据库上运行它?当我这样做时,我的测试用例无法访问self.client。也可以在TestCase内部运行所有测试函数,而不用修改getattr等吗?我真正想要的是在pdb下运行测试用例。