2014-07-16 161 views
2

所以我看了不少于10个与Django相关的不同堆栈溢出问题没有找到单元测试,并且其中每个人都不能解决我的问题问题。Django 1.6+测试不发现位于测试子目录中的单元测试

我正在运行Django 1.65,并试图让Django发现我的测试。

这里是我的目录结构

project 
    __init__.py 
    my_app 
    __init__.py 
    tests 
     __init__.py 
     test_template_tags.py 
    my_app2 
    __init__.py 
    tests 
     __init__.py 
     test_something_else.py 

我在项目目录内的命令行尝试的命令是: python manage.py test my_app

内test_template_tags.py的代码是:

from django.test import TestCase 

class MyTestClass(TestCase): 

    def setUp(self): 
     pass 

    def tearDown(self): 
     pass 

    def test_something(self): 
     self.assertTrue(True) 

从另一个小窍门SO执行该命令find my_app -name 'test*.py'并将所有测试文件显示为一个w应该期待。

当我打开项目目录内的django shell并尝试导入测试类时,所有内容都按预期工作。

from my_app.tests.test_template_tags import MyTestClass

最后我复制并粘贴测试代码到app目录内tests.py文件,当然,它的工作,但它不解决我所期待的。

是否还有其他一些明显的小东西,我在这里失踪?我的所有文件都是__init__.py,所有测试文件的前面都有test_,而my_app包含在INSTALLED_APPLICATIONS的设置中。

回答

2

在您的__init__.py中,您需要import该目录中的其他测试模块,以便测试运行人员发现它们。如果你的结构是这样的:

project 
    __init__.py 
    my_app 
    __init__.py 
    tests 
     __init__.py 
     test_template_tags.py 
    my_app2 
    __init__.py 
    tests 
     __init__.py 
     test_something_else.py 

然后my_app.tests.__init__.py将包含:

from test_template_tags import * 

而且my_app2.tests.__init__.py将包含:

from test_something_else import * 

然后你的测试运行使用python manage.py test

+0

所以这绝对有效,我不是百分百的疯狂,但如果这是它的方式无法完成,这就是我要做的。 Django是如何改变测试跑步者的意图的? (很明显,这个决定不仅仅是这个)。 – Mike

+0

这就是python所有的工作原理。你必须将目录中的所有'.py'文件导入'__init __。py'文件,以便python能够找到这些模块。 –

+0

我不是按照你说的。没有理由他们不能只有一个寻找测试*文件的递归发现过程。如果我想拥有多个测试目录和/或嵌套目录,那么我是否必须将它们全部导入到单个'__init __。py'文件中? 对我来说,将它导入到'__init __。py'这个简单的事实在某种程度上是多余的,并且违反了DIY,因为文件系统具有该信息。通常,我已经看到'__init __。py'曾经是您想要加载/执行包的某些部分的位置。 – Mike