老师讲课博客目录,对Python的Django框架中的项目进行单元测试的方法

 bootstrap cdn在线地址

对Python的Django框架中的项目开展单元测验的主意,pythondjango

 Python中的单元测量检验

笔者们先来回想一下Python中的单元测量试验方法。
下边是二个 Python的单元测量检验简单的例子:

若是大家付出贰个除法的功能,有的同学恐怕感觉非常轻便,代码是那样的:

def division_funtion(x, y):
  return x / y

唯独这么写毕竟对如故不对啊,有个别同学能够在代码下边那样测验:

def division_funtion(x, y):
  return x / y


if __name__ == '__main__':
  print division_funtion(2, 1)
  print division_funtion(2, 4)
  print division_funtion(8, 3)

但是这么运行后获得的结果,自个儿每便都得算一下去审查批准二遍,特别不便于,Python中有
unittest
模块,能够很平价地实行测验,实际情况能够文章最终的链接,看官方网址文档的详实介绍。

上边是二个回顾的身体力行:

import unittest


def division_funtion(x, y):
  return x / y


class TestDivision(unittest.TestCase):
  def test_int(self):
    self.assertEqual(division_funtion(9, 3), 3)

  def test_int2(self):
    self.assertEqual(division_funtion(9, 4), 2.25)

  def test_float(self):
    self.assertEqual(division_funtion(4.2, 3), 1.4)


if __name__ == '__main__':
  unittest.main()

