如何传播Django的unit testing多个文件?
- 我有一个python-django应用程序
- 我正在使用unit testing框架
- testing安排在模块目录下的“tests.py”文件中
- 我通过
./manage.py test app
运行testing
现在..
-
tests.py
文件变得相当大/复杂/杂乱 - 我想将
tests.py
分解成更小的testing集合…
怎么样?
Django 1.6中的行为已经改变,所以不再需要创build一个包。 只要命名您的文件test*.py
。
从Django 1.7文档
在运行testing时,testing实用程序的默认行为是在名称以test开头的任何文件中查找所有testing用例(即unittest.TestCase的子类),自动从这些testing用例中构buildtesting套件,并运行该套件。
从Django 1.6文档 ,
testing发现基于unittest模块的内置testing发现。 默认情况下,这将在当前工作目录下的任何名为“test * .py”的文件中发现testing。
以前的行为, 从Django 1.5文档 :
在运行testing时,testing实用程序的默认行为是在models.py和tests.py中查找所有testing用例(即unittest.TestCase的子类),自动构buildtesting用例组合外的testing用例,并运行该套件。
还有第二种方法为模块定义testing套件:如果在models.py或tests.py中定义一个名为suite()的函数,那么Djangotesting运行器将使用该函数为该模块构buildtesting套件。 这遵循build议的unit testing组织。 有关如何构build复杂testing套件的更多详细信息,请参阅Python文档。
请注意,这种方法不再有效从Django 1.6,看到这个职位 。
你可以用___init___.py
在里面创buildtests
文件夹(这样它就成为一个包)。 然后在这里添加你的拆分testing.py文件,并将其全部导入到___init___.py
。
即:用一个看起来像文件一样的模块replacetest.py
文件:
在相关应用程序下创build一个tests
目录
应用 应用程序\ models.py 应用程序\ views.py 应用程序\testing 应用程序\testing\ __ init__.py 应用程序\testing\ bananas.py 应用程序\testing\ apples.py
将子模块导入到app\tests\__init__.py
:
from bananas import * from apples import *
现在,您可以使用./manage.py,就好像它们都在单个文件中一样:
./manage.py test app.some_test_in_bananas
托马斯所说的答案是正确的。 但是,确保__init__.py
中的导入与您的文件结构相匹配可能会变得冗长乏味。
要自动检测文件夹中的所有testing,可以在__init__.py
添加:
import unittest def suite(): return unittest.TestLoader().discover("appname.tests", pattern="*.py")
这将允许您运行./manage.py test appname
但不会处理运行特定的testing。 要做到这一点,你可以使用这个代码(也在__init__.py
):
import pkgutil import unittest for loader, module_name, is_pkg in pkgutil.walk_packages(__path__): module = loader.find_module(module_name).load_module(module_name) for name in dir(module): obj = getattr(module, name) if isinstance(obj, type) and issubclass(obj, unittest.case.TestCase): exec ('%s = obj' % obj.__name__)
现在你可以通过manage.py test app
或者通过manage.py test app.TestApples
来运行所有的testing
如果你有更复杂的设置,或者不想使用from ... import *
-type语句,你可以在你的tests.py(或者tests / __init__.py)中定义一个名为suite
的函数,它返回一个实例testingunittest.TestSuite
。
无需在init中编写任何代码。 只需在您的应用程序中创build一个子目录。 唯一的要求是不叫它testing*例如
app/ app/__init_.py app/serializers.py app/testing/ app/testing/__init__.py app/testing/tests_serializers.py
只要让你的目录结构如下所示:
myapp/ __init__.py tests/ __init__.py test_one.py test_two.py ... ...
和python manage.py test myapp
将按预期工作。
我想./manage.py test
只是运行所有的testing技巧(在Django> = 1.7)。
如果你的组织testing是关于分组和挑剔 ,你是nose
粉丝使用django鼻子 :
python manage.py test another.test:TestCase.test_method
如果你知道鼻子,那么你知道如何“通配符”在所有的文件更好。
PS
这只是一个更好的做法。 希望有所帮助。 答案是从这里借用的: 当你的应用程序有一个testing目录时,在Django中运行一个特定的testing用例