如何禁用Django的测试发现?
这是一种不寻常的情况 - 大多数Django用户都希望Django的测试运行者能够找到他们所有的测试。如何禁用Django的测试发现?
我正在研究一个Python库,其中包含多个运行不同配置的测试套件,所以我不想让发现从错误配置中找到并运行测试。如何完全禁用发现,并依赖仅在INSTALLED_APPS中显式声明的应用程序运行测试的1.6版之前的行为?
我的图书馆结构:
library/ # django app used by others
tests/ # custom test suites here
core/ # tests of core functionality
custom/ # tests of a custom feature requiring separate config
contrib/ # tests for assorted contrib features, also requiring separate config
manage_core.py # separate manage.py files for each "project"
manage_custom.py # these specify settings file to use.
manage_contrib.py
settings.py # base settings for all tests
settings_core.py # settings for 'core' tests including unique INSTALLED_APPS
settings_custom.py # settings for 'custom' tests; different INSTALLED_APPS
settings_contrib.py # settings for 'contrib' tests; different INSTALLED_APPS
的问题是,该命令,它应该只对“的contrib”测试套件运行测试,也发现和“核心”运行测试: ./manage_contrib.py test contrib.tests
嗯,不幸的是我不知道设置参数可能让你告诉unittest只能从单个应用程序运行(a-la“settings.TEST_DIRECTORIES = settings.INSTALLED_APPS”),但如果你能够给你的测试一个独特的命名约定,运行测试套件时可以使用--pattern =选项。
举例来说,如果你有
/myapp/tests/test_a_models.py
/myapp/tests/test_b_models.py
你只能用./manage.py test --pattern='*_a_*'
运行,然后运行b相./manage.py test --pattern='*_b_*'
肯定不理想,但可能会完成这项工作取决于有多少灵活性你在您自己的应用程序中使用测试命名约定。
当您在Django中运行测试时,默认情况下它会运行以def test_
开头的所有函数。当您在前面添加下划线时,它将忽略该特定测试。将所有不想运行的测试功能更改为:def _test_
,它应该可以工作。如果您有太多的测试需要忽略,您可以进行搜索并从test_
更换为_test_
。
它从Django文档丢失,但该命令行中有一个选项,通过./manage.py help test
发现:
-t TOP_LEVEL, --top-level-directory TOP_LEVEL
Top level of project for unittest discovery.
令人困惑的是,指定模块测试没有出现,以防止测试发现,但指定子目录呢,是这样的:
./manage_contrib.py test contrib.tests -t ./contrib/
这似乎是防止位于的contrib
外试验发现。
如果未安装必要的应用程序,您可以[跳过测试](https://docs.python.org/3/library/unittest.html#skipping-tests-and-expected-failures)。 – knbk