必威-必威-欢迎您

必威,必威官网企业自成立以来,以策略先行,经营致胜,管理为本的商,业推广理念,一步一个脚印发展成为同类企业中经营范围最广,在行业内颇具影响力的企业。

LBForum是用django开发的论坛系统,01 python必威 s6

2019-11-14 21:19 来源:未知

 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.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)是比较好的做法,极端的情况甚至强调“测试先行”。现在我们已经有了第一个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。

 

需要的联系我,QQ:1844912514

1、LBForum

您可能感兴趣的文章:

  • 使用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...

 

01 python s6 day7 上节回顾
02 python s6 day7 SNMP使用
03 python s6 day7 大型监控架构讲解
04 python s6 day7 Redis使用
05 python s6 day7 定义监控文档结构
06 python s6 day7 监控架构讲解
07 python s6 day7 定义监控模板
08 python s6 day7 自定义监控项
09 python s6 day7 通过深copy实现各主机服务的自定义配置
10 python s6 day7 配置程序全局变量等信息
11 python s6 day7 使用redis订阅服务
12 python s6 day7 客户端编写
13 python s6 day7 客户端按不同频率监控各服务
14 python s6 day7 客户端将监控数据返回给服务器端
15 python s6 day7 作业需求说明

LBForum是用django开发的论坛系统,LBForum主要注重部署的方便性和易用性,功能方面目前还比较简单。 LBForum的开发尽量遵照Django可复用app原则,因此即使需要将LBForum做为独立的app集成到其他项目也并不会太难。主要功能:1、论坛分类,分版块;2、发帖,回帖;3、BBCode支持;4、置顶贴;5、使用django admin提供论坛管理功能。用Django写成,支持Python 2.7 和 3.4

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

 

L08-lesson08
01 python s6 day 8 上节回顾
02 python s6 day 8 接收客户端数据后写入Redis
03 python s6 day 8 处理监控数据
04 python s6 day 8 数据超过阀值后报警
05 python s6 day 8 编写监控数据处理模块
06 python s6 day 8 面向对象编程拾遗

项目源码地址:https://github.com/vicalloy/LBForum

  cmdb

第1周

L09-lesson09
01py s6 day9 html概述
02py s6 day9 头部标签
03py s6 day9 body内标签1
04py s6 day9 body内标签2(password和form表单)
05py s6 day9 body内标签3(label和列表)
06py s6 day9 body内标签3(table和fieldset)
07py s6 day9 body内标签5(内联和块级标签)
08py s6 day9 class and style selector
09py s6 day9 class background
10py s6 day9 class border display margin padding
11py s6 day9 class position
12py s6 day9 后台管理框架
13py s6 day9 作业、

Demo源码地址:https://github.com/vicalloy/lbforum-site

    cmdb

开课介绍

python发展介绍

第一个python程序

变量

字符编码与二进制

字符编码的区别与介绍

用户交互程序

if else流程判断

while 循环

while 循环优化版本

for 循环及作业要求

L11-lesson11
01 python s6 day 11 上节作业和读书分享
02 python s6 day 11 jQuery选择器
03 python s6 day 11 jQuery选择器eq和nth-child的区别
04 python s6 day 11 jQuery表单选择器
05 python s6 day 11 jQuery操作属性、css和返回顶部实例
06 python s6 day 11 jQuery过滤器、事件和扩展方法
07 python s6 day 11 jQuery模态对话框和ajax
08 python s6 day 11 eclipse环境的配置
09 python s6 day 11 MVC框架和python的WEB框架简介
10 python s6 day 11 Eclipse django 使用
11 python s6 day 11 创建Django project and app
12 python s6 day 11 Django用户注册和ajax请求

    cmdb

第2周

L12-lesson12
01 python s6 day 12上节作业
02 python s6 day 12 Django路由系统
03 python s6 day 12 Windows下Python-MySQL模块的安装
04 python s6 day 12 模型字段类型
05 python s6 day 12 增删改查过滤排序
06 day12 06 模版语言和跨站请求伪造1
07 day12 06 模版语言和跨站请求伪造2
08 python s6 day 12 模板extend和include

必威 1

本节鸡汤

模块初识

pyc是什么

python数据类型

bytes数据类型

列表的使用

元组与购物车程序练习

购物车程序练习实例

字符串常用操作

字典的使用

三级菜单实例

本周作业-购物车优化

L13-lesson13
01 python s6 登陆页面
010 python s6 Django装饰器扩展和作业
02 python s6 后台管理
03 python s6 用户管理列表中使用bootstrap的分页
04 python s6 Django中Form的使用
05 python s6 Django中Form的使用和源码分析
06 python s6 Django中间件的魔法和python的反射
07 python s6 Django中间件的练习
08 python s6 Django利用装饰器制造过滤器
09 python s6 Django装饰器和用户认证

