python高级编程之我不测试
# -*- coding: utf-8 -*-
__author__ = 'Administrator'
#测试驱动开发(高级编程处学习,第11章)
#测试驱动开发也叫TDD, 是制造高质量软件的一种简单技术,在python社区被广泛应用,在静态语言中使用更多。
#我不测试
"""
测试驱动开发原理:将在代码编写测试之前进行测试
比如开发人员要编写一个计算一系列的数学平均值函数,就会首先编写几个实例,得到预想要的效果,如下
"""
#assert average(1,2,3)==2
#assert average(1,-3)==-2
#提供以下函数,来实现这个方法
def average(*num):
return sum(num)/len(num)
assert average(1,2,3)==2
assert average(1,-3)==-1
#a:缺陷或者非预期的结果会得下以下问题
#assert average(0,1)==.5 AssertionError
#出现a问题时,可以对应修改代码,如下
def avg(*a):
num=[float(a)for a in a]
return sum(num)/len(num)
assert avg(0,1)==.5
#更多测试
# try:
# avg()
# except TypeError as s:ZeroDivisionError: integer division or modulo by zero
# #出现一个异常
# pass
def avg1(*a):
if a==():
raise TypeError(('you need to provide at'
'least one num'))
num=[float(a)for a in a]
return sum(num)/len(num)
try:
avg1()
except TypeError as s:
pass
#然后我们可以到指定的函数里面进行收集测试,在每次运行时,进行修改,如下:
def test():
assert avg1(1,2,3)==2
assert avg1(1,-3)==-1
assert avg1(0,1)==.5
try:
avg1()
except TypeError:
pass
test()
#每次修改时,test() and avg1()将一起修改,并且每次 运行以确认所有 测试仍然有效通过,所什么测试 包放在tests文件夹中,每个模块在那里都可以有与之对应的测试模块
#以下几个好处4个:
#a避免软件退化
#退化的原因:是因为无法在某个点猜测代码库中某个修改可能导致的结果,修改一些代码可能会破坏其他有,也有出现可怕的副作用,比如对数据产生破坏
#解决方法:就是在每次修改时对应软件所有功能进行测试
#将代码库开发给多个开发人员将会放大这个问题,因为每个人都无法完全 了解所有 开发活动,虽然版本控制系统能够避免这个问题,但无法避免所有不必要的交互
#TDD有助于减少软件退化,整个软件可以在每次修改之后进行自动测试,只要每个功能都有合适的测试集能做到这一点,当真正实现TDD时,测试库和代码库将一起增长
#因为完整的测试可能相当长的时间,所以将其委托给buidbot是个好做法,它可以是后台执行这项工作
#b增进代码
"""
在编写 一个新的模块,函数,或者类时,开发耸人关注于如何编写p-x以及如何生成最佳代码,但当他聚焦于算法时,可能会忘记看用户的想法:他的函数何时,如何使用,参数使用是否简便和有逻辑性,API名称是否正确?
运用前面所学业的技巧,比如选择好名称,就可以使其具有效率,可用方法是进行测试,这是开发人员意识到所写代码是否有逻辑性和易于使用的时机,往往,在模块,类或者函数完成之后,马上会发生第一次重构
编写测试时,也就是代码的一个具体使用场景,对于获取 此类用户观点是有的,因而,开发人员使用TDD往往能够生成孤代码
测试计算很复杂又带副作用函数是困难的,注重测试的代码在编写时应该具有更清晰和模块的结构
"""
#提供最佳的开发人员文档
"""
测试是开发人员学习软件工作方法最佳途径,主要是针对使用场景阅读它们,能够对代码的工作方法建立快速而且深入的观察,有时候,一个例子值一千句话
始终与代码库一起更新的测试,能够将生成的软件氘能拥有最好的开发人员文档,测试不会像文档一样静止不动,否则会失效
"""
#更快地产生健壮的代码
"""
不进行测试将会导致需要很长的调试时间,在软件的一个部分缺陷可能会在“风马牛不相及”的另一个部分中发现,测试失败是对付小缺陷更好时机
因为可以获得提示以了解问题真正所在,而且测试往往比调试更有兴趣,因它是工作
"""
##哪一类测试
#2个测试
#1:验收测试(也叫功能测试)
"""
在一个周期之外编写,以验证应用程序符合要求,一般像针对软件的一个检查列表,但这样的情况是TDD不能完成的,需要由管理人员或者客户来完成(概念)
"""
#测试工具有几个如下
"""
应用程序 selenium(用于javascript的web ui)
web应用程序 zope.testbrowser(不测试js)
wsgi应用程序 paste.test.fixture(不测试js)
gnome桌面应用程序 dogtail
win32桌面应用程序 pywinauto
更多功能测试工具列表,访问以下页面:<http://www.pycheesecake.org/wiki/>
如图(因为有些网站可能会无法访问)
"""
#2:单元测试
"""
是很合适TDD方法的低层级测试,它们关注于单个模块,并且为之提供测试,糨不涉及其他任何模块。测试将模块和应用程序的其余部分隔开,当需要外部项时(比如数据库),将由仿真或者模拟对象来代替
python标准测试工具
a1:unittest(https://docs.python.org/2.7/library/unittest.html?highlight=unittest#module-unittest)
最初由steve purcell编写(以前这民pyunit)
a2:doctest(https://docs.python.org/2.7/library/doctest.html?highlight=doctest#module-doctest)一个文字测试工具
"""
#a1:它的功能junit和java所做一切相同,提供一个名为TestCae基类,用来验证调用输出很大的方法集,如下:
import unittest as t
class T1(t.TestCase):
def test_avg(self):
self.assertEquals(avg1(1,2,3),2)
self.assertEquals(avg1(1,-3),-1)
self.assertEquals(avg1(0,1),.5)
self.assertRaises(TypeError,avg1)
#t.main()
#main函数是扫描上下文并查找从T1继承类,实例化这些类,然后运行
#如果av1在xx.py模块里面,那么test类被称为ut,并写入指定.py文件中
from unils import avg1
import unittest
class T1(unittest.TestCase):
def test_avg(self):
self.assertEquals(avg1(1,2,3),2)
self.assertEquals(avg1(1,-3),-1)
self.assertEquals(avg1(0,1),.5)
self.assertRaises(TypeError,avg1)
if __name__=='__main__':
unittest.main()
#这个例子进行返回在命令行下调用于__main__部分或者为测试运行程序所用的TS实例,这个脚本 在所有测试模块之外构建一个测试活动
class T1(unittest.TestCase):
def test_avg(self):
self.assertEquals(avg1(1,2,3),2)
self.assertEquals(avg1(1,-3),-1)
self.assertEquals(avg1(0,1),.5)
self.assertRaises(TypeError,avg1)
class T2(unittest.TestCase):
def test_another_thes(self):
pass
def test_suite():
def suite(t):
return unittest.makeSuite(t)
suite=unittest.TestSuite()
suite.addTest((s(T1),suite(T2)))
return suite
if __name__=='__main__':
unittest.main(defaultTest='test_suite')
#一般来说,通过一个全局脚本 就能够地所有的测试,它将在代码树上查找并运行测试,叫做测试发现
#doctest:是一个在交互命令行会话使用模块,用来从文档文件或者docstring中提取版本,并且回放它们,以检查实例中定稿的输出与实际输出相同,如下代码
import doctest
print doctest.testfile('test.tex',verbose=True)
#使用doctest有什么好处:
"""
包可以通过示例创建文档和测试
文档示例总是最新的
使用doctest中的示例来编写包
但是不要用doctest来单元测试过期,应该只被用于在文档中提供人类可读示例,也就是说:当洞彻关注低层级事务或者会使文档混乱的复杂测试装置时,不要使用它
"""
python高级编程之我不测试的更多相关文章
- Python高级编程之生成器(Generator)与coroutine(二):coroutine介绍
原创作品,转载请注明出处:点我 上一篇文章Python高级编程之生成器(Generator)与coroutine(一):Generator中,我们介绍了什么是Generator,以及写了几个使用Gen ...
- python高级编程:有用的设计模式3
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...
- python高级编程:有用的设计模式2
# -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...
- python高级编程:有用的设计模式1
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...
- python高级编程技巧
由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr ...
- python高级编程之选择好名称:完
由于时间关系,python高级编程不在放在这边进行学习了,如果需要的朋友可以看下面的网盘进行下载 # # -*- coding: utf-8 -*- # # python:2.x # __author ...
- python高级编程读书笔记(一)
python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...
- python高级编程之列表推导式
1. 一个简单的例子 在Python中,如果我们想修改列表中所有元素的值,可以使用 for 循环语句来实现. 例如,将一个列表中的每个元素都替换为它的平方: >>> L = [1, ...
- Python高级编程-Python一切皆对象
Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 ""&qu ...
随机推荐
- fetch策略
@OneToMany(mappedBy="image",cascade=CascadeType.ALL,fetch=FetchType.EAGER) @Fetch(value=Fe ...
- mac os使用lsusb命令和连接未知的Android设备
今天在mac上连接一个android设备发现连不上,adb devices看不到设备.于是想用lsusb命令看下,结果发现Mac居然没有这个命令,于是网上搜了下.发现了以下的命令system_prof ...
- [Docker] Install Docker on Windows (hp) and start with Kitematic
Well, on Windows costs a little bit effort to run docker. 1. You need to enable Virtulization: Oh hp ...
- 杭州电 1372 Knight Moves(全站搜索模板称号)
http://acm.hdu.edu.cn/showproblem.php?pid=1372 Knight Moves Time Limit: 2000/1000 MS (Java/Others) ...
- .NET基础拾遗(8)ADO.NET与数据库开发基础
1.1 ADO.NET支持哪几种数据源? ① System.Data.SqlClient .NET程序员最常用的了.通过OLEDB或者ODBC都可以访问,但是SqlClient下的组件直接针对MSSQ ...
- ComboTree( 树型下拉框) 组件
本节课重点了解EasyUI中Tree(树)组件的使用方法, 这个组件依赖于Combo(下拉框)和 Tree(树)组件.一. 加载方式//class 加载方式<select id="cc ...
- django: db howto - 2
继 django: db howto - 1 : 一 操作数据库的三种方式: [root@bogon csvt03]# python2.7 manage.py shell Python 2.7.5 ( ...
- (转)passwordStrength 基于jquery的密码强度检测代码使用介绍
使用很简单. 代码如下: $('#pass').passwordStrength(); XHTML 代码如下: <p><label>请输入密码:</label> ...
- IPointCollection,ISegmentCollection和IGeometryCollection
Engine 提供了三个主要的几何图形集合接口用于对几何对象的操作,分别是 IPointCollection,ISegmentCollection 和 IGeometryCollection,这些接口 ...
- iOS_SN_地图的使用(3)
地图的定位,记得不用定位的时候要关掉定位不然会一直定位,使电量使用过快. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional ...