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

 bootstrap cdn在线地址

对Python的Django框架中的项目开展单元测试的不2诀要,pythondjango

 Python中的单元测试

咱俩先来回想一下Python中的单元测试方法。
下边是1个 Python的单元测试轻巧的例子:

尽管我们开采3个除法的意义,有的同学可能感觉极粗略,代码是那般的:

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
模块,能够很有益地张开测试,详细情形能够作品最后的链接,看官方网站文书档案的事无巨细介绍。

上面是3个归纳的言传身教:

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的情事),运营后发觉:

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.二除以叁 等于 1.500000000000000一 不对等期望值 一.肆

九除以四等于2,不等于期望的 2.25

上面大家正是要修复这个主题材料,再一次运营测试,直到运维不报错甘休。

比如说依照实际景况,要是大家只供给保留到小数点后五位,能够那样改:

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

重国民党的新生活运动行就不报错了:

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

 
OK

Django中的单元测试

火速进行单元测试(UnitTest)是相比较好的做法,极端的情况依然重申“测试先行”。将来我们早就有了第一个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
肆th》中,七.二节,最后落实的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框架的周转格局及处理流程
  • Django一.柒+python 2.7捌+pycharm配置mysql数据库教程
  • python常用web框架简单质量测试结果分享(包涵django、flask、bottle、tornado)
  • python django集成cas验证系统
  • 教你哪些将 Sublime 三 营形成 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. 第5篇:python基础之字符编码

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

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

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

 
 Py西游攻关之IOmodel 苑昊先生

  1.  
    第5篇:python基础之文件管理

  2.   第捌篇
    python基础之函数,递归,内置函数

  3.   第九篇
    迭代器协议和生成器

  4.   第九篇
    装饰器

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

  6.   第玖一篇
    面向对象进阶

  7.   第10贰篇
    分外管理

  8.   第73篇
    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开垦【第九7篇】:MySQL(1)

  2.  
        Python开拓【第拾捌篇】:MySQL(2)

  3.  
        Python开辟【第捌九篇】:Python操作MySQL

       目录补充

  1.  
      数据库基础

  2.  
      数据库进阶

  3.    
        MySQL练习题

  4.            
        MySQL练习题参考答案

  5.    
       Python之路【第九6篇】:Django【基础篇】

  6.    
       Python之路【第九7篇】:Django【进阶篇

35_1.
    Django之Model操作

35-2   s10期Tornao分享

35-3   
  Django知识点整理

发表评论

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