为什么Django看不到我的测试?

12

我创建了一个test.py模块,里面填充了

from django.test import TestCase
from django.test.client import Client
from django.contrib.auth.models import User
from django.contrib.sites.models import Site

from forum.models import *

class SimpleTest(TestCase):


    def setUp(self):
        u = User.objects.create_user("ak", "ak@abc.org", "pwd")
        Forum.objects.create(title="forum")
        Site.objects.create(domain="test.org", name="test.org")

    def content_test(self, url, values):
        """Get content of url and test that each of items in `values` list is present."""
        r = self.c.get(url)
        self.assertEquals(r.status_code, 200)
        for v in values:
            self.assertTrue(v in r.content)

    def test(self):
        self.c = Client()
        self.c.login(username="ak", password="pwd")

        self.content_test("/forum/", ['<a href="/forum/forum/1/">forum</a>'])
        ....

我把它放在了我的应用程序文件夹中。 当我运行测试时,

python manage.py test forum

创建测试数据库后,我得到了一个答案:“Ran 0 tests in 0.000s”。

我做错了什么?

附言: 这是我的项目层次结构:

MyProj:
    forum (it's my app):
        manage.py
        models.py
        views.py
        tests.py
        ...

我把test.py重命名为tests.py。Eclipse认为这个模块属于测试,但是结果仍然显示“在0.000秒内运行了0个测试”

7个回答

41

每个测试方法需要使用前缀 test_


我也是,在Django 1.4上。谢谢! - Tom Wainwright

20

摘要

  1. 尝试仅针对您的应用程序运行:

python manage.py test YOUR_APP
  • 请检查您的settings.py文件中是否将YOUR_APP添加到INSTALLED_APPS配置中。

  • 测试方法应以test_开头,例如:

  • def test_something(self):
        self.assertEquals(1, 2)
    
  • 如果你使用的是名为tests的文件夹而不是tests.py文件,请检查其中是否有一个名为__init__.py的文件。

  • 如果你正在使用tests文件夹,请删除tests.pyctests.pyo文件。 (Python3中的__pycache__目录)


  • 2
    除了数字4之外,不要忘记删除__pycache__文件夹。 - PvdL
    我的问题是2。谢谢。 - SirSaleh
    FYI: 更新了格式。在Markdown中,文件名中的下划线没有使用反引号(代码块)呈现为加粗。 - Azeem

    7

    我已经将我的测试类重命名为Test_forum。但这并没有帮助到我。 - user441495
    不要重命名类,而是重命名方法。它可能区分大小写,所以请尝试test_forum。 - Alasdair

    5

    您需要将其命名为tests.py


    我将test.py重命名为tests.py。Eclipse已经知道这个模块是测试模块,但结果仍然是“在0.000秒内运行了0个测试”。 - user441495

    4

    在搜寻一段时间后,我并没有发现有人提出过这个建议,所以我会将其作为一个晚到的答案分享。 在我的情况下,我的manage.py文件位于根目录中,例如:

    .
    ...
    ├── dir
    │   ├── project_name
    │   ├── manage.py
    │   ├── media
    │   ├── app1
    │   ├── static
    │   ├── staticfiles
    │   ├── templates
    │   └── app2
    ...
    

    我发现测试命令提供了选项来指定要运行测试的项目。在我的情况下,我需要这样做:

    python project_name/manage.py test ./project_name/
    

    这成功地运行了我的测试。


    3
    如果将文件重命名为tests.py后仍然得到相同的结果,则存在一些问题。您是如何运行测试的?您是从命令行运行还是使用Eclipse设置了自定义运行目标?如果您还没有尝试过,请从命令行运行它。
    此外,启动Django shell(python manage.py shell)并导入您的测试模块。
    from MyProj.forum.tests import SimpleTest
    

    导入是否正常工作?


    我尝试了 "python manage.py shell" 和 "from MyProj.forum.tests import Test_forum"(我重命名了测试类),但它没有起作用。但是 "import MyProj.forum.tests" 和 "from MyProj.forum.tests import *" 没有出现错误。 - user441495
    看起来好像出了点问题。尝试这样做:from MyProj.forum import tests 然后执行 dir(tests) 命令,看看你的类名是否出现在 dir 命令的输出中。 - Manoj Govindan
    正如预期的那样:<code> >>> dir(tests) ['builtins', 'doc', 'file', 'name', 'package', 'path'] </code> 因此,在tests.py中没有我的测试类。 我错过了什么? - user441495
    这很有趣:列表中没有 Test_forum。在我看来,你的目录中有一个名为 tests 的文件夹。这就解释了为什么 from MyProj.forum.tests import Test_forum 失败,但 import MyProj.forum.tests 成功。你能检查一下是否是这种情况吗? - Manoj Govindan
    是的,你是对的。我首先尝试使用nose和urllib / urllib2测试我的应用程序,为此我创建了一个名为tests的package。后来我删除了这个package,django测试工具在tests.py文件中找到了我的测试类。谢谢你,Manoj Govindan。你救了我! - user441495

    3

    我尝试了所有这些方法,但是我忘记在我创建的用于保存所有测试的测试目录中添加__init__.py文件,因此Django找不到它。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接