我是Python和Django的新手,我正在通过创建一个饮食管理网站来学习,但我已经完全失败了让我的单元测试运行。我发现的所有文档和博客都说,只要它可以从tests.py中找到,tests.py与models.py在同一个文件夹中,并且你的测试类是子类TestCase,它应该全部自动获取。这对我不起作用,当我运行manage.py test <myapp>
时,它没有找到任何测试。
我在他们自己的软件包中开始我的所有测试,但已将其简化为仅在test.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
答案 0 :(得分:135)
我有同样的问题,但我的问题不同。
我得到了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
关键字开头。
答案 1 :(得分:53)
如果您使用yourapp/tests
包/样式进行单元测试,请确保其中有__init__.py
(因为这就是使其成为Python模块的原因!)。
答案 2 :(得分:16)
我可以针对特定应用程序运行测试,例如
python project/manage.py test app_name
但是当我跑步时
python project/manage.py test
发现了0个测试
弄清楚我需要在manage.py
所在的目录中运行它所以解决方案是,cd到项目目录并运行
python manage.py test
答案 3 :(得分:11)
完成了工作。
事实证明我已完成django-admin.py startproject pyDietTracker
但未python manage.py startapp myApp
。返回并执行此操作后,它确实按照记录的方式工作。看起来我有很多东西需要学习阅读以及Django中网站和应用程序之间的区别。
感谢您的帮助S.Lott和EmilStenström。我希望我能接受你的答案,因为他们都得到了很多帮助。
最重要的课程测试仅适用于应用级别而非网站级别
答案 4 :(得分:10)
如果您在tests.py中出现语法错误,也会发生这种情况。
答案 5 :(得分:9)
就我而言,我输入 <resources>
<resource>
<directory>${project.sources}</directory>
<filtering>true</filtering>
<excludes>
<exclude>**/*.woff</exclude>
<exclude>**/*.ttf</exclude>
</excludes>
</resource>
<resource>
<directory>${project.sources}</directory>
<filtering>false</filtering>
<includes>
<include>**/*.woff</include>
<include>**/*.ttf</include>
</includes>
</resource>
</resources>
而不是def
。而不是
class
我有
class TestDisplayWeight(TestCase):
答案 6 :(得分:6)
当您使用tests
模块而不是tests.py
时,也可能会发生这种情况。在这种情况下,您需要将所有测试类导入到测试模块的__init__.py
中,例如
tests/
__init__.py
somemodule.py
在您的__init__.py
中,您现在需要像这样导入somemodule
:
from .somemodule import *
答案 7 :(得分:4)
就我而言,应用文件夹本身缺少__init__.py
。这导致测试将与python manage.py test project.app_name
一起运行,而不与python manage.py test
一起运行。
project/
app_name/
__init__.py # this was missing
答案 8 :(得分:3)
这是我刚刚拥有的另一个:检查您的测试文件是不可执行的。我的虚拟机将它们自动挂载为可执行文件,因此测试发现完全错过了它们。我不得不将它们添加到相关的__init__.py
文件中,然后才有人告诉我这个问题是什么问题,但是现在它们被删除了,不可执行的和所有的_just_works。
答案 9 :(得分:3)
当我在同一个Django应用程序目录中有一个test.py文件和一个test /子目录时,我发生了这种情况。我想我在混淆python或测试运行器是否正在寻找测试模块(在test.py中)或测试包(在test / subdir中)。
答案 10 :(得分:1)
如果您尝试在主应用中运行测试,例如my_app / my_app /,请确保检查以下内容:
settings.py
DATABASES['default']
内的settings.py
设置正确models.py
(即使你没有使用它,至少需要一个空的)答案 11 :(得分:1)
请参阅https://docs.djangoproject.com/en/1.11/topics/testing/overview/
测试未运行的最常见原因是您的设置不正确,并且您的模块不在INSTALLED_APPS中。
我们使用django.test.TestCase
代替unittest.TestCase
。它捆绑了Client
。
https://docs.djangoproject.com/en/1.11/topics/testing/tools/#django.test.TestCase
答案 12 :(得分:1)
使用此语法
python manage.py test
而不是./manage.py test
为我解决了这个问题。
答案 13 :(得分:1)
就我而言,我错过了以 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'...
答案 14 :(得分:0)
在同一个文件中,我有两个带有 SAME NAME 的测试类,当然这会阻止所有测试运行。
答案 15 :(得分:0)
我在我的测试类中创建了一个名为run
的方法,结果证明这是一个非常糟糕的主意。 Python可以看到我想运行测试,但无法进行。这个问题略有不同,但结果是一样的 - 它似乎无法找到测试。
请注意,显示以下消息:
You want to run the existing test: <unittest.runner.TextTestResult run=0 errors=0 failures=0>
答案 16 :(得分: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
可以解决此问题。
答案 17 :(得分:0)
有同样的问题,这是因为我的文件名的名称中包含-
字符。
我的文件名是route-tests.py
,并将其更改为route_tests.py
答案 18 :(得分: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
,即可使其再次正常工作。
答案 19 :(得分:0)
Django引擎搜索带有test_
前缀(在tests
文件夹内)的文件和文件夹。就我而言,这是简单的解决方案。
因此,请确保签出文件/文件夹名称以其开头。