# -*- 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. [ACM] POJ 1442 Black Box (堆,优先队列)

    Black Box Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7099   Accepted: 2888 Descrip ...

  2. Laravel资料

    http://laravel-cn.com/http://www.golaravel.com/docs/4.1/quick/https://github.com/search?q=Laravel&am ...

  3. javaScript模块化一

    1. Module模式的基本特性 A) 模块化 可重用   B) 封装了变量和function 和全局的namespace不接触 松耦合.   C) 只暴露可用public的方法 其他私有方法全部隐藏 ...

  4. Multi-touch.

    TP(Multi-touch). 1.Win7有6个版本,分别如下. Windows 7 Starter (初级版)                                        不支 ...

  5. Docker远程访问get(root)shell姿势

    0x00 概述 在用swarm来管理dockers容器集群时默认开启了2375端口,通过远程访问docker run -H tcp://ip:2375 $command 可任意执行docker命令.这 ...

  6. linux查看系统版本

       RHEL7.0以下,查看系统版本的方式: [rusky@rheltest1 ~]$ cat /proc/version Linux version -.el6.x86_64 (mockbuild ...

  7. F# 可以把几个函数组合成新函数

    C#能做的,F#基本都能做,但F#能做的,C#未必能做. F#中的函数可以把几个函数组合起来使用.下面的例子是把由 function1 和 function2 这两个函数通过运算符“>>” ...

  8. SpringMVC学习简单HelloWorld实例

    首先还是从一个简单的Hello World项目说起: 我机器的开发环境为: Ubuntu12.04(不同操作系统对本系列项目没有影响): 开发工具:Eclipse For JavaEE: 数据库:My ...

  9. C# List<T>转为 DataTable

    // remove "this" if not on C# 3.0 / .NET 3.5 public static System.Data.DataTable ConvertTo ...

  10. C#结构函数与base关键字

    //声明父类 class ProductsFather { public double Price { get; set; } public int Count { get; set; } publi ...