自己总结地写了五个测量试验示例(不肯定周详,只是示范,比方未有思考除数是0的景色卡塔 尔(英语:State of Qatar),运营后发掘:

F.F
======================================================================
FAIL: test_float (__main__.TestDivision)
----------------------------------------------------------------------
Traceback (most recent call last):
 File "/Users/tu/YunPan/mydivision.py", line 16, in test_float
  self.assertEqual(division_funtion(4.2, 3), 1.4)
AssertionError: 1.4000000000000001 != 1.4

======================================================================
FAIL: test_int2 (__main__.TestDivision)
----------------------------------------------------------------------
Traceback (most recent call last):
 File "/Users/tu/YunPan/1.py", line 13, in test_int2
  self.assertEqual(division_funtion(9, 4), 2.25)
AssertionError: 2 != 2.25

----------------------------------------------------------------------
Ran 3 tests in 0.001s

FAILED (failures=2)

汗!发掘了没,竟然多个都失利了,测验开掘:

4.2除以3 也等于 1.4000000000000001 不对等期待值 1.4

9除以4等于2,不对等期待的 2.25

下边我们就是要修复这一个主题材料,再度运维测量试验,直到运转不报错截止。

举个例子说依据实际处境,假使我们只必要保留到小数点后6位,能够那样改:

def division_funtion(x, y):
  return round(float(x) / y, 6)

重复运维就不报错了:

...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

 
OK

Django中的单元测量试验

赶紧实行单元测量试验(UnitTest卡塔 尔(英语:State of Qatar)是相比较好的做法,极端的情形以致强调“测量试验先行”。现在大家早本来就有了第多个model类和Form类,是时候初叶写测量检验代码了。

Django支持python的单元测量检验(unit test卡塔尔和文件测验(doc
test卡塔 尔(阿拉伯语:قطر‎,我们那边最紧要研讨单元测量试验的主意。这里不对单元测量检验的争论做过多的论述,要是你曾经深谙了下列概念:test
suite, test case, test/test action,  test data, assert等等。

在单元测量试验方面,Django世袭python的unittest.TestCase完结了和睦的django.test.TestCase,编写测验用
例平常从此现在间最早。测验代码通常位于app的tests.py文件中(也得以在models.py中编辑,然而小编不提议如此做卡塔尔国。在Django生成的
depotapp中,已经富含了这么些文件,而且当中包含了三个测验用例的样例:

depot/depotapp/tests.py

from django.test import TestCase
class SimpleTest(TestCase):
def test_basic_addition(self):
"""
Tests that 1 + 1 always equals 2.
"""
self.assertEqual(1 + 1, 2)

您能够有两种方法运营单元测验:

  • python manage.py test:施行全部的测量检验用例
  • python manage.py test app_name, 推行该app的有着测量检验用例
  • python manage.py test app_name.case_name: 试行钦赐的测验用例

用第二种艺术实施上边提供的样例,结果如下:

$ python manage.py test depotapp.SimpleTest

Creating test database for alias 'default'...
.
----------------------------------------------------------------------
Ran 1 test in 0.012s

OK
Destroying test database for alias 'default'...

你可能会首要到,输出音讯中回顾了成立和删除数据库的操作。为了防止测验数据形成的震慑,测量检验进程会利用一个独立的数据库,关于怎么着内定测量检验数据库
的内部情状,请查阅Django文书档案。在大家的例证中,由于选拔sqlite数据库,Django将默许使用内部存款和储蓄器数据库来进行测量检验。

上面就让大家来编排测量试验用例。在《Agile Web Development with Rails
4th》中,7.2节,最终兑现的ProductTest代码如下:

class ProductTest < ActiveSupport::TestCase
test "product attributes must not be empty"do
product = Product.new
assert product.invalid?
assert product.errors[:title].any?
assert product.errors[:description].any?
assert product.errors[:price].any?
assert product.errors[:image_url].any?
end
test "product price must be positive"do
product = Product.new(:title => "My Book Title",
:description => "yyy",
:image_url => "zzz.jpg")
product.price = -1
assert product.invalid?
assert_equal "must be greater than or equal to 0.01",
product.errors[:price].join('; ')
product.price = 0
assert product.invalid?
assert_equal "must be greater than or equal to 0.01",
product.errors[:price].join('; ')
product.price = 1
assert product.valid?
end
def new_product(image_url)
Product.new(:title => "My Book Title",
:description => "yyy",
:price => 1,
:image_url => image_url)
end
test "image url"do
ok = %w{ fred.gif fred.jpg fred.png FRED.JPG FRED.Jpg
http://a.b.c/x/y/z/fred.gif }
bad = %w{ fred.doc fred.gif/more fred.gif.more }
ok.eachdo |name|
assert new_product(name).valid?, "#{name} shouldn't be invalid"
end
bad.eachdo |name|
assert new_product(name).invalid?, "#{name} shouldn't be valid"
end
end
test "product is not valid without a unique title"do
product = Product.new(:title => products(:ruby).title,
:description => "yyy",
:price => 1,
:image_url => "fred.gif")
assert !product.save
assert_equal "has already been taken", product.errors[:title].join('; ')
end
test "product is not valid without a unique title - i18n"do
product = Product.new(:title => products(:ruby).title,
:description => "yyy",
:price => 1,
:image_url => "fred.gif")
assert !product.save
assert_equal I18n.translate('activerecord.errors.messages.taken'),
product.errors[:title].join('; ')
end
end

对Product测验的内容包蕴:

1.title,description,price,image_url不能够为空;

  1. price必得超越零;

  2. image_url必需以jpg,png,jpg结尾,而且对大小写不灵敏;

  3. titile必得唯生机勃勃;

让大家在Django中实行那个测量检验。由于ProductForm包罗了模型校验和表单校验法规,使用ProductForm能够比较轻易的达成上述测量试验:

depot/depotapp/tests.py

#/usr/bin/python
#coding: utf8
"""
This file demonstrates writing tests using the unittest module. These will pass
when you run "manage.py test".
Replace this with more appropriate tests for your application.
"""
from django.test import TestCase
from forms import ProductForm
class SimpleTest(TestCase):
def test_basic_addition(self):
"""
Tests that 1 + 1 always equals 2.
"""
self.assertEqual(1 + 1, 2)
class ProductTest(TestCase):
def setUp(self):
self.product = {
'title':'My Book Title',
'description':'yyy',
'image_url':'http://google.com/logo.png',
'price':1
}
f = ProductForm(self.product)
f.save()
self.product['title'] = 'My Another Book Title'
#### title,description,price,image_url不能为空
def test_attrs_cannot_empty(self):
f = ProductForm({})
self.assertFalse(f.is_valid())
self.assertTrue(f['title'].errors)
self.assertTrue(f['description'].errors)
self.assertTrue(f['price'].errors)
self.assertTrue(f['image_url'].errors)
####  price必须大于零
def test_price_positive(self):
f = ProductForm(self.product)
self.assertTrue(f.is_valid())
self.product['price'] = 0
f = ProductForm(self.product)
self.assertFalse(f.is_valid())
self.product['price'] = -1
f = ProductForm(self.product)
self.assertFalse(f.is_valid())
self.product['price'] = 1
####  image_url必须以jpg,png,jpg结尾,并且对大小写不敏感;
def test_imgae_url_endwiths(self):
url_base = 'http://google.com/'
oks = ('fred.gif', 'fred.jpg', 'fred.png', 'FRED.JPG', 'FRED.Jpg')
bads = ('fred.doc', 'fred.gif/more', 'fred.gif.more')
for endwith in oks:
self.product['image_url'] = url_base+endwith
f = ProductForm(self.product)
self.assertTrue(f.is_valid(),msg='error when image_url endwith '+endwith)
for endwith in bads:
self.product['image_url'] = url_base+endwith
f = ProductForm(self.product)
self.assertFalse(f.is_valid(),msg='error when image_url endwith '+endwith)
self.product['image_url'] = 'http://google.com/logo.png'
###  titile必须唯一
def test_title_unique(self):
self.product['title'] = 'My Book Title'
f = ProductForm(self.product)
self.assertFalse(f.is_valid())
self.product['title'] = 'My Another Book Title'

接下来运维 python manage.py test
depotapp.ProductTest。就像预想的那样,测量试验未有经过:

Creating test database for alias 'default'...
.F..
======================================================================
FAIL: test_imgae_url_endwiths (depot.depotapp.tests.ProductTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/holbrook/Documents/Dropbox/depot/../depot/depotapp/tests.py", line 65, in test_imgae_url_endwiths
self.assertTrue(f.is_valid(),msg='error when image_url endwith '+endwith)
AssertionError: False is not True : error when image_url endwith FRED.JPG

----------------------------------------------------------------------
Ran 4 tests in 0.055s

FAILED (failures=1)
Destroying test database for alias 'default'...

因为我们前边并未设想到image_url的图片扩张名大概会大写。改进ProductForm的有关部分如下:

def clean_image_url(self):
url = self.cleaned_data['image_url']
ifnot endsWith(url.lower(), '.jpg', '.png', '.gif'):
raise forms.ValidationError('图片格式必须为jpg、png或gif')
return url

下一场再运营测验:

$ python manage.py test depotapp.ProductTest

Creating test database for alias 'default'...
....
----------------------------------------------------------------------
Ran 4 tests in 0.060s

OK
Destroying test database for alias 'default'...

测量试验通过,何况经过单元测验,大家开掘并消除了八个bug。

 

你也许感兴趣的篇章:

  • 接受Python的Django框架结合jQuery实现AJAX购物车页面
  • Python的Django REST框架中的系列化及诉求和再次回到
  • 详细解释Python的Django框架中的templates设置
  • Python使用django获取客商IP地址的秘籍
  • 分析Python的Django框架的运作格局及处理流程
  • Django1.7+python 2.78+pycharm配置mysql数据库教程
  • python常用web框架轻巧品质测量检验结果分享(饱含django、flask、bottle、tornado)
  • python django集成cas验证系统
  • 教你哪些将 Sublime 3 构建成 Python/Django IDE开荒利器
  • 详细解释Python的Django框架中manage命令的利用与扩充

Python中的单元测量试验 我们先来回想一下Python中的单元测验方法。 上边是叁个Py…

http://www.xuliangwei.com/ http://www.nnzhp.cn

  cmdb

    cmdb

    cmdb

  1.    
    第一篇:初识Python

  2.  
    其次篇:python底子之大旨风格

  3.  
    其三篇:python底子之数据类型与变量

  4.  
    第四篇:python底工之标准和巡回

  5. 第五篇:python根基之字符编码

  6. py编码终极版 
    苑昊先生

 
 Py西游攻关之函数 
  苑昊先生

 
 Py西游攻关之装饰器  苑昊先生

 
 Py西游攻关之IOmodel 苑昊先生

  1.  
    第六篇:python根基之文件管理

  2.   第七篇
    python功底之函数,递归,内置函数

  3.   第八篇
    迭代器左券和生成器

  4.   第九篇
    装饰器

  5. 第十篇
    面向对象的顺序设计

  6.   第十意气风发篇
    面向对象进级

  7.   第十七篇
    至极管理

  8.   第十七篇
    python根基之socket编制程序

  9.  
    常用模块

  10.  
    模块与包

  11.  
    过程与线程

17_1
   经过与线程理论底蕴

17_2
   Cpython解释器协助的进度与线程

  1.  
    函数草稿

18_1   
 selenium模块

  1.  
    常用模块

  2.  
    Py西游攻关之模块

  3.  
     多线程与多进度

  4.  
    Py西游攻关之RabbitMQ、Memcache、Redis

  5.  
    前者底蕴之html

  6.  
      前面一个幼功之CSS

  7.  
      JavaScript
    功底学习1

  8.  
      前面三个学习之jquery

26_1.      
Django-ajax

   jQuery

       jQuery网址

  1.  
        Python开采【第十八篇】:MySQL(生机勃勃卡塔尔国

  2.  
        Python开拓【第十九篇】:MySQL(二卡塔尔国

  3.  
        Python开采【第十六篇】:Python操作MySQL

       目录补充

  1.  
      数据库基本功

  2.  
      数据库进级

  3.    
        MySQL练习题

  4.            
        MySQL演习题参考答案

  5.    
       Python之路【第十八篇】:Django【底工篇】

  6.    
       Python之路【第十二篇】:Django【升级篇

35_1.
    Django之Model操作

35-2   s10期Tornao分享

35-3   
  Django知识点整理

发表评论

电子邮件地址不会被公开。 必填项已用*标注