澳门至尊网站-首页

您的位置:澳门至尊网站 > 软件综合 > 对Python的Django框架中的项目进行单元测试的方法

对Python的Django框架中的项目进行单元测试的方法

2019-10-16 15:27

 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知识点整理

35-4       Django之Form组件

35-5         python s12 day13 JavaScript、Dom和jQuery

35-6         Python生成随机验证码

35-7     Django之ModelForm组件

35-8               Tyrion中文文档(含示例源码)

 

  1.        Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

  2.        Python开垦【第十六篇】:AJAX全套

37_1      KindEditor

  1.        Python开采【第十五篇】:Web框架之Tornado

39            python 之路,Day12 - redis缓存数据库

武沛齐tornado博客:

              Python之路【第十八篇】:Web框架们

        首先篇:白话tornado源码之一个剧本引发的血案

        其次篇:白话tornado源码之待必要阶段

        其三篇:白话tornado源码之央求来了

        第四篇:白话tornado源码之褪去模板外衣的前戏

        第五篇:白话tornado源码之褪去模板的门面

  1.      Python之路,Day14 - It's time for Django

  2.      Python之路,Day15 - Django适当晋级篇

                Py西游攻关之Django(一)   苑昊先生

  1.     Bootstrap框架(一)

  2.     Bootstrap框架(二)

  3.     Bootstrap框架(三)

  4.     Django~1

      Django基础(一)

  1.     Http协议

  2.          Python CMDB开发

46-1         CMDB开发

  1.          CMDB源码使用须知

47_1        CMDB资产收集

47_2              Ali云api调用做轻巧的cmdb

  1.        python 之路,Day27 - 主机管理+沟壍机系统开拓

  2.       Python之路,Day12 - 那就做个壁垒机呢

  3.     Python之路,Day20 - 布满式监察和控制系统开荒

  4.     Python之路,Day19 - CMDB、CMDB、CMDB

  5.     Python之路,Day18 - 开荒贰个WEB聊天来撩妹吧

  6.     Python之路,Day17 - 分分钟做个BBS论坛

54.

     [Django之路

品类实战之<教育行当CRM开垦>]()

55.           爬虫  Q2Day81

 55_1       爬虫   Q2Day79

     python s12 day2

   http的伸手和响应进程2

  http的哀求和响应进程3

    python s12 day3

  MongoDB学习笔记(一)MongoDB概述和装置

    JavaScript、Dom、jQuery

    Django验证码【附源码】

         Django REST framework

 Django篇:

  web框架本质 

  Django 安装使用基础

  Django(二)路由系统、视图、模板 

  Django(三) ORM 数据库操作

  Django(四) ORM 外键操作及初识Ajax

  Django(五)母版承接、Cookie、视图装饰器等

  Django(六)Session、CSRF、中间件

  Django(七)缓存、信号、Form

  Django(八)上:Model操作和Form操作

  Django(八)下:Model操作和Form操作、类别化操作

  Django(九)上:ModelForm操作

  Django(九)下:Ajax操作、图片验证码、KindEditor使用

 

linux:

samba配置:

 

ubuntu:

mysql启停:

mysql开启3306端口:

安装pip:

 

python:

线程指南:

一行python达成互相之间:

memcache的权重原型代码:

PEP8 Python 编码标准整治:

  

Django:

django web框架:

django 初叶化数据库:

django 央求及参数字传送递:

django model报错:

django框架学习-Model进级用法:

 

前端:

天帅大神的html详解:http://www.cnblogs.com/luotianshuai/p/5159449.html

jquery: 

JavaScript、Dom、jQuery:

bootstrap-modal:http://www.bkjia.com/webzh/1037178.html 

 

Echarts:

离线使用echarts及片段细节:

 

银角脑残粉必备 :

目录:

JavaScript、Dom、jQuery:

django基础:

django基础2:

爬虫:

51:

 20170622博客:      Django部分剧情(武沛齐)

金角高手那几个未有人来会见的博客:

linux基础:

面试题:

 

python模块

1.pywin32 

2.Microsoft Visual C++ 9.0 is required  Unable to find vcvarsall.bat的消除措施:

 

git

1.

2.

 

本文由澳门至尊网站发布于软件综合,转载请注明出处:对Python的Django框架中的项目进行单元测试的方法

关键词:

  • 上一篇:没有了
  • 下一篇:没有了