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 ...
随机推荐
- int与Integer
int 是基本类型,直接存数值 integer是对象,用一个引用指向这个对象 1.Java 中的数据类型分为基本数据类型和复杂数据类型 int 是前者>>integer 是后者(也就是一个 ...
- 对list集合去重操作
import java.util.ArrayList; import java.util.List; //删除集合中重复的数据 public class RemoteTheSameDataInList ...
- leetcodequestion_56 Merge Intervals
Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6],[8, ...
- 使用boost中的线程池
#include <boost/thread/thread.hpp>#include <boost/bind.hpp>#include <iostream> u ...
- 零基础学习云计算及大数据DBA集群架构师【Linux系统配置及网络配置2015年12月30日周三】
/Mon *************摘要************** 计划任务 )一次性计划任务 服务:atd 命令:at 服务存放文件:/etc/init.d/atd 系统配置文件:/etc/at. ...
- 忘记mysql 5.7的密码
for windows: http://blog.chinaunix.net/uid-27570589-id-3511820.html 一.将net stop mysql; 二.在命令行中 C:\Us ...
- oracle之时间转换
:取得当前日期是本月的第几周 SQL> select to_char(sysdate,'YYYYMMDD W HH24:MI:SS') from dual; TO_CHAR(SYSDATE,'Y ...
- html hack 列表
<!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--> <!--[if IE]> 所有的IE可识别 <![ ...
- 贴近浏览器窗口右侧的jqueryui dialog快速从左侧调整大小时对话框大小设置不准确的问题
之前在做两个相同的页面的事件同步时发现了这个问题,现在把它记录下来. 一.问题描述 页面中的jqueryui对话框,如果把它拖动到靠近浏览器窗口右侧边缘,并快速从对话框左侧调整对话框窗口大小时,对话框 ...
- wordpress禁止调用官方Gravatar头像调用ssl头像链接提升加载速度
在主题中的functions.php文件末尾加上以下代码即可(外观>编辑>functions.php) //官方Gravatar头像调用ssl头像链接 function get_ssl_a ...