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 ...
随机推荐
- leetcode:Palindrome Number (判断数字是否回文串) 【面试算法题】
题目: Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could neg ...
- mysql分表方法-----MRG_MyISAM引擎分表法
一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来具体说说分表的一些方法.眼下我所知道的方法都是MYISAM的,INNODB怎样做分表而且保留事务和外键,我还不是 ...
- Android设置里面默认存储器选项(default write disk)的实现
原生的Android设置里面没有默认存储器的选项,可是MTK偏偏加上了这个功能,可能MTK认为这个比較实用吧,所以,他们在原生的基础上面做了改动.加上了这个功能.可是高通平台没有这个功能.相对MTK来 ...
- 论js闭包的重要性
很久没写博客了,今天发现了一个很有意思的问题,写下来分享一下 话不多说,贴前端代码: <script type="text/javascript" src="js/ ...
- Dev系列控件的AJAX (转)
介绍Dev系列控件在前台也就是客户端的一些常用方法介绍以及前后台异步通信的方法. 一.Dev Data Edit控件通用属性以及方法: 属性 1.GetEnabled():返回控件是否为可操作状态 2 ...
- css实现垂直居中6种方法
在一次次笔试,一次次的面试中,问到垂直居中的问题太多太多,但是我每一次回答,都好像都不能让面试官太满意,今天特意花点时间,整理一下css垂直居中问题. 1.如果是单行文本.看代码: <!DOCT ...
- (转)url重写
使用URLRewriter.dll后,根本不需要使用任何代码,我之前做的项目就是用的做URL重写的,其实不是进化,其实表面上看是.html扩展名而已,当然你还可以用其他的任意扩展名下面是你的配置 &l ...
- Java_观察者模式(Observable和Observer) -转
原文地址: Java_观察者模式(Observable和Observer) 一.观察者模式介绍 在Java中通过Observable类和Observer接口实现了观察者模式.一个Observer ...
- java比较器Comparator 使用
PresonDemo package cn.stat.p5.person.demo; public class PresonDemo implements Comparable { private S ...
- bestcoder r44 p3 hdu 5270 ZYB loves Xor II
这是昨晚队友跟我说的题,不知道当时是什么玄幻的事件发生了,,我看成了两两相乘的XOR 纠结了好长时间间 不知道该怎么办 今天早上看了下这道题,发现是两两相加的XOR 然后就想了想昨晚的思路 发现可做 ...