标签: django-tests

Django 测试数据库不自动刷新

我有一堆单元测试文件,所有这些文件都由 django.test.TestCase 类组成。

自己写了一个小 shell 脚本来取消注释/注释我的 __init__.py 文件中的测试文件导入,因此我可以根据我提供的命令行参数从某些测试文件运行测试。我还能够一次性运行所有测试文件的所有测试(用于回归测试)。

我有一个包含一些 JSON 固定装置的测试文件,第一个测试检查某个模型/表中是否有 3 条记录(由 JSON 固定装置定义)。

所以问题来了:当我自己运行这个测试文件时,它的测试以优异的成绩通过,但是当我用所有其他测试运行测试时,我提到的那个特定的测试用例失败了。

当我运行所有测试时,数据库说表/模型中有 6 条记录,但应该只有 3 条(来自夹具),就像测试文件本身运行时一样。

我还尝试使用其他一些测试文件(不是全部)运行该测试文件,并且它通过了。所以唯一没有的时候,是当所有测试文件都运行时。

对我来说,这似乎是 Django 或 PostgreSQL(我正在使用的数据库)中的一个错误,因为 Django TestCases 不应该在每个测试方法之间自动刷新/重置数据库,更不用说测试类了?

testing django testcase autoflush django-tests

7
推荐指数
1
解决办法
1286
查看次数

Django UnitTest - 设置会话变量

我有一个基于 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)

django django-testing django-tests

7
推荐指数
1
解决办法
1533
查看次数

Django 测试 client.get() 返回 302 代码而不是 200

在 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=Trueclient.get()我会按预期收到 200 个代码。

django django-urls django-tests

7
推荐指数
1
解决办法
2773
查看次数

如何在 Django 中正确使用 assertRaises

我的模型中有以下验证功能:

@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

7
推荐指数
2
解决办法
6033
查看次数

如何在 django TestCase 中使用 pytest 固定装置

如何在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)

python django pytest django-tests pytest-django

7
推荐指数
2
解决办法
1140
查看次数

如何测试自定义的python-social-auth管道?

因此,我创建了一个自定义管道,用于保存从模型extra_data属性获取的用户社交个人资料数据user.social_auth.我已经彻底测试了它,但手动.

  1. 如何使用常规自动化测试我的自定义管道django.test.TestCase

  2. 如何测试正常管道是否有效?用户注册,登录等?

我做了很多搜索,但没有发现任何相关的类似问题,更不用说教程或文档了.

更新 - 我在github上将问题发布为问题,并发现管道测试的功能存在.现在我只需要弄清楚如何将它用于我的目的.

python django django-testing django-tests python-social-auth

6
推荐指数
1
解决办法
1276
查看次数

Django测试:--keepdb重置测试期间所做的更改吗?

根据有关测试的Django文档,该--keepdb标志将保留测试数据库以供将来运行.

https://docs.djangoproject.com/en/1.8/ref/django-admin/#django-admin-option---keepdb

为了清楚起见,测试(即:)的数据库是否object.save()会自动重置?或者这些变化是否需要在测试中反过来?

django django-testing django-tests

6
推荐指数
1
解决办法
3351
查看次数

如何在 Django 中使用 python manage.py test 命令运行所有测试

我正在开发一个 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)

python django unit-testing django-tests

6
推荐指数
1
解决办法
2万
查看次数

无法同步调用Django测试中的芹菜任务

我想在我的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.

python django celery django-tests

6
推荐指数
1
解决办法
929
查看次数

Django 3.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_asyncdatabase_sync_to_async但这并没有改变任何东西。

我怎样才能解决这个问题?

django django-tests python-asyncio django-channels asgi

6
推荐指数
1
解决办法
1998
查看次数