Django测试运行程序未找到测试


77

我是Python和Django的新手,我正在通过创建饮食管理网站来学习,但是我因运行单元测试而被彻底击败。我发现的所有文档和博客都说,只要可以从tests.py中发现它们,tests.py与models.py以及您的测试类的子类TestCase都位于同一文件夹中,则它们都应该自动被拾取。这对我manage.py test <myapp>不起作用,运行时找不到任何测试。

我将所有测试放在他们自己的程序包中,但是将其简化为仅包含在我的tests.py文件中的所有测试。当前的tests.py看起来像:

import unittest
from pyDietTracker.models import Weight
from pyDietTracker.weight.DisplayDataAdapters import DisplayWeight

class TestDisplayWeight(unittest.TestCase):

    def setUp(self):
        pass

    def tearDown(self):
        pass

    def testGetWeightInStone_KG_Correctly_Converted(self):
        weight = Weight()
        weight.weight = 99.8

        testAdapter = DisplayWeight(weight)
        self.assertEquals(testAdapter.GetWeightInStone(), '15 st 10 lb')   

我也通过子类化Django TestCase类进行了尝试,但这也不起作用。我正在使用Django 1.1.1,Python 2.6,并且正在运行Snow Leopard。

我确定我缺少一些非常基本和显而易见的东西,但是我无法解决。有任何想法吗?

编辑:评论后只是快速更新

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.admin',
'pyDietTracker',
 )

要运行测试,我正在运行 manage.py test pyDietTracker


您正在运行什么命令来执行这些命令?你settings长什么样 该应用程序是否在INSTALLED_APPS列表中?
S.Lott 2010年

我已使用INSTALLED_APPS更新了问题,设置的另一部分是否相关?谢谢

您实际上收到什么消息?
S.Lott 2010年

我没有收到错误消息,只是说运行0次测试。我远离计算机的atm,但是当我尝试直接命名测试类时,由于没有合适的测试用例而出现错误。我会在回来时准确地发布它。

@ L2Type:您不能轻松地直接命名TestCase类。你的名字的应用程序,Django的亚军看在models.py做它的发现事情,tests.py
美国洛特

Answers:


165

我有同样的问题,但是我的问题不同。

我得到的Ran 0 tests是OP。

但是事实证明,您的测试类中test测试方法必须以关键字开头才能运行

例:

from django.test import TestCase


