Django 今日发表了 1.6 的第2个 阿尔法 版本,下载地址:downloads
page 。同期我们提出您读书
release notes.

Django提供了一组织工作具,在编写测验时方可派上用项。

在做Django体能测量试验战绩管理平台时,境遇了储存操作日志的主题材料

Django 1.6 将含宛如下校订:

测验客户端

测验顾客端是三个充任设想Web浏览器的Python类,允许你以编制程序方式测量检验视图并与Django驱动的应用程序进行人机联作。
测验客商端能够做的有个别思想政治工作是:

  • 在UENVISIONL上模仿GET和POST央求并察看响应 –
    从低等HTTP(结果标头和状态码)到页面内容的装有剧情。

  • 翻开重定向链(假诺有的话),并在每种步骤检查U牧马人L和情景代码。

  • 测量试验给定的号召是或不是由给定的Django模板显示,并且带有特定值的沙盘模拟经营上下文。

请留意,测量检验顾客端不是为了代替Selenium或别的浏览器内的框架。
Django的测量检验顾客端有两样的根本。

简来说之:

  • 利用Django的测验客商带给明确正在显现准确的沙盘模拟经营,並且模板传递了合情合理的上下文数据。
  • 采用Selenium等浏览器内部框架来测验展现的HTML和网页的行为,即JavaScript作用。

Django还为那个框架提供特地援助;
有关越来越多详细消息,请参阅LiveServerTestCase部分。
综合测量检验套件应该运用二种测量检验项指标重新组合。
有关示例的更详尽的Django测验客商端,请参阅Django Project网址。

  • 《作者干吗又起先用Django了(内含安装和计划超详细文书档案)》
  • 《Django体能测量试验战表处理平台之蒙受和服务器计划》
  • 《Django体能测验成绩管理平台之xadmin安装》
  • 《Django体能测量检验成绩管理平台之学生基本音信APP》
  • 《Django体能测量试验成绩处理平台之管理员应用程式》
  • 简化暗中同意项目和平运动用模板
  • 晋级事务管理
  • 可接受长久化数据库连接
  • 可在恣心所欲测量检验模块中开掘测验
  • 时区敏感的聚集
  • 支持 SQLite 的 savepoints 
  • GeoDjango form widgets
提供了测量试验用例类

好端端的Python单元测量检验类扩大了unittest.TestCase的基类。
Django提供了这些基类的有的恢弘:

体能测量检验成绩管理平台,影响了到学子们到终极成就,由此操作日志必须详细。非常是何许符合录入到成绩,什么人录入的,什么符合校正的,改革了什么都以那么些关键的多少。下边具体得以完毕方式

等等,详细情况请看批零表明。

澳门葡萄京官方网站,SimpleTestCase

