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
进行测试,因此我们可以在运行测试时使用fromunittest
来捕获结果
在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下运行测试用例。