来自 威尼斯国际官方网站 2019-09-11 14:53 的文章
当前位置: 威尼斯国际官方网站 > 威尼斯国际官方网站 > 正文

对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的事态),运转后开采:

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.伍仟000000000001 不等于期望值 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)是相比好的做法,极端的事态依然重申“测量试验先行”。现在我们早已有了第二个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知识点整理

本文由威尼斯国际官方网站发布于威尼斯国际官方网站,转载请注明出处:对Python的Django框架中的项目进展单元测量试验的

关键词: