Python学习笔记(八)测试

参考资料:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140137128705556022982cfd844b38d050add8565dcb9000
今天学习了Python支持的两种测试模式:单元测试和文档测试。

1、单元测试。单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。Python提供了编写和运行单元测试用例的机制。
       (1)为了编写单元测试,我们需要引入Python自带的unittest模块。
       (2)编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承。
      (3)以test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行。对每一类测试都需要编写一个test_xxx()方法。
     (4)由于unittest.TestCase提供了很多内置的条件判断,我们只需要调用这些方法就可以断言输出是否是我们所期望的。常用的断言包括:
       assertEquals(表达式1,表达式2):如果表达式1=表达式2,则测试通过,否则抛出异常。
       with assertRaises(错误类型):
              ...
       如果执行...部分代码时能抛出指定的错误类型则测试通过,否则抛出异常。
       (5)一旦编写好单元测试,我们就可以运行单元测试。最简单的运行方式是测试代码的最后加上两行代码:
if __name__ == '__main__':
    unittest.main()
这样就可以把测试代码当作正常的Python脚本运行。
       另一种更常见的方法是在命令行通过参数-m unittest直接运行单元测试。
    (6)此外,可以在单元测试中编写两个特殊的setUp()和tearDown()方法。这两个方法会分别在每调用一个测试方法的前后分别被执行。
2、文档测试。Python支持直接在要测试的代码注释中给出测试范例,然后以文档测试模式运行待测试的代码。
下面是我的学习代码:
#定义一个待测试的类
class MyDict(dict):
    '''
    Simple dict but also support access as x.y style.

    >>> d1 = MyDict()
    >>> d1['x'] = 100
    >>> d1.x
    100
    >>> d1.y = 200
    >>> d1['y']
    200
    >>> d2 = MyDict(a=1, b=2, c='3')
    >>> d2.c
    '3'
    >>> d2['empty']
    Traceback (most recent call last):
        ...
    KeyError: 'empty'
    >>> d2.empty
    Traceback (most recent call last):
        ...
    AttributeError: 'MyDict' object has no attribute 'empty'
    '''
    def __init__(self, **kw):
        super(MyDict, self).__init__(**kw)
    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"'MyDict' object has no attribute '%s'" % key)
    def __setattr__(self, key, value):
        self[key] = value
#加入下面的代码后,运行该代码文件时,即可执行在注释中给出的测试范例
if __name__ == '__main__':
    #引用文档测试模块
    import doctest
    doctest.testmod()
下面的代码,定义了一个针对MyDict类的单元测试。
import unittest
import time

from day8 import MyDict

class MyDictTest(unittest.TestCase):
    def setUp(self):
        print 'start TestCase at ', time.strftime('%Y-%m-%d %H:%M:%S:%',time.localtime(time.time()))
    def tearDown(self):
        print 'end TestCase at ', time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
    #测试用例1 测试继承自dict的基本操作
    def test_init(self):
        d = MyDict(a = 1, b = 'test')
        self.assertEquals(d.a, 1)
        self.assertEquals(d.b, 'test')
        self.assertTrue(isinstance(d, dict))
    #测试用例2 测试继承自dict的属性用法
    def test_key(self):
        d = MyDict()
        d['key'] = 'value'
        self.assertEquals(d.key, 'value')
    #测试用例3 测试MyDict的属性用法
    def test_attr(self):
        d = MyDict()
        d.key = 'value'
        self.assertEquals(d['key'], 'value')
    #测试用例4 测试继承自dict的属性访问不存在的情况
    def test_keyerror(self):
        d = MyDict()
        with self.assertRaises(KeyError):
            value = d['empty']
    #测试用例5 测试MyDict的属性访问不存在的情况
    def test_attrerror(self):
        d = MyDict()
        with self.assertRaises(AttributeError):
            value = d.empty

if __name__ == '__main__':
    unittest.main()
有点疑问,在上面代码的setUp和tearDown定义中,怎么能知道当前执行的是哪个测试用例呢?
今天就学到这里啦,下一节从IO编程学起。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值