用有个别底子用扩充unittest.TestCase,如:

  • 封存并还原Python警示机器状态。
  • 增添一些卓有功用的断言,满含:
    • 检查可调用是还是不是会引发某种非凡。
    • 测量检验表单字段表现和错误管理。
    • 测量检验存在/海市蜃楼给定片段的HTML响应。
    • 表达模板是还是不是已用于转移给定的响应内容。
    • 表达HTTP重定向是由应用程序实行的。
    • 严谨测量检验三个HTML片段的等式/不等式或禁止。
    • 严格测量检验八个XML片段的相似/不等同。
    • 严加测验八个JSON片段的相等性。
  • 可见利用改革的设置运转测量试验。
  • 选择测量检验客商端。
  • 自定义测试时间U陆风X8L映射。
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'filters': { 'require_debug_false': { '()': 'django.utils.log.RequireDebugFalse' }, 'require_debug_true': { '()': 'django.utils.log.RequireDebugTrue' } }, 'formatters': { 'main_formatter': { 'format': '%(levelname)s:%s: %s ' '(%s; %s:%', 'datefmt': "%Y-%m-%d %H:%M:%S", }, }, 'handlers': { 'mail_admins': { 'level': 'ERROR', 'filters': ['require_debug_false'], 'class': 'django.utils.log.AdminEmailHandler' }, 'console':{ 'level': 'DEBUG', 'filters': ['require_debug_true'], 'class': 'logging.StreamHandler', 'formatter': 'main_formatter', }, 'production_file':{ 'level' : 'INFO', 'class' : 'logging.handlers.RotatingFileHandler', 'filename' : 'logs/main.log', 'maxBytes': 1024*1024*5, # 5 MB 'backupCount' : 7, 'formatter': 'main_formatter', 'filters': ['require_debug_false'], }, 'debug_file':{ 'level' : 'DEBUG', 'class' : 'logging.handlers.RotatingFileHandler', 'filename' : 'logs/main_debug.log', 'maxBytes': 1024*1024*5, # 5 MB 'backupCount' : 7, 'formatter': 'main_formatter', 'filters': ['require_debug_true'], } }, 'loggers': { 'django.request': { 'handlers': ['mail_admins', 'console'], 'level': 'ERROR', 'propagate': True, }, '': { 'handlers': ['console', 'production_file', 'debug_file'], 'level': "DEBUG", }, }}

import logginglogger = logging.getLoggerlogger.info('------ save_models--------')

(文/开源中华夏族民共和国State of Qatar    

TransactionTestCase

Django的TestCase类(如下所述)利用数据库事务工具来增长速度在历次测量检验初始时将数据库重新载入参数为已知状态的历程。
不过,那样做的结果是一些数据库行为无从在Django TestCase类中开展测量试验。

在此些情况下,您应该使用TransactionTestCase。
除了数据库重新初始化为已知状态的法子以至测量检验代码测量检验提交和回滚效果的手艺之外,TransactionTestCase和TestCase是同样的:

  • TransactionTestCase通过截断所有表来重新载入参数数据库。
    四个TransactionTestCase只怕会调用commit和rollback,并观望这个调用对数据库的震慑。

  • 三只,TestCase在测量试验后不会截断表格。
    而是将测验代码封装在测量试验甘休时回滚的数据库事务中。
    那保障了测验截至时的回滚将数据库复苏到起首状态。

TransactionTestCase继承自SimpleTestCase。

TestCase

此类提供了部分可用于测量检验网站的叠合作用。
将健康的unittest.TestCase调换为Django
TestCase不会细小略:只需将您的测量试验的基类从unittest.TestCase校勘为django.test.TestCase。
全体正规的Python单元测验功效都将世襲可用,但它会扩张一些实用的增大成效,此中包括:

  • 自行加载夹具。
  • 将测量检验封装在多少个嵌套的原子块中:三个用于全数类,二个用来各个测量检验。
  • 始建三个TestClient实例。
  • Django特定的断言,用于测验重定向和表单错误等。

TestCase继承自TransactionTestCase。

LiveServerTestCase

LiveServerTestCase与TransactionTestCase的基本相近,唯有贰个额外的效率:它在设置时在后台运行一个活的Django服务器,并在卸载时关闭它。
那允许行使除Django设想客商端以外的自动化测量检验客商端,比如Selenium客商端,
在浏览器内施行一多种功用测量试验并仿照真实客户的操作。

测量检验用例功效
暗中同意测量检验顾客端

*TestCase实例中的各样测量试验用例都能够访谈Django测量试验客商端的实例。
该顾客端能够当作self.client访谈。
那么些客商端是为各类测验再度成立的,所以您不要忧郁状态(如cookie)从多少个测量检验传递到另二个测量检验。
那代表,并不是在每种测验中实例化叁个顾客端:

import unittest
from django.test import Client

class SimpleTest(unittest.TestCase):
    def test_details(self):
        client = Client()
        response = client.get('/customer/details/')
        self.assertEqual(response.status_code, 200)

    def test_index(self):
        client = Client()
        response = client.get('/customer/index/')
        self.assertEqual(response.status_code, 200)

…您可以参见self.client,如下所示:

from django.test import TestCase

class SimpleTest(TestCase):
    def test_details(self):
        response = self.client.get('/customer/details/')
        self.assertEqual(response.status_code, 200)

    def test_index(self):
        response = self.client.get('/customer/index/')
        self.assertEqual(response.status_code, 200)
Fixture装载

只要数据库中从未其它数据,则用来数据库援救的Web站点的测验用例用途超小。
为了使测验数据轻易归入数据库,Django的自定义TransactionTestCase类提供了一种加载Fixture的方法。
fixture是Django知道怎么样导入数据库的数据集合。
举例,即便您的网址有着客户帐户,则大概会安装多少个假顾客帐户的夹具,以便在测验时期填充数据库。

创建fixture的最直白的格局是应用manage.py dumpdata命令。
那即使你已经在你的数据库中有一对数据。
(有关更加多详细音讯,请参阅dumpdata文书档案)。

假设您成立了三个fixture并把它座落你的INSTALLED_APPS的fixtures目录中,你就足以在您的单元测验中通过在你的django.test.TestCase子类中钦命二个fixtures
class属性来接受它:

from django.test import TestCase
from myapp.models import Animal

class AnimalTestCase(TestCase):
    fixtures = ['mammals.json', 'birds']

    def setUp(self):
        # Test definitions as before.
        call_setup_methods()

    def testFluffyAnimals(self):
        # A test that uses the fixtures.
        call_some_test_code()

实际会产生哪些:

  • 在种种测量检验用例初始时,在运转setUp()在此以前,Django将刷新数据库,将数据库重临到它在调用迁移后平昔处于的意况。

  • 然后,安装具有命名的夹具。
    在这里个事例中,Django将安装其余名称为哺乳动物的JSON夹具,接下去是其外人为bird的夹具。

至于定义和设置夹具的更加多详细音信,请参阅loaddata文书档案。
对测验用例中的每一个测量试验都再次此刷新/加载进程,因而你能够鲜明测验的结果不会遇到另三个测量试验或测量试验推行顺序的熏陶。
暗中认可景况下,灯具只加载到默许数据库中。
固然你正在使用四个数据库并将multi_db设置为True,则会将Fixture加载到持有数据库中。

覆写设置

采取以下职能有的时候转移测量检验中的设置值。
不要直接操作django.conf.settings,因为在这里种操作之后,Django不会复苏原始值。

settings()

鉴于测量检验指标,在运营测验代码后一时改动设置并回复为原始值日常很有用。
对于这些用例,Django提供了一个名叫settings()的正式Python上下文物管理理器(请参阅PEP
343),它能够像这么使用:

from django.test import TestCase

class LoginTestCase(TestCase):

    def test_login(self):

        # First check for the default behavior
        response = self.client.get('/sekrit/')
        self.assertRedirects(response, '/accounts/login/?next=/sekrit/')

        # Then override the LOGIN_URL setting
        with self.settings(LOGIN_URL='/other/login/'):
            response = self.client.get('/sekrit/')
            self.assertRedirects(response, '/other/login/?next=/sekrit/')

此示例将覆盖with块中代码的LOGIN_U昂CoraL设置,然后将其值重新载入参数为事情发生前的动静。

modify_settings()

再也定义包括值列表的安装或者难以达成。
实际上,扩大或删除值经常就够用了。
modify_settings()上下文物管理理器使其变得非常轻巧:

from django.test import TestCase

class MiddlewareTestCase(TestCase):

    def test_cache_middleware(self):
        with self.modify_settings(MIDDLEWARE_CLASSES={
            'append': 'django.middleware.cache.FetchFromCacheMiddleware',
            'prepend': 'django.middleware.cache.UpdateCacheMiddleware',
            'remove': [
               'django.contrib.sessions.middleware.SessionMiddleware',
               'django.contrib.auth.middleware.AuthenticationMiddleware', 
               'django.contrib.messages.middleware.MessageMiddleware',
            ],
        }):
            response = self.client.get('/')
            # ...

对此每一个操作,您能够提供值列表或字符串。
当该值已经存在于列表中时,append和prepend不起功用;
当班值日不真实时,也不会删除。

override_settings()

倘使您想覆盖二个测量检验方法的设置,Django提供了override_settings()装饰器(见PEP
318)。
它是那样使用的:

from django.test import TestCase, override_settings

class LoginTestCase(TestCase):

    @override_settings(LOGIN_URL='/other/login/')
    def test_login(self):
        response = self.client.get('/sekrit/')
        self.assertRedirects(response, '/other/login/?next=/sekrit/')

装饰器也可以选拔于TestCase类:

from django.test import TestCase, override_settings

@override_settings(LOGIN_URL='/other/login/')
class LoginTestCase(TestCase):

    def test_login(self):
        response = self.client.get('/sekrit/')
        self.assertRedirects(response, '/other/login/?next=/sekrit/')
modify_settings()

同样,Django提供了modify_settings()装饰器:

from django.test import TestCase, modify_settings

class MiddlewareTestCase(TestCase):

    @modify_settings(MIDDLEWARE_CLASSES={
        'append': 'django.middleware.cache.FetchFromCacheMiddleware',
        'prepend': 'django.middleware.cache.UpdateCacheMiddleware',
    })
    def test_cache_middleware(self):
        response = self.client.get('/')
        # ...

装饰器也能够行使于测验用例类:

from django.test import TestCase, modify_settings

@modify_settings(MIDDLEWARE_CLASSES={
    'append': 'django.middleware.cache.FetchFromCacheMiddleware',
    'prepend': 'django.middleware.cache.UpdateCacheMiddleware',
})
class MiddlewareTestCase(TestCase):

    def test_cache_middleware(self):
        response = self.client.get('/')
        # ...

在覆盖设置时,请确定保证拍卖利用代码应用缓存或保留状态的近乎功能的景观,纵然设置已改成。
Django提供django.test.signals.setting_changed实信号,允许你注册回调以消释并在安装改革时重新载入参数状态。

断言

出于Python的普通unittest.TestCase类完毕了assertTrue()和assertEqual()等断言方法,由此Django的自定义TestCase类提供了数不清可用于测验Web应用程序的自定义断言方法:

  • assertRaisesMessage –
    表明可举办对象的实行引发了具备expected_message表示的非凡。

  • assertFieldOutput – 注解表单字段在各个输入下准确运营。

  • assertFormError –
    注脚表单上的字段在窗体上显现时引发所提供的失实列表。

  • assertFormsetError – 注明formset在渲染时引发提供的谬误列表。

  • assertContains –
    证明Response实例产生给定的status_code,何况该文件出今后响应的剧情中。

  • assertNotContains –
    注解Response实例发生给定的status_code,何况该公文不会现出在响应的剧情中。

  • assertTemplateUsed –
    证明具备给定名称的沙盘模拟经营用于显示响应。该名称是多少个字符串,如’admin /
    index.html’。

  • assertTemplateNotUsed – 表明具备给定名称的模板未用于展现响应。

  • assertRedirects –
    注解响应再次回到了贰个status_code重定向状态,重定向到expected_url(包涵其余GET数据),何况最终页面被target_status_code收到。

  • assertHTMLEqual –
    断言字符串html1和html2是至极的。该相比基于HTML语义。思索到以下因素开展比较:

    • 忽略HTML标签前后的空格。
    • 有着系列的空白都被以为是平等的。
    • 不无展开的价签都隐式关闭,比方当周边的价签被关门或HTML文书档案停止时。
    • 空标签也正是它们的自闭版本。
    • HTML成分的性质排序并不重要。
    • 还未有参数的属性等于名称和值雷同的质量(参见示例)。
  • assertHTMLNotEqual – 申明字符串html1和html2不等于。
    该相比较基于HTML语义。有关详细音信,请参阅assertHTMLEqual()。

  • assertXMLEqual –
    申明字符串xml1和xml2是相等的。该相比基于XML语义。与assertHTMLEqual()相近,对深入分析的剧情打开相比较,由此只思量语义差距,而不思忖语法出入。

  • assertXMLNotEqual –
    评释字符串xml1和xml2不等于。该比较基于XML语义。有关详细音信,请参阅assertXMLEqual()。

  • assertInHTML – 断言HTML碎片针满含在干草堆中。

  • assertJSONEqual – 声明JSON片段raw和expected_data相等。

  • assertJSONNotEqual – 声明JSON片段raw和expected_data不相等。

  • assertQuerysetEqual –
    表明查询集qs重临值列表的特定值。使用函数转换实践qs和值的剧情比较;私下认可情状下,那意味相比较每种值的repr()。

  • assertNumQueries – 断言当用* args和**
    kwargs调用func时,实行num数据库查询。

电邮服务

即便你的其它Django视图使用Django的电子邮件成效发送电子邮件,那么您大概不愿意每一回使用该视图运营测验时发送电子邮件。出于这些缘故,Django的测验运转器会自动将具备Django发送的电子邮件重定向到三个虚拟发件箱。那使您可以测试发送电子邮件的各样上边

  • 从发送到每封邮件内容的邮件数量 –
    而不实际发送邮件。测量试验运营者通过用测验后端透明地轮流符合规律的电子邮件后带给实现此操作。
    (别顾忌 –
    借使您正在运行其他电子邮件发件人,则不会影响Django以外的别样其它电子邮件发件人,举个例子您的微处理器的邮件服务器。)

在测量试验运维时期,每封发出的电子邮件都保留在django.core.mail.outbox中。那是已发送的全数EmailMessage实例的大概列表。
outbox属性是仅在应用locmem电子邮件后端时创建的特别质量。它经常不会作为django.core.mail模块的一有个别存在,您无法间接导入它。上边的代码展现了如何正确访问该属性。以下是八个演示测量检验,用于检查django.core.mail.outbox的长度和内容:

from django.core import mail
from django.test import TestCase

class EmailTest(TestCase):
    def test_send_email(self):
        # Send message.
        mail.send_mail('Subject here', 'Here is the message.',
            'from@example.com', ['to@example.com'],
            fail_silently=False)

        # Test that one message has been sent.
        self.assertEqual(len(mail.outbox), 1)

        # Verify that the subject of the first message is correct.
        self.assertEqual(mail.outbox[0].subject, 'Subject here')

如前所述,在Django * TestCase的各个测量检验开头时,测量检验发件箱都将被清空。
要手动清空发件箱,请将空驶列车表分配给mail.outbox:

from django.core import mail

# Empty the test outbox
mail.outbox = []
管制命令

可以选用call_command()函数来测量检验管理命令。
输出可以被重定向到一个StringIO实例中:

from django.core.management import call_command
from django.test import TestCase
from django.utils.six import StringIO

class ClosepollTest(TestCase):
    def test_command_output(self):
        out = StringIO()
        call_command('closepoll', stdout=out)
        self.assertIn('Expected output', out.getvalue())
跳过测量检验

unittest库提供了@skipIf和@skipUnless修饰器,假诺您事情未发生前知道那一个测验在好几条件下会停业,您能够跳过测量检验。
比方,若是你的测量检验必要一定的可选库才干打响,则足以应用@skipIf修饰测验用例。
然后,测量检验运转职员将告诉测验未施行以致为啥,实际不是因此测量检验或完全市略测量检验。

测量检验数据库

亟需数据库的测验(即模型测量检验)不会利用你的生育数据库;
为测验成立单独的空域数据库。
无论测验通过仍旧诉讼失败,测验数据库在全部测量试验施行完成后都会被销毁。
您能够由此向测量检验命令增添–keepdb标记来防止销毁测验数据库。
那就要运转时期保留测验数据库。

一经数据库空中楼阁,它将首先被创制。
任何迁移也将被应用,以保持它的时尚情况。
暗许情形下,测量检验数据库通过将test_加上到NAME的值来获取其名称
DATABASES中定义的数据库的装置。
在使用SQLite数据库引擎时,测量试验默许使用内存数据库(即,数据库将要内部存款和储蓄器中开创,完全绕过文件系统!)。

若果要利用不一样的数据库名称,请在TEST辞书中为DATABASES中的任何给定数据库钦命NAME。
在PostgreSQL上,USE讴歌RDX还须要对放手postgres数据库的读取权限。
除了行使单独的数据库以外,测量试验运行器还有只怕会使用你的设置文件中持有同一的数据库设置:ENGINE,USECR-V,HOST等。测验数据库由USEXC60钦命的客商创设,由此你能够须求保险给定的顾客帐户有丰裕的权位在系统上创建新的数据库。

行使分裂的测验框架

明朗,unittest不是独一的Python测量试验框架。
尽管Django未有提供对代表框架的显然协理,但它实在提供了一种方法来调用为代表框架营造的测验,好似它们是正规的Django测验相近。

当您运转 ./manage.py
test时,Django会查看TEST_RUNNE阿斯顿·马丁DB11设置以分明要施行的操作。
暗中同意意况下,TEST_RUNNE大切诺基指向django.test.runner.DiscoverRunner。
这几个类定义了私下认可的Django测实行为。 这种行为涉嫌:

  1. 推行全局预测量检验设置。

  2. 在称呼与情势test * .py相称的当前目录上边包车型大巴其余文件中搜索测量试验。

  3. 创设测量试验数据库。

  4. 正在运转迁移以将模型和起来数据安装到测验数据库中。

  5. 运转找到的测验。

  6. 销毁测量试验数据库。

  7. 施行全局的测验后拆除。

假若您定义了您自身的测验运转器类并在那类上针对了TEST_RUNNEENCORE,则只要运行./manage.py test,Django就能够实施测量试验运维器。

透过这种艺术,还不错任何能够从Python代码执行的测量检验框架,大概修改Django测量试验施行流程以满意你可能持有的其余测量试验必要。

关于使用分裂测验框架的越多音讯,请参阅Django项目网址。

下一步是怎么样?

既然您曾经清楚怎么为你的Django项目编写制定测验,那么只要您构思将品种产生四个的确的实时网址

咱们将把Django安顿到五个Web服务器上,大家将延续钻探三个不胜重大的宗旨。