我正在为Django中的自定义管理器编写测试套件,并希望测试大量项目.
基本上,由于组合爆炸,它需要创建数千个项目.
我需要的是一种在数据库中创建大量 django对象的方法,并将它们保留在整个测试类中,而不是重新创建它们.
我有以下代码:
class CustomConceptQuerySetTest(TestCase):
def setUp(self):
pass #make lots and lots of items.
def test_is_public(self):
pass # check if returned items in the object.public() queryset are actually "public"
def test_is_editable(self):
pass # check if returned items in the object.viewable() queryset are actually "viewable" only to certain users.
Run Code Online (Sandbox Code Playgroud)
不幸的是,setUp在每次测试之前调用,但内容在测试期间不会更改,只能读取,并且每次都是相同的.
Django有没有办法保留数据库,或者防止测试类中的回滚或破坏?
In my Django Project I have an app called 'core' which contains all my reusable model mixins / abstract models (behaviors.py), models (models.py), views (views.py) and helpers functions (utils.py):
core/
__init__.py
behaviors.py
models.py
utils.py
views.py
Run Code Online (Sandbox Code Playgroud)
I now want to write tests for these files. For models, utils and views I just wrote unit tests like I'm used to.
I'm now uncertain how I should test the abstract models contained in behaviors.py. For example, I have this model mixin:
core/
__init__.py …Run Code Online (Sandbox Code Playgroud) django unit-testing django-models django-testing django-tests
我创建了一个带可选参数的动态网址
例如,如果我的网址是www.example.com/getTest/1/
现在这1在url中是可选的,要在我使用过的视图中处理这个
def function(request, id=None):
pass
Run Code Online (Sandbox Code Playgroud)
因此,如果URL中没有id,那么该功能仍适用于我.但是在单元情况下测试时我遇到了问题.如果我使用url,因为url = reverse('yescourse:academypage_url', args=[None])它给了我错误
NoReverseMatch: Reverse for 'academypage_url' with arguments '('new', None)' and keyword arguments '{}' not found.
所以请告诉我如何在测试用例或反向中处理这些可选URL.
编辑:
url(r'^getTest/(?P<action>\w+)/(?P<id>\d*)$', 'app.views.create_edit_academypage', name='academypage_url'),
Run Code Online (Sandbox Code Playgroud) 我在功能测试中测试登录时遇到问题.我正在使用模型妈妈用密码创建一个用户调用Megan但是我的测试仍然没有通过,因为当发送信息时它会抛出并在html页面上输入错误"请输入正确的用户名和密码.请注意两者字段可能区分大小写." 所以我怀疑测试用户没有被创建或类似的东西.
功能测试:
from django.test import LiveServerTestCase
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from model_mommy import mommy
from django.contrib.auth.models import User
class NewUserTest(LiveServerTestCase):
def setUp(self):
self.user = mommy.make('User',
username='Megan',
password = 'password',
is_active = True)
self.browser = webdriver.Firefox()
self.browser.implicitly_wait(15)
def tearDown(self):
self.browser.quit()
def test_user_can_start_a_new_movement(self):
#some code
self.browser.get(self.live_server_url)
self.assertIn('P2', self.browser.title)
#Megan first logs in
login_link = self.browser.find_element_by_link_text('Log In')
login_link.click()
#Megan then puts in her user information
username = self.browser.find_element_by_id('id_username')
password = self.browser.find_element_by_id('id_password')
submit = self.browser.find_element_by_id('id_submit')
username.send_keys('Megan')
password.send_keys('password')
submit.click()
Run Code Online (Sandbox Code Playgroud)
的login.html …
Django 新手,我一直在学习第 1 篇教程,现在正在学习第 5 部分,即自动化测试。
按照教程进行到“修复Bug ”步骤后,运行测试时弹出错误,如下:
Traceback (most recent call last):
File "D:\Python\Django\ui1\polls\tests.py", line 13, in test_was_published_recently_with_future_question
self.assertIs(future_question.was_published_recently(), False)
AttributeError: 'Question' object has no attribute 'was_published_recently'
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
Destroying test database for alias 'default'...
Run Code Online (Sandbox Code Playgroud)
而在教程页面中,测试中没有显示错误。
Creating test database for alias 'default'...
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
Destroying test database for alias 'default'...
Run Code Online (Sandbox Code Playgroud)
这是我的代码。
测试.py
import datetime
from django.utils import timezone
from django.test import TestCase
from .models import Question …Run Code Online (Sandbox Code Playgroud) 我有一个 django rest 框架测试,它只是常规 django 测试的包装器,其工作方式完全相同。代码如下所示:
user_created = User.objects.create_user(first_name="Wally", username="farseer@gmail.com", password="1234",
email="farseer@gmail.com")
client_created = Client.objects.create(user=user_created, cart=cart)
data_client_profile["user"]["first_name"] = "Apoc"
response = self.client.put(reverse("misuper:client_profile"), data_client_profile, format="json")
client_created.refresh_from_db() # Tried this too
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(client_created.user.first_name, data_client_profile["user"]["first_name"])
Run Code Online (Sandbox Code Playgroud)
所以,我要更新client_created与在字典一些数据对象data_client_profile,那么assertEqual该client.user.first_name是“载脂蛋白C”。
这是视图中的代码,我添加了两个pdb.set_trace()不仅有助于粘贴所有代码:
pdb.set_trace()
client_existing_user_obj.phone = phone
client_existing_user_obj.user.email = email
client_existing_user_obj.user.first_name = first_name # Updating here!
client_existing_user_obj.user.last_name = last_name
client_existing_user_obj.user.save()
client_existing_user_obj.save()
pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)
第一个 pdb 中断显示了这一点:
(Pdb) client_existing_user_obj.user.username
u'farseer@gmail.com' # Make sure I'm updating the created object
(Pdb) client_existing_user_obj.user.first_name …Run Code Online (Sandbox Code Playgroud) 我有以下序列化器:
from rest_framework.serializers import Serializer, ImageField
class MySerializer(Serializer):
avatar = ImageField()
Run Code Online (Sandbox Code Playgroud)
我怎样才能为它编写单元测试?我使用了 Django TestCase,但它引发了一个错误。
from django.test import TestCase
class MySerializerTest(TestCase):
def setUp(self):
self.data = {}
...
def test_image(self):
import tempfile
self.data['avatar'] = tempfile.NamedTemporaryFile(suffix=".jpg").file
r_data = json.dumps(self.data)
j_data = json.loads(r_data)
serializer = MySerializer(data=j_data)
if not serializer.is_valid():
import pprint
pprint.pprint(serializer.errors)
self.assertEqual(serializer.is_valid(), True)
Run Code Online (Sandbox Code Playgroud)
但它会引发以下错误:
TypeError:“BufferedRandom”类型的对象不可 JSON 序列化
我有什么错?如何为图像字段编写测试?
我正在尝试更改我的 request.data 字典以删除一些附加字段。它在视图中完全正常工作。但是当我运行相同的测试用例时,我收到此错误:
AttributeError: 这个 QueryDict 实例是不可变的
这是我的观点:
def create(self, request, *args, **kwargs):
context = {'view': self, 'request': request}
addresses = request.data.pop("addresses", None)
serializer = self.get_serializer(data=request.data, context=context)
serializer.is_valid(raise_exception=True)
response = super(WarehouseViewSet, self).create(request, *args, **kwargs)
if addresses is None:
pass
else:
serializer = self.get_serializer(data=request.data, context=context)
serializer.is_valid(raise_exception=True)
addresses = serializer.update_warehouse_address(request, addresses, response.data["id"])
response.data["addresses"] = addresses
return Response(data=response.data, status=status.HTTP_201_CREATED)
Run Code Online (Sandbox Code Playgroud)
这是我的相同视图的测试用例:
def test_create_warehouse_authenticated(self):
response = client.post(
reverse('warehouse_list_create'),
data={
'name': self.test_warehouse['test_warehouse']['name'],
'branch': self.test_warehouse['test_warehouse']['branch'],
},
**{'HTTP_AUTHORIZATION': 'Bearer {}'.format(
self.test_users['test_user']['access_token']
)},
)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
Run Code Online (Sandbox Code Playgroud)
如何修复此错误?
我正在尝试遵循 Python TDD O'Reilly。
我知道他们使用的 django 版本是旧版本,但是,即使在进行了所有可能的修改之后,我仍然收到此错误。
我的 urls.py 文件:
超级列表.urls.py
from django.contrib import admin
from django.urls import path, include, re_path
from django.conf.urls import url
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('lists.urls')),
]
Run Code Online (Sandbox Code Playgroud)
列表.urls.py
urlpatterns = [
path('/', home_page)
]
Run Code Online (Sandbox Code Playgroud)
列表.views.py
from django.shortcuts import (render, HttpResponse)
from rest_framework.decorators import api_view
# Create your views here.
@api_view()
def home_page(request):
return HttpResponse('Response')
Run Code Online (Sandbox Code Playgroud)
列表.tests.py
from django.test import TestCase
from .views import home_page #
class HomePageTest(TestCase):
def test_root_url_resolves_to_home_page_view(self):
found = reverse('/')
self.assertEqual(found.func, home_page)
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?我尝试搜索这个问题很长时间,但没有成功。
在Django 1.8中,我有一个使用此设置的应用程序:
app
|- tests/
| |- test_ook.py
| |- __init__.py
|- models.py
|- __init__.py
...
Run Code Online (Sandbox Code Playgroud)
当我跑python manage.py test -v 2 app,我得到这个错误:
ImportError: 'tests' module incorrectly imported from '/home/.../site/app/tests'. Expected '/home/.../site/app'. Is this module globally installed?
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
我该如何解决?
django ×10
django-tests ×10
python ×5
unit-testing ×3
model-mommy ×1
selenium ×1
testing ×1
virtualenv ×1