我有一堆单元测试文件,所有这些文件都由 django.test.TestCase 类组成。
自己写了一个小 shell 脚本来取消注释/注释我的 __init__.py 文件中的测试文件导入,因此我可以根据我提供的命令行参数从某些测试文件运行测试。我还能够一次性运行所有测试文件的所有测试(用于回归测试)。
我有一个包含一些 JSON 固定装置的测试文件,第一个测试检查某个模型/表中是否有 3 条记录(由 JSON 固定装置定义)。
所以问题来了:当我自己运行这个测试文件时,它的测试以优异的成绩通过,但是当我用所有其他测试运行测试时,我提到的那个特定的测试用例失败了。
当我运行所有测试时,数据库说表/模型中有 6 条记录,但应该只有 3 条(来自夹具),就像测试文件本身运行时一样。
我还尝试使用其他一些测试文件(不是全部)运行该测试文件,并且它通过了。所以唯一没有的时候,是当所有测试文件都运行时。
对我来说,这似乎是 Django 或 PostgreSQL(我正在使用的数据库)中的一个错误,因为 Django TestCases 不应该在每个测试方法之间自动刷新/重置数据库,更不用说测试类了?
我有一个基于 django_webtest.WebTest 的 Django 单元测试类,我找不到在测试期间设置会话变量的正确方法。我已经尝试了以下,但我不工作
from django_webtest import WebTest
class TestMyTests(WebTest):
def test_my_tesst(self):
...
self.app.session['var1'] = 'val1'
...
Run Code Online (Sandbox Code Playgroud) 在 url 上运行测试返回 302 而不是 200。然而在生产中使用重定向测试器测试相同的 url 返回 200。不确定发生了什么。
测试.py
def test_detail(self):
response = self.client.get('/p/myproduct-detail.html')
self.assertEqual(response.status_code, 200)
Run Code Online (Sandbox Code Playgroud)
网址.py
url(r'^p/(?P<slug>[-\w\d]+).html$', main.views.product_detail,
name='product-detail'),
Run Code Online (Sandbox Code Playgroud)
视图.py
def product_detail(request, slug):
stuff...
return render(request, 'product-detail.html', {})
Run Code Online (Sandbox Code Playgroud)
如果我添加follow=True到client.get()我会按预期收到 200 个代码。
我的模型中有以下验证功能:
@classmethod
def validate_kind(cls, kind):
if kind == 'test':
raise ValidationError("Invalid question kind")
Run Code Online (Sandbox Code Playgroud)
我正在尝试如下测试:
w = Model.objects.get(id=1)
self.assertRaises(ValidationError, w.validate_kind('test'),msg='Invalid question kind')
Run Code Online (Sandbox Code Playgroud)
我也试过:
self.assertRaisesRegex(w.validate_kind('test'),'Invalid question kind')
Run Code Online (Sandbox Code Playgroud)
这两个都不能正常工作。我究竟做错了什么?
django django-testing django-errors python-unittest django-tests
如何在TestCase方法中使用 pytest 固定装置?类似问题的几个答案似乎暗示我的例子应该有效:
import pytest
from django.test import TestCase
from myapp.models import Category
pytestmark = pytest.mark.django_db
@pytest.fixture
def category():
return Category.objects.create()
class MyappTests(TestCase):
def test1(self, category):
assert isinstance(category, Category)
Run Code Online (Sandbox Code Playgroud)
但这总是会导致错误:
TypeError: test1() missing 1 required positional argument: 'category'
Run Code Online (Sandbox Code Playgroud)
我意识到我可以将这个简单的例子转换成一个函数,它会起作用。我更喜欢使用 django,TestCase因为它支持导入传统的“django fixture”文件,这是我的几个测试所需要的。将我的测试转换为函数需要重新实现这个逻辑,因为没有记录的方式使用 pytest(或 pytest-django)导入“django 固定装置”。
包版本:
Django==3.1.2
pytest==6.1.1
pytest-django==4.1.0
Run Code Online (Sandbox Code Playgroud) 因此,我创建了一个自定义管道,用于保存从模型extra_data属性获取的用户社交个人资料数据user.social_auth.我已经彻底测试了它,但手动.
如何使用常规自动化测试我的自定义管道django.test.TestCase?
如何测试正常管道是否有效?用户注册,登录等?
我做了很多搜索,但没有发现任何相关的类似问题,更不用说教程或文档了.
python django django-testing django-tests python-social-auth
根据有关测试的Django文档,该--keepdb标志将保留测试数据库以供将来运行.
https://docs.djangoproject.com/en/1.8/ref/django-admin/#django-admin-option---keepdb
为了清楚起见,测试(即:)的数据库是否object.save()会自动重置?或者这些变化是否需要在测试中反过来?
我正在开发一个 django 项目,其中有多个应用程序。每个应用程序都有一个测试目录,其中包含对整个项目的测试。我的目录结构如下。
Project
App_1
tests
__init__.py
tests_views.py
App_2
tests
__init__.py
tests_views.py
settings.py
manage.py
Run Code Online (Sandbox Code Playgroud)
我可以运行这样的测试
python manage.py test App_1.tests
在 App_1/tests/test_views.py 中运行所有测试。但是我必须为我项目中的所有应用程序执行此操作。我想要一个命令来运行我项目中所有应用程序中的所有测试。我试过运行
python manage.py 测试
但我遇到了以下错误
Traceback (most recent call last):
File "manage.py", line 9, in <module>
execute_from_command_line(sys.argv)
File "/srv/www/project/shared/env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
utility.execute()
File "/srv/www/project/shared/env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 330, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/srv/www/project/shared/env/local/lib/python2.7/site-packages/django/core/management/commands/test.py", line 30, in run_from_argv
super(Command, self).run_from_argv(argv)
File "/srv/www/project/shared/env/local/lib/python2.7/site-packages/django/core/management/base.py", line 390, in run_from_argv
self.execute(*args, **cmd_options)
File "/srv/www/project/shared/env/local/lib/python2.7/site-packages/django/core/management/commands/test.py", line 74, in execute
super(Command, self).execute(*args, **options)
File "/srv/www/project/shared/env/local/lib/python2.7/site-packages/django/core/management/base.py", line …Run Code Online (Sandbox Code Playgroud) 我想在我的Django测试期间同步调用芹菜任务而不需要运行芹菜工作者.为了达到这个目的,我CELERY_ALWAYS_EAGER=True在settings.py中指定但它似乎不起作用.所以我决定将override_settings装饰器应用于看起来像这样的特定测试
@override_settings(CELERY_ALWAYS_EAGER=True, BROKER_BACKEND='memory',
CELERY_EAGER_PROPAGATES_EXCEPTIONS=True)
def test_foo(self):
...
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个测试仍然在我的芹菜工作者中调用任务.我可以缺少什么?具体来说,我正在使用Django 1.10和Celery 4.0.0.
我在异步代码中使用 Django ORM。一切正常,所有测试都通过。但是,测试后数据库连接无法正确关闭。这是一个例子:
from asgiref.sync import sync_to_async, async_to_sync
@sync_to_async
def count_books():
return Book.objects.count()
class FooTest(TestCase):
def setUp(self):
Book.objects.create(title='Haha')
def test1(self):
import asyncio
c = asyncio.run(count_books())
self.assertEqual(1, c)
def test2(self):
c = async_to_sync(count_books)()
self.assertEqual(1, c)
Run Code Online (Sandbox Code Playgroud)
Postgres 错误:
django.db.utils.OperationalError: database "test_mydbname" is being accessed by other users
Run Code Online (Sandbox Code Playgroud)
SQLite 错误:
sqlite3.OperationalError: database table is locked: test_mydbname
Run Code Online (Sandbox Code Playgroud)
我尝试过从 django-channels 进行交换sync_to_async,database_sync_to_async但这并没有改变任何东西。
我怎样才能解决这个问题?
django ×10
django-tests ×10
python ×4
asgi ×1
autoflush ×1
celery ×1
django-urls ×1
pytest ×1
testcase ×1
testing ×1
unit-testing ×1