2014-07-16 78 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