class FooTest(TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    def this_wont_run(self):
        print 'Fail'

    def test_this_will(self):
        print 'Win'

同样,要进行测试test文件必须以keyword开头


14
如果仍然不起作用,请检查文件名是否与此模式匹配:test*.py这是django挑选测试服文件的方式。django doc
linqu

对于其他读者,使用Django的TestCase代替unittest.TestCase也是一个变化
carlosayam

84

如果您正在使用yourapp/tests包/样式进行单元测试,请确保其中包含一个__init__.py(因为这就是使它成为Python模块的原因!)。


是! :如果您使用自定义文件夹所需的应用程序运行测试(如my_apps/app_name/”,那么你应该创建__init__.py文件my_apps/

31

我可以对特定应用进行测试,例如

python project/manage.py test app_name

但是当我跑步时

python project/manage.py test

找到0个测试

找出我需要在与manage.py相同的目录中运行它

所以解决方案是,cd到项目目录并运行

python manage.py test


2
这对我有所帮助,谢谢。看来,测试运行程序会发现当前的工作目录,该目录本身必须是Python软件包(docs.djangoproject.com/en/dev/topics/testing/overview/…)。或者,您可以调用这样的测试python project/manage.py test project/
rubick

15

就我而言,应用文件夹本身缺少__init__.py。这将导致测试将与一起运行python manage.py test project.app_name但不会与一起运行的行为python manage.py test

project/
  app_name/
    __init__.py   # this was missing

1
谢谢!您帮助我找到了我的问题,那是我创建了一个文件夹“ tests”来保存测试脚本,但是却忘记了添加文件init .py
Little Brain,

这里也是:我有project/apps/core,没有__init__.pyin project/apps
abcdn

感谢您发布此内容-我创建了一个tests子文件夹,但忘了__init__.py在该方向下添加一个子文件夹。添加它就可以了!
Ezra_Bender

谢谢。长期为此问题奋斗。最后添加__init__.py到应用程序工作。最初,我只是__init__.py在tests文件夹中签入。
Pooja


11

解决了。

事实证明我已经做到了,django-admin.py startproject pyDietTracker但是还没有python manage.py startapp myApp。返回并执行此操作后,它确实按文档所述工作。看来我有很多关于阅读的知识,以及Django中的站点和应用程序之间的区别。

感谢您的帮助S.Lott和EmilStenström。我希望我能接受您的两个答案,因为它们都得到了很多帮助。

最重要的课程测试仅在应用程序级别有效,而在站点级别无效


11

就我而言,我输入def而不是class。代替

class TestDisplayWeight(TestCase): # correct!

我有

def TestDisplayWeight(TestCase): # wrong!

9

当您使用tests模块而不是时,也可能会发生这种情况tests.py。在这种情况下,您需要将所有测试类导入到__init__.py测试模块的中,例如

tests/
    __init__.py
    somemodule.py

在你的__init__.py,你现在需要导入somemodule这样的:

from .somemodule import *

1
这是我的问题,感谢您解决。问候!
dhargan '18

2
这可能有效,但是我认为这不是正确的解决方法,因为我还有另一个不需要此导入即可运行测试的python项目。
马特

那也是我的问题。非常感谢你!
dnsiv

我正在使用脚本来运行测试。几个月后又有一台新计算机,测试意外中断。这样就解决了。不知道有什么区别。也许是不同的python版本。也许是较新的Django ...
克里斯,

4

这是我刚得到的另一个:检查您的测试文件是否可执行。我的virtualbox将它们自动安装为可执行文件,因此测试发现完全错过了它们。__init__.py在有人告诉我解决问题的方法之前,我必须将它们添加到相关文件中,但是现在它们已被删除,并且不可执行,并且所有内容都_just_works。


3

当我在同一Django应用程序目录中有一个test.py文件和一个test /子目录时,就会发生这种情况。我想无论是在寻找测试模块(在test.py中)还是在测试包(在test / subdir中),都使python或测试运行程序感到困惑。


3

就我而言,我想念我的函数名称以test_开头, 以及使用以下命令运行测试时:

python manage.py test myapp

结果是:

Creating test database for alias 'default'...
System check identified no issues (0 silenced).

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK
Destroying test database for alias 'default'...

看来Django无法识别我的测试!

然后我像这样更改myproject / myapp / test.py文件:

from django.test import TestCase
# Create your tests here.
class apitest(TestCase):

    def test_email(self):
        pass
    def test_secend(self):
        pass

之后的结果是:

Creating test database for alias 'default'...
System check identified no issues (0 silenced).
..
----------------------------------------------------------------------
Ran 2 tests in 2.048s

OK
Destroying test database for alias 'default'...


1

如果要在主应用程序(例如my_app / my_app /)中运行测试,请确保已检查以下各项:

  1. 应用名称在INSTALLED_APPS中列出 settings.py
  2. 确保您的DATABASES['default']内部settings.py设置正确
  3. 该应用程序有一个models.py(即使您不使用一个,也至少需要有一个空的)

4
如果使用“ tests”文件夹,请记住在其中放置“ _ init _.py”文件。
xbello 2014年

1

参见https://docs.djangoproject.com/en/1.11/topics/testing/overview/

测试未运行的最常见原因是您的设置不正确,并且模块不在INSTALLED_APPS中。

我们用 django.test.TestCase代替unittest.TestCase。它已经Client捆绑了。

https://docs.djangoproject.com/zh-CN/1.11/topics/testing/tools/#django.test.TestCase


谢谢,我已经翻页了,我的模块在INSTALLED_APPS中

测试类中的测试方法必须以关键字test开头才能运行。
hassanzadeh.sd

0

在同一个文件中,我有两个带有SAME NAME的测试类,当然,这阻止了所有测试的运行。


0

run在测试类中创建了一个称为的方法,结果发现这是一个非常糟糕的主意。Python可以看到我想运行测试,但是无法运行。这个问题稍有不同,但是结果是相同的-似乎无法找到测试。

请注意显示以下消息: You want to run the existing test: <unittest.runner.TextTestResult run=0 errors=0 failures=0>


0

--help并查找详细信息。摇动到最大

我跑了 manage.py test --verbose并在顶部找到此调试输出:

>nosetests --with-spec --spec-color --verbose --verbosity=2

哦,看!我已经安装并忘记了nosetests。它说--verbosity=2。我发现3是最大值,并用3运行它,我发现了很多这样的东西:

nose.selector: INFO: /media/sf_C_DRIVE/Users/me/git/django/app/tests/test_processors.py is executable; skipped

那给了我正确的提示。对于具有x位设置的文件,确实存在问题。但是,由于它已经运行了一些测试,因此我被甩开了轨道-尽管它明确表示将跳过它们。无法更改位,因为我在VM中运行测试,共享Windows NTFS磁盘。因此添加--exe修复它。


0

发生了同样的问题,这是因为我的文件名中有一个-字符。我的文件名已route-tests.py更改为route_tests.py


0

如果在升级到Django 3后遇到此错误,则可能是因为该-k参数的含义更改为:

-k, --keepdb          Preserves the test DB between runs.

-k TEST_NAME_PATTERNS   Only run test methods and classes that match the pattern or substring. Can be used multiple times. Same as unittest -k option.

因此,只需更换-k--keepdb使它重新工作。


0

Django引擎搜索带有test_前缀(在文件夹内部tests)的文件和文件夹。就我而言,这是简单的解决方案。

因此,请确保签出文件/文件夹名称以它开头。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.