# -*- 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高级编程之我不测试的更多相关文章

  1. Python高级编程之生成器(Generator)与coroutine(二):coroutine介绍

    原创作品,转载请注明出处:点我 上一篇文章Python高级编程之生成器(Generator)与coroutine(一):Generator中,我们介绍了什么是Generator,以及写了几个使用Gen ...

  2. python高级编程:有用的设计模式3

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...

  3. python高级编程:有用的设计模式2

    # -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...

  4. python高级编程:有用的设计模式1

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...

  5. python高级编程技巧

    由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr  ...

  6. python高级编程之选择好名称:完

    由于时间关系,python高级编程不在放在这边进行学习了,如果需要的朋友可以看下面的网盘进行下载 # # -*- coding: utf-8 -*- # # python:2.x # __author ...

  7. python高级编程读书笔记(一)

    python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...

  8. python高级编程之列表推导式

    1. 一个简单的例子 在Python中,如果我们想修改列表中所有元素的值,可以使用 for 循环语句来实现. 例如,将一个列表中的每个元素都替换为它的平方: >>> L = [1, ...

  9. Python高级编程-Python一切皆对象

    Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 ""&qu ...

随机推荐

  1. JavaScript经典魔力代码

    是什么使得JavaScript不同于其他程序设计语言,在浏览器修饰方面表现出其优异的特性?毫无疑问,JavaScript在Web应用领域受到的好评,既源于它自身灵活的动态特性,也源于浏览器对它充分的支 ...

  2. Android Fragment详解(二):Fragment创建及其生命周期

    Fragments的生命周期 每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件. 对应生命周期可参考下图: 创建片元(Creating a Fragment) To c ...

  3. A.indexOf(array[i])表达的含义

    userAgentInfo.indexOf(Agents[v]): //A.indexOf(array[i]):A元素是否存在于数组array里面:如果存在就会返回对应的下标,如果不存在则返回-1. ...

  4. 关于.net根目录路径的问题

    今天做了一个项目,用了url重写,但是在本地目录是localhost/BK/index.aspx,而其他目录也必须带bk,不带的话就找不到页面,(iis里正常) 应该主目录去掉bk,设置方法,右击网站 ...

  5. c - 对数组进行排序(通过指针的指针)

    通过指针的指针,以及一个指针数组,对实际数组元素进行排序,有一个优点,就是排序过程交换的只有指针数组中的值,而不是实际的数组的元素.当实际元素中的对象很大,特别是结构体等类型时,这样做是很有好处. 下 ...

  6. ArcGIS Server 9.3 安装(win7).

    概述: 安装的过程还不算复杂,但是有个地方需要注意:就是防火墙.需要将 "本机的防火墙" 关掉, 并将 "杀毒软件关闭"(360和avira都会乱来,搞得我安了 ...

  7. 使用UIPageControl UIScrollView制作APP引导界面

    1. 新建两个视图控制器类(继承自UIViewController), 在AppDelegate.m中指定根视图控制器 #import "AppDelegate.h" #impor ...

  8. php多文本框提交

    <form action="" method="post"><input type=text name=name[]><input ...

  9. JQuery获取当前屏幕的高度宽度

    JQuery获取浏览器窗口宽高,文档宽高的代码,使用jquery的朋友可以参考下. <script type="text/javascript"> $(document ...

  10. Guava API学习之Preconditions优雅的检验参数 编辑

    在日常开发中,我们经常会对方法的输入参数做一些数据格式上的验证,以便保证方法能够按照正常流程执行下去.对于可预知的一些数据上的错误,我们一定要做 事前检测和判断,来避免程序流程出错,而不是完全通过错误 ...