我安装了django-nose 1.0作为Django 1.3.1项目的测试运行器.我正在按照pypi页面上关于仅测试模型的说明进行操作.
这是我的settings.py testrunner配置:
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
我使用这个testrunner进行了几个月的测试没有问题.现在我正在尝试测试一个抽象类,并且我使用的是仅测试模型,但是我编写的特定测试会引发错误.
根据文档,我只需要将测试类包含在测试期间导入的其中一个文件中.我把测试放在'tests'文件夹中,并分成几个较小的测试文件.这是我的tests/model_tests.py(出于工作原因故意重命名的模型和应用程序):
from django.tests import TestCase
from myapp.models import AbstractFoo
class Foo(AbstractFoo):
pass
class TestFoo(TestCase):
def setUp(self):
self.foo = Foo.objects.create(name="Tester",
description="This is a test", ...)
... [tests follow]
Run Code Online (Sandbox Code Playgroud)
我在setUp的第一行收到错误:
DatabaseError: relation "tests_foo" does not exist
LINE 1: INSERT INTO "tests_foo" ("name", "description", "display...
Run Code Online (Sandbox Code Playgroud)
如果我在测试中放置一个断点并检查数据库,则表'tests_foo'(或名称中包含'foo'的表)不存在.
关于为什么仅测试模型没有加载的任何想法?
我在运行django-nose时遇到了麻烦.
根据安装说明,我通过以下方式安装:
pip install django-nose'django_nose'到INSTALLED_APPSsettings.py中(包括作为最后一个应用程序,以防可能的应用程序订单问题)TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'到settings.py当我运行测试即manage.py test,我得到:
django.db.utils.DatabaseError: no such table: django_content_type
Run Code Online (Sandbox Code Playgroud)
我想我需要同步数据库.我在用南方.当我使用时manage.py syncdb,django_nose不会显示在同步应用列表中,也不会显示"未同步(使用迁移)"应用列表.
最后,当我尝试与南方同步时,即manage.py schemamigration django_nose --initial,我得到:
django.core.exceptions.ImproperlyConfigured: App with label django_nose is missing a models.py module.
Run Code Online (Sandbox Code Playgroud)
我在一个virtualenv中安装了Django 1.4和South版本0.7.5.
我究竟做错了什么?如果没有,我该如何调试此安装问题?
非常类似于lafagundes关于南迁移调试日志记录的问题,除了我没有使用南 - 我正在使用普通的Django 1.7迁移.我也在使用django-nose测试跑步者.
当我运行时manage.py test,没有捕获调试日志记录输出:
(codesy)lcrouch:codesy lcrouch$ ./manage.py test
nosetests --verbosity=1
Creating test database for alias 'default'...
......E...............................
======================================================================
ERROR: test_return_state (auctions.tests.utils_tests.IssueStateTest)
----------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
例如,当我运行单个测试模块时,./manage.py test auctions.tests.utils_tests调试日志记录输出包括django.db.backends.schema: DEBUGDjango迁移中涉及的所有行:
(codesy)lcrouch:codesy lcrouch$ ./manage.py test auctions.tests.utils_tests
nosetests auctions.tests.utils_tests --verbosity=1
Creating test database for alias 'default'...
E
======================================================================
ERROR: test_return_state (auctions.tests.utils_tests.IssueStateTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/lcrouch/code/codesy/codesy/auctions/tests/utils_tests.py", line 13, in test_return_state
fake_gh_client = fudge.Fake(github_client).returns_fake().provides('get_repo').returns_fake().provides('get_issue').returns_fake().has_attr(state='open')
File "/Users/lcrouch/python/codesy/lib/python2.7/site-packages/fudge/__init__.py", line 1133, in returns_fake
exp = …Run Code Online (Sandbox Code Playgroud) 我正在Django网站(此处提供代码)上运行简单的鼻子测试。根据发出CLI命令的顺序,我会得到截然不同的结果!
查看许多帖子,这似乎与覆盖过程开始于加载过程有关。我不明白的是:
我正在专注于 minerals/views.py
Django settings.py文件包含配置信息:
# Use nose to run all tests
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
# Nose will measure coverage on the folllowing apps
NOSE_ARGS = [
'--with-coverage',
'--cover-package=minerals',
'--cover-html',
]
Run Code Online (Sandbox Code Playgroud)
我使用virtualenv需求文件在具有Python 3.5.1的Ubuntu 14.04LTS上运行:
coverage==4.1
Django==1.9.6
django-debug-toolbar==1.4
django-nose==1.4.3
nose==1.3.7
sqlparse==0.1.19
Run Code Online (Sandbox Code Playgroud)
当我使用运行测试coverage run --source '.' manage.py test minerals,然后minerals/views.py是缺少声明:12-13,18-49。
$ coverage run --source '.' manage.py test minerals
nosetests minerals --with-coverage --cover-package=minerals --cover-html --verbosity=1
Creating test database for alias 'default'... …Run Code Online (Sandbox Code Playgroud) 使用override_settings装饰器时,我的行为有些奇怪。当我单独运行测试时,它基本上可以工作,但是如果运行整个测试套件,则无法工作。
在此测试中,我更改了REST_FRAMEWORK选项,因为在运行此套件时,我想设置身份验证设置,而其他测试则不使用身份验证:
@override_settings(REST_FRAMEWORK=AUTH_REST_FRAMEWORK)
class AuthTestCase(TestCase):
@classmethod
def setUpClass(cls):
super(AuthTestCase, cls).setUpClass()
cls.client = Client()
def test_i_need_login(self):
response = client.get('/')
self.assertEqual(response.status_code, 401)
Run Code Online (Sandbox Code Playgroud)
所以如果我...
$ python manage.py test myapp/tests/test_auth.py
设置已应用且效果很好!
但是如果像这样运行整个测试套件:
$ python manage.py test
测试将失败。在我看来,这些设置(或某些对象)正在从其他测试中缓存。我在另一个以类似方式使用Client实例的测试文件中还有另一个类。
环境:
Python: 2.7
Django: 1.10
编辑:
我发现此问题的解决方法是使用查找来运行测试,它可以是别名或具有...的脚本。
find . -name 'test*.py' -exec python manage.py test {} \;
缺点是许多测试的输出堆积在屏幕上,并且可能会多次创建/销毁测试数据库。除非您使用django-nose将选项添加到REUSE_DB之类的命令中。
python django unit-testing django-nose django-rest-framework
我正在使用django-nose在django(1.4)中运行我的单元测试.
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
Run Code Online (Sandbox Code Playgroud)
创建数据库需要很长时间.
所以我发现把它放在settings.py中:
os.environ['REUSE_DB'] = "1"
Run Code Online (Sandbox Code Playgroud)
应该做的伎俩.
实际上django itsellve给出了这个建议:
To reuse old database "<path not very interesting>/var/sqlite/unittest.db" for speed, set env var REUSE_DB=1.
Run Code Online (Sandbox Code Playgroud)
当然,您需要使用此标志= 0运行一次(或在每次数据库更改后)
但是,当您将标志设置为0时,我的测试以注释结束:
Destroying test database for alias 'default'...
Run Code Online (Sandbox Code Playgroud)
因此,当我想重复运行它时......没有什么可以重用...而且我会得到错误,表示该表不存在
DatabaseError: no such table: <and than a table name>
Run Code Online (Sandbox Code Playgroud)
将reuse_db设置为0时,测试运行完美
我在我的开发设置中使用测试数据库别名:
DATABASES = {
'default': {
'NAME': os.path.join(BUILDOUT_DIR, 'var', 'sqlite', 'development.db'),
'TEST_NAME': os.path.join(BUILDOUT_DIR, 'var', 'sqlite', 'unittest.db'),
'ENGINE': 'django.db.backends.sqlite3',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
}
Run Code Online (Sandbox Code Playgroud)
我没有使用内存中的sqllite数据库进行测试,因为我读到某个地方这对django-nose不起作用.
那么如何在最终销毁数据库时重用数据库...
根据这个https://docs.djangoproject.com/en/1.4/topics/testing/#the-test-database django这样做,但它没有显示如何防止这种情况(如果我可以),或者如何使用reuse_db选项.我应该使用其他设置吗?
我很难摆脱django_nose.FastFixtureTestCaseto django.test.TestCase(甚至更保守的django.test.TransactionTestCase)。我正在使用 Django 1.7.11,并针对 Postgres 9.2 进行测试。
我有一个Testcase加载三个灯具文件的类。该课程包含两个测试。如果我将每个测试作为单次运行单独运行 ( manage test test_file:TestClass.test_name),那么它们都会起作用。如果我一起运行它们,( manage test test_file:TestClass),我得到
IntegrityError: Problem installing fixture '<path>/data.json': Could not load <app>.<Model>(pk=1): duplicate key value violates unique constraint "<app_model_field>_49810fc21046d2e2_uniq"
Run Code Online (Sandbox Code Playgroud)
对我来说,数据库实际上并没有在测试之间刷新或回滚,因为它只在我单次运行测试时发生。
我已经单步执行了 Django 代码,看起来它们正在被刷新或回滚——这取决于我是在尝试还是TestCase在TransactionTestCase.
FastFixtureTestCase(由于https://github.com/django-nose/django-nose/issues/220我要离开)
我还应该看什么?这看起来应该是一件简单的事情,并且符合django.test.TestCase和 的Django.test.TransactionTestCase设计目的。
编辑:
测试类或多或少看起来像这样:
class MyTest(django.test.TransactionTestCase): # or django.test.TestCase
fixtures = ['data1.json', 'data2.json', 'data3.json']
def test1(self):
return # I simplified it to …Run Code Online (Sandbox Code Playgroud) 我正在使用django-nose运行我的测试,我需要知道它们何时从我的视图/模型方法/等中运行,所以我可以跳过诸如检查缓存值或调用一些项目外部资源之类的东西,例如仅在运行测试时.
有一些环境变量可用或类似的东西会很好,所以我可以这样做:
if os.environ.get('TESTS_ARE_RUNNING'):
# skip this
Run Code Online (Sandbox Code Playgroud)
要么
if not TESTS_ARE_RUNNING:
# do something
Run Code Online (Sandbox Code Playgroud)
有人知道实现这个目标的方法吗?
在此先感谢任何帮助:)
尝试使用django-nose运行单个TestCase时出错
$ ./manage.py test someapp.ModelTest
nosetests someapp.ModelTest --nologcapture --verbosity=1
Creating test database for alias 'default'...
E
======================================================================
ERROR: Failure: AttributeError ('module' object has no attribute 'ModelTest')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/nose/loader.py", line 402, in loadTestsFromName
module = resolve_name(addr.module)
File "/usr/lib/python2.7/site-packages/nose/util.py", line 321, in resolve_name
obj = getattr(obj, part)
AttributeError: 'module' object has no attribute 'ModelTest'
----------------------------------------------------------------------
Ran 1 test in 0.003s
FAILED (errors=1)
Run Code Online (Sandbox Code Playgroud)
请注意,当我$ ./manage.py test someapp成功运行它时,运行someapp/tests.py中的所有TestCase; 只有在尝试运行单个TestCase时才会失败.
我们有一个 django 项目,它使用unittest-xml-reporting为竹子提供有关测试结果的 xml 文件。我们想集成django-nose来测试代码覆盖率。但是由于 django 测试需要一个TEST_RUNNER类,我不知道如何并行使用这两个功能(实际上不重叠):
用于 unittest-xml-reporting
TEST_RUNNER = 'xmlrunner.extra.djangotestrunner.XMLTestRunner'
Run Code Online (Sandbox Code Playgroud)
对于 django-nose
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
Run Code Online (Sandbox Code Playgroud)
我试图进入代码,但编写某种黑客来将类连接在一起似乎很麻烦。还剩下什么选择?
在virtualenv中安装的Django-nose在运行默认服务器时在runner.py中给出了"ImportError:无法导入名称设置".做追溯我得到这个:
File "/home/sid/.virtualenvs/workbench/local/lib/python2.7/site-packages/django/core/management/base.py", line 222, in run_from_argv
self.execute(*args, **options.__dict__)
File "/home/sid/.virtualenvs/workbench/local/lib/python2.7/site-packages/django/core/management/base.py", line 250, in execute
translation.activate('en-us')
File "/home/sid/.virtualenvs/workbench/local/lib/python2.7/site-packages/django/utils/translation/__init__.py", line 90, in activate
return _trans.activate(language)
File "/home/sid/.virtualenvs/workbench/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 183, in activate
_active.value = translation(language)
File "/home/sid/.virtualenvs/workbench/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 172, in translation
default_translation = _fetch(settings.LANGUAGE_CODE)
File "/home/sid/.virtualenvs/workbench/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 154, in _fetch
app = import_module(appname)
File "/home/sid/.virtualenvs/workbench/local/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
__import__(name)
File "/home/sid/.virtualenvs/workbench/local/lib/python2.7/site-packages/django_nose/__init__.py", line 5, in <module>
from django_nose.runner import BasicNoseRunner, NoseTestSuiteRunner
File "/home/sid/.virtualenvs/workbench/local/lib/python2.7/site-packages/django_nose/runner.py", line 19, in <module>
from django import setup
ImportError: …Run Code Online (Sandbox Code Playgroud) 我一直听到人们说测试应该如何简单,可维护,直截了当,但是在单元测试中代码重用性会发生什么?
我们举个例子:
def test_some_1():
...some code
def test_some_2():
...code repeated from test_some_1
Run Code Online (Sandbox Code Playgroud)
将两个测试中重复的代码封装在一个包含必要断言的函数中是不是最好?
我和一些程序员争论过这个并且他们不同意,他们说测试应该是愚蠢的,代码重用性在这里并不好.这样做的原因是因为在django控制台中断言实际上失败了并不是很清楚,因为断言是在函数中,虽然我不同意,因为使用它与鼻子会给你测试的名称和追溯,虽然这些家伙再次不同意,说明可以在没有鼻子的情况下单独调用测试(因此你无法看到所有这些细节).
你们有什么感想?
我遵循这个复数课程,每次运行命令时都会遇到这个错误:
python manage.py test --settings=todobackend.settings.test
Run Code Online (Sandbox Code Playgroud)
我是 Django 框架的新手;问题可能是我的 django 版本(1.9.0)只支持 python 3.x 而不是 2.x?
python --version
Python 2.7.13
Run Code Online (Sandbox Code Playgroud)
点击图片查看更大、更清晰的图像。
django-nose ×13
django ×12
python ×6
nose ×5
unit-testing ×4
code-reuse ×1
coverage.py ×1
junit ×1
python-2.7 ×1
python-3.x ×1
testing ×1