2、3n1b

第3周

L14-lesson14
01 python s6 day14 BBS项目介绍
02 python s6 day14 设计表结构
03 python s6 day14 设计表结构02
04 python s6 day14 启用评论插件
05 python s6 day14 定制django admin
06 python s6 day14 使用Bootstrap
07 python s6 day14 展示BBS列表
08 python s6 day14 显示评论
09 python s6 day14 提交评论内容
10 python s6 day14 添加评论
11 python s6 day14 创建新帖
12 python s6 day14 实现BBS版块动态切换
13 python s6 day14 实现BBS版块动态切换2

3n1b,也称叁年壹班,是给大学生朋友们提供清新、自由、友好的交流平台的框架,界面类似http://f2e.im和http://v2ex.com,基于tornado、mysql、jinja2**

作业

上节内容回顾

集合及其运算

文件读与写详解

心灵鸡汤

文件修改详解

字符编码转换详解

函数与函数式编程

函数式编程之参数详解

局部变量与全局变量作用域

递归

函数式编程与函数不同

高阶函数

L15-lesson15
01 python s7 day15 上节作业
02 python s7 day15 web聊天室(一)
03 python s7 day15 web聊天室(二)
04 python s7 day15 web聊天室(三)
05 python s7 day15 web聊天室(四)
06 python s7 day15 web聊天室(五)
07 python s7 day15 web聊天室(六)
08 python s7 day15 web聊天室(七)
09 python s7 day15 web聊天室(八)
10 python s7 day15 带你走进分页的世界 (1)
11 python s7 day15 基础知识拾遗 (编码和反射)
12 python s7 day15 基础知识拾遗 (装饰器、随机验证码和时间格式)
13 python s7 day15 基础知识拾遗(re、os、sys和作业)

项目源码地址:https://github.com/3n1b-com/3n1b.com

第4周

L16-lesson16
01 python s6 day16 上节作业
02 python s6 day16 本次课程概要
03 python s6 day16 动态添加字段和方法经典类和新式类执行父类构造函数
04 python s6 day16 检查所有父类、怪异的__call__方法
05 python s6 day16 用type创建类
06 python s6 day16 用mytype创建类
07 python s6 day16 mytype中的__call__方法
08 python s6 day16 类的__new__方法
09 python s6 day16 自定义type创建类的梳理
10 python s6 day16 类的实例化过程的梳理
11 python s6 day16 安装tornado
12 python s6 day16 什么是session
13 python s6 day16 自定义session框架(一)
14 python s6 day16 自定义session框架二
15 python s6 day16 python索引器
16 python s6 day16 大型架构session框架
17 python s6 day16 tornado生命周期概述
18 python s6 day16 tornado源码解析一
19 python s6 day16 tornado源码解析二
20 python s6 day16 django和tornado的差异

上节内容回顾

心灵鸡汤

装饰器详解

装饰器应用详解

装饰器之函数即变量

装饰器之高阶函数

装饰器之嵌套函数

装饰器之案例剖析

装饰器之高潮讲解

迭代器与生成器

迭代器与生成器并行

内置方法详解

Json与pickle数据序列化

软件目录结构规范

本周作业

L17-lesson17
01 s6day 17 毕业项目课前思想
02 s6day 17 运维平台架构介绍
03 s6day 17 CMDB架构介绍
04 s6day 17 如何设计NB的表结构
05 s6day 17 设计表结构
06 s6day 17 创建项目
07 s6day 17 使用Restful API标准
08 s6day 17 Django rest framework的使用
09 s6day 17 开发符合Restful标准的接口
10 s6day 17 自动创建更新资产数据

必威 2

  1.     第一篇:初识Python

  2.   第二篇:python基础之核心风格

  3.   第三篇:python基础之数据类型与变量

  4.   第四篇:python基础之条件和循环

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

  6. py编码终极版  苑昊老师

第5周

L18-lesson18
01 s6 day18 世界上最安全的API接口验证
02 s6 day18 高度自定义的权限管理
03 s6 day18 监控模块架构介绍
04 s6 day18 定义监控模板等相关表结构
05 s6 day18 客户端自动汇报状态
06 s6 day18 监控历史数据的处理
07 s6 day18 实现异步无阻塞的思路
08 s6 day18 监控数据动态画图

3、Misago

TAG标签:
版权声明:本文由必威发布于必威-编程,转载请注明出处:LBForum是用django开发的论坛系统,01 python必威 s6