当我运行测试时,django 运行 0 个测试。这是我的项目结构:
manage.py
- app/
- main_app/
- test/
- tests_v1.py
- tests_v2.py
Run Code Online (Sandbox Code Playgroud)
我使用这个命令:
python manage.py test --pattern="tests_v*.py"
Run Code Online (Sandbox Code Playgroud)
Django 在 0 秒内运行 0 个测试。我错过了什么?
运行pytest时出现此错误。我正在关注本教程:https : //channels.readthedocs.io/en/latest/topics/testing.html
django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
Run Code Online (Sandbox Code Playgroud)
以下是我尝试过的事情:
将以下代码放在测试脚本的顶部
ROOT_DIR = 环境.路径(文件)- 2
env = 环境.Env()
env_file = str(ROOT_DIR.path('.env'))
env.read_env(env_file)
我可以通过我的网络浏览器 ( http://127.0.0.1:8983/solr)访问本地地址以查看 Solr 管理员(搜索 web 应用程序)。
但是,通过 Django (1.7) 测试客户端,我得到:
Run Code Online (Sandbox Code Playgroud)>>> from django.test import Client >>> c = Client() >>> response = c.get('http://127.0.0.1:8983/solr') >>> response.status_code 404
为什么 Django 不能连接到与我的浏览器相同的地址?
我真的很享受 Django 1.8 中 setUpTestData 和 --keepdb 的便利!
但是,我遇到了在多个测试文件中保持数据一致的问题。我想将我的 setUpTestData 类方法放在一个位置,并让我的每个测试文件都引用它,这样我就不必将更改复制/粘贴到每个单独的测试文件中。
我对如何解决这个问题有点困惑,特别是关于 classmethod 似乎阻止我从另一个文件导入我的 setUpTestData 函数。有人能帮我吗?先谢谢了!
当前测试文件
from django.test import TestCase
from models import SpecificModel
class TestData(TestCase):
@classmethod
def setUpTestData(cls):
cls.test_item = SpecificModel.objects.create(data="some data")
Run Code Online (Sandbox Code Playgroud)
设置数据文件
???
Run Code Online (Sandbox Code Playgroud) 我已经被这个问题困扰了几个小时。我是 django 和自动化测试的新手,我一直在使用 Selenium 和 django 的 StaticLiveServerTestCase。我一直在尝试测试我的登录表单(顺便说一句,当我使用 runserver 并自己测试它时,它工作得很好。)
一切工作都很好,除了我似乎无法成功登录我的测试用户。我已将断点范围缩小到 django 的 User.authenticate 方法。
User 对象在我的设置中已成功创建,我可以通过在测试方法中访问它的属性来确认这一点。但是,身份验证失败。
我查看了以下内容以寻求帮助,但他们并没有让我走得太远:
知道为什么身份验证失败吗?我需要在设置中添加一些内容吗?
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from django.contrib.auth.models import User
from django.contrib.auth import authenticate
class AccountTestCase(StaticLiveServerTestCase):
def setUp(self):
self.selenium = webdriver.Chrome()
super().setUp()
User.objects.create(username='test', email='test@test.com', password='Test1234', is_active=True)
def tearDownClass(self):
self.selenium.quit()
super().tearDown()
def test_register(self):
user = authenticate(username='test', password='Test1234')
if user is not None: # prints Backend login failed
print("Backend login …Run Code Online (Sandbox Code Playgroud) 我正在做一个测试来检查文件的内容,csv使用assertContains():
response = client.get('/abc/1/a_b_csv')
print(response.content)
self.assertContains(response.content, 'aakash')
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的选项,self.assertContains(response,'aakash')
但没有得到任何结果。
我的 csv 文件看起来像,
Name Age
Aakash 22
Run Code Online (Sandbox Code Playgroud)
有时会出现这样的错误:
bName\r\nVipul\r\n'
E
======================================================================
ERROR: test_csv (timepay.new_test.ReportTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/aakash/Projects/test.py", line 28, in test_csv
self.assertNotContains(response.content, 'Vipul')
File "/home/aakash/Projects/project_env/lib/python3.6/site-packages/django/test/testcases.py", line 402, in assertNotContains
response, text, status_code, msg_prefix, html)
File "/home/vipul/Projects/project_env/lib/python3.6/site-packages/django/test/testcases.py", line 355, in _assert_contains
response.status_code, status_code,
AttributeError: 'bytes' object has no attribute 'status_code'
Run Code Online (Sandbox Code Playgroud) 我目前正在编写一个测试来测试我的获取请求,获取请求需要标头中的 jwt access_token,我使用 django-rest-framework-simplejwt 来获取令牌并将其用作默认身份验证类
设置.py:
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAdminUser',
],
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
# 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
Run Code Online (Sandbox Code Playgroud)
我的 test_api.py:
from rest_framework.test import APITestCase
from rest_framework import status
from rest_framework.test import APIClient
from django.urls import reverse
from listing.models import Property
from backend.models import User
class PropertyTestCase(APITestCase):
def setUp(self):
property_1 = Property.objects.create(title="test", size=322.00, price=8000000, price_rent=300000, price_per_square_meter=500000, price_rent_per_square_meter=20000, description="description 1", type="sell", category="category 1", address="address 1", …Run Code Online (Sandbox Code Playgroud) 我正在尝试测试 django 表单视图:
测试.py
form_data = {
'comment_text': "test comment"
}
response = self.client.post(reverse('announcements:comment', args=[self.test_announcement.id]), form_data)
self.assertEqual(response.status_code, 404) # invalid submit button
Run Code Online (Sandbox Code Playgroud)
但我的视图会检查使用哪个按钮来提交表单:
视图.py
def my_view(request, announcement_id):
# ...
if request.method == "POST":
form = CommentForm(request.POST)
if form.is_valid():
# ...
if 'comment_button' in request.POST:
# how do I get inside this branch from a test?
# process form
else:
raise Http404
Run Code Online (Sandbox Code Playgroud)
我如何模仿在测试中用于提交表单的“comment_button”?
我正在学习如何对 Django 中间件进行单元测试。
process_request()在“旧式”中间件中,加载用于测试结果的中间件非常容易。例如
def test_session(self):
request = self.factory.get('/')
session_middleware = SessionMiddleware()
session_middleware.process_request(request)
// Do stuff
Run Code Online (Sandbox Code Playgroud)
然而,在“新风格”中,这并不存在。例如,我将如何测试Django 文档提供的以下示例?
class TimezoneMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
tzname = request.session.get('django_timezone')
if tzname:
timezone.activate(pytz.timezone(tzname))
else:
timezone.deactivate()
return self.get_response(request)
Run Code Online (Sandbox Code Playgroud)
使用TimezoneMiddleware(request)会调用__init__但不会调用__call__?
我的 Django 代码库中有一个常见的装饰器调用:
@override_settings(
CACHES={
**settings.CACHES,
"default": generate_cache("default", dummy=False),
"throttling": generate_cache("throttling", dummy=False),
}
)
def test_something():
...
Run Code Online (Sandbox Code Playgroud)
装饰器代码太冗长。我很乐意将此代码包装到一个名为 的新装饰器中@use_real_cache,以便测试函数看起来更清晰:
@use_real_cache
def test_something():
...
Run Code Online (Sandbox Code Playgroud)
如何用另一个装饰器包装一个装饰器?
django ×10
django-tests ×10
python ×5
django-cache ×1
django-views ×1
jwt ×1
pytest ×1
selenium ×1
testing ×1