我有一些方法写入django.test.TestCase
对象,我想从中运行
我真实数据库上的manage.py shell
。但是,当我尝试实例化TestCase对象以运行测试方法时,我收到此错误:
ValueError: no such test method in <class 'track.tests.MentionTests'>: runTest
有没有办法实例化TestCase
个对象?或者有没有办法针对非测试数据库运行测试方法?
答案 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)
运行测试
编写完测试后,运行它们 使用你的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测试,而不会将它们分配到测试数据库。