如何在Django中强行跳过单元测试?
@skipif和@skipunless是我找到的全部内容,但我只想暂时跳过一个测试用于调试目的,同时我将一些事情弄清楚了.
在使用Django manage.py test命令完成测试执行后,只有传递的测试数被打印到控制台.
(virtualenv) G:\Project\>python manage.py test
Creating test database for alias 'default'...
True
..
----------------------------------------------------------------------
Ran 2 tests in 0.017s
OK
Destroying test database for alias 'default'...
Run Code Online (Sandbox Code Playgroud)
有没有办法看到:
我在doc中找不到任何解决方案.
我正在玩django 1.6教程,但我无法运行测试.我的项目(名称mydjango)和应用程序结构(名称是民意调查)如下所示在virtualenv中.(.nja文件只是由我正在使用的ninja-ide创建的)
.
??? __init__.py
??? manage.py
??? mydjango
? ??? __init__.py
? ??? __init__.pyc
? ??? mydjango.nja
? ??? settings.py
? ??? settings.pyc
? ??? templates
? ? ??? admin
? ? ??? base_site.html
? ??? urls.py
? ??? urls.pyc
? ??? wsgi.py
? ??? wsgi.pyc
??? polls
? ??? admin.py
? ??? admin.pyc
? ??? __init__.py
? ??? __init__.pyc
? ??? models.py
? ??? models.pyc
? ??? templates
? ? ??? __init__.py
? ? ??? polls
? ? …Run Code Online (Sandbox Code Playgroud) 我有一个带有FileField的模型.我想对它进行单元测试.django测试框架有很好的方法来管理数据库和电子邮件.FileFields有类似的东西吗?
如何确保单元测试不会污染真实的应用程序?
提前致谢
PS:我的问题几乎是使用测试装置的Django测试FileField的副本,但它没有接受的答案.只想重新询问这个话题是否有新内容.
我有一个Django应用程序,其视图接受要上载的文件.使用Django REST框架我将APIView子类化并实现post()方法,如下所示:
class FileUpload(APIView):
permission_classes = (IsAuthenticated,)
def post(self, request, *args, **kwargs):
try:
image = request.FILES['image']
# Image processing here.
return Response(status=status.HTTP_201_CREATED)
except KeyError:
return Response(status=status.HTTP_400_BAD_REQUEST, data={'detail' : 'Expected image.'})
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试编写几个单元测试以确保需要身份验证并且实际处理了上载的文件.
class TestFileUpload(APITestCase):
def test_that_authentication_is_required(self):
self.assertEqual(self.client.post('my_url').status_code, status.HTTP_401_UNAUTHORIZED)
def test_file_is_accepted(self):
self.client.force_authenticate(self.user)
image = Image.new('RGB', (100, 100))
tmp_file = tempfile.NamedTemporaryFile(suffix='.jpg')
image.save(tmp_file)
with open(tmp_file.name, 'rb') as data:
response = self.client.post('my_url', {'image': data}, format='multipart')
self.assertEqual(status.HTTP_201_CREATED, response.status_code)
Run Code Online (Sandbox Code Playgroud)
但是当REST框架尝试对请求进行编码时,这会失败
Traceback (most recent call last):
File "/home/vagrant/.virtualenvs/myapp/lib/python3.3/site-packages/django/utils/encoding.py", line 104, in force_text
s = six.text_type(s, encoding, errors)
UnicodeDecodeError: …Run Code Online (Sandbox Code Playgroud) 一段时间以来,我的单元测试时间比预期的要长.我试图调试它几次没有太大的成功,因为延迟是在我的测试开始运行之前.这影响了我做任何远程接近测试驱动开发的能力(也许我的期望太高),所以我想看看我是否可以一劳永逸地解决这个问题.
运行测试时,测试开始和实际开始之间有70到80秒的延迟.例如,如果我为一个小模块运行测试(使用time python manage.py test myapp),我会得到
<... bunch of unimportant print messages I print from my settings>
Creating test database for alias 'default'...
......
----------------------------------------------------------------
Ran 6 tests in 2.161s
OK
Destroying test database for alias 'default'...
real 1m21.612s
user 1m17.170s
sys 0m1.400s
Run Code Online (Sandbox Code Playgroud)
大约1m18的1m:21之间
Creating test database for alias 'default'...
Run Code Online (Sandbox Code Playgroud)
和
.......
Run Code Online (Sandbox Code Playgroud)
线.换句话说,测试需要不到3秒,但数据库初始化似乎需要1:18分钟
我有大约30个应用程序,大多数有1到3个数据库模型,所以这应该给出项目大小的概念.我使用SQLite进行单元测试,并实现了一些建议的改进.我无法发布我的整个设置文件,但很高兴添加所需的任何信息.
我确实使用跑步者
from django.test.runner import DiscoverRunner
from django.conf import settings
class ExcludeAppsTestSuiteRunner(DiscoverRunner):
"""Override the default django 'test' command, exclude from testing
apps which we know …Run Code Online (Sandbox Code Playgroud) 我正在为Django视图编写单元测试.
class TestLog(unittest.TestCase):
"""Test for Contact"""
def setUp(self):
self.c = Client()
try:
self.bob = User.objects.create_user("mojo","b@example.com", "bmojo")
except :
print ''
def test_get_emails(self):
response = self.c.get('/text/')
self.assertEqual(response.status_code, 200)
def test_htmlemils(self):
response = self.c.get('/emails/html/upload')
self.assertEqual(response.status_code, 200)
Run Code Online (Sandbox Code Playgroud)
c = Client()将'http:// testserver'作为我要覆盖的域,我想在该测试客户端中添加我的真实域,是他们自定义测试客户端的方式吗?
我试图将Django项目从1.8版带到1.11版.除了单元测试之外,几乎所有东西看起来都很好.我们有一个基础测试类继承自Django TestCase和Tastypie mixin.基类在setUp()中有一些代码
class BaseApiTest(ResourceTestCaseMixin, django.test.TestCase):
def setUp(self):
super().setUp()
self.username = "secret_user"
self.password = "sekret"
self.email = "secret@mail.com"
self.first_name = "FirstName"
self.last_name = "LastName"
self.user = User.objects.create_superuser(
self.username,
self.username,
self.password
)
Run Code Online (Sandbox Code Playgroud)
应用程序特定的测试将继承基本测试并执行类似的操作
class TheAPITest(BaseApiTest):
def setUp(self):
super().setUp()
# more setup goes here
Run Code Online (Sandbox Code Playgroud)
所以,在Django 1.8.x下,这很好用.但是在1.11.x下,所有这些都给我一个错误User.objects.create_superuser() line.
django.db.utils.InterfaceError: connection already closed
我一直在阅读发行说明,但是在1.8和1.11之间发生了太多的事情.我缺少一些简单的东西吗?
我有一个单元测试,它在一个断言中失败,该断言在同一测试用例类中传递了另一个测试.
这是通过测试:
def test_home(self):
c = Client()
resp = c.get('/')
self.assertEqual(resp.status_code, 200)
self.assertTrue('a_formset' in resp.context)
Run Code Online (Sandbox Code Playgroud)
这是失败的测试:
def test_number_initial_number_of_forms(self):
c = Client()
resp = c.get('/')
self.assertEqual(resp.context['a_formset'].total_form_count(), 1)
Run Code Online (Sandbox Code Playgroud)
在第二次测试中,我得到了错误TypeError: 'NoneType' object has no attribute '__getitem__'.
如果我执行第二次测试
def test_number_initial_number_of_forms(self):
c = Client()
resp = c.get('/')
self.assertTrue('a_formset' in resp.context)
self.assertEqual(resp.context['a_formset'].total_form_count(), 1)
Run Code Online (Sandbox Code Playgroud)
我收到了错误TypeError: argument of type 'NoneType' is not iterable.我在第二次测试中通过print语句确认了response.content包含我希望得到的页面,状态代码是否正确,以及模板是否正确.但是响应的背景始终None是第二次测试.
我通过标准的"python manage.py test ..."界面运行我的Django单元测试,所以我不相信我遇到了" 上下文是空的shell "问题.
这是怎么回事?
编辑:
如果我添加print type(resp.context['a_formset'])到每个测试,我得到的工作测试<class 'django.forms.formsets.AFormFormSet'>.对于非工作测试,我TypeError: 'NoneType' object has …
我是新来的Django unittest和pytest.但是,我开始觉得pytest测试用例更紧凑,更清晰.
这是我的测试用例:
class OrderEndpointTest(TestCase):
def setUp(self):
user = User.objects.create_superuser(username='admin', password='password', email='pencil@gmail.com')
mommy.make(CarData, _quantity=1)
mommy.make(UserProfile, _quantity=1, user=user)
def test_get_order(self):
mommy.make(Shop, _quantity=1)
mommy.make(Staff, _quantity=1, shop=Shop.objects.first())
mommy.make(Order, _quantity=1, car_info={"color": "Black"}, customer={"name": "Lord Elcolie"},
staff=Staff.objects.first(), shop=Shop.objects.first())
factory = APIRequestFactory()
user = User.objects.get(username='admin')
view = OrderViewSet.as_view({'get': 'list'})
request = factory.get('/api/orders/')
force_authenticate(request, user=user)
response = view(request)
assert 200 == response.status_code
assert 1 == len(response.data.get('results'))
Run Code Online (Sandbox Code Playgroud)
这是pytest版本
def test_get_order(car_data, admin_user, orders):
factory = APIRequestFactory()
user = User.objects.get(username='admin')
view = OrderViewSet.as_view({'get': …Run Code Online (Sandbox Code Playgroud) django ×10
django-unittest ×10
python ×8
unit-testing ×3
django-nose ×1
django-views ×1
filefield ×1
pytest ×1
skip ×1
tastypie ×1