初学Python的学习笔记12----单元测试、文档测试和文件读写

1.单元测试

单元测试是用来对一个模块、一个函数或者一个类类进行正确性检验的测试工作

(1)编写单元测试

# 编写一个Dict类,可以通过属性来访问
class Dict(object):
    def __init__(self, **kw):
        super().__init__(**kw)

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"'Dict' object has no attribute '%s'" % key)

    def __setattr__(self, key, value):
        self[key] = value

# 编写单元测试
import unittest

from mydict import Dict

class TestDict(unittest.TestCase):

    def test_init(self):
        d = Dict(a = 1, b = 'test')
        self.assertEqual(d.a, 1)            # 最长用的断言:assertEqual()
        self.assertEqual(d.b, 'test')
        self.assertTrue(isinstance(d, dict))

    def test_key(self):
        d = Dict()
        d['key'] = 'value'
        self.assertEqual(d.key, 'value')

    def test_attr(self):
        d = Dict()
        d.key = 'value'
        self.assertEqual('key' in d)
        self.assertEqual(d['key'], 'value')

    def test_keyerror(self):
        d = Dict()
        with self.assertRaises(KeyError):       # 另一种断言:assertRaises(),期待抛出指定类型的Error
            value = d['empty']

    def test_attrerror(self):
        d = Dict()
        with self.assertRaises(AttributeError):
            value = d.empty

(2) 运行单元测试

1)方法一:在写的单元测试的文件,如webtest.py的最后两行添加代码

if __name__ == '__main__'
     unittest.main()

class Dict(object):
    def __init__(self, **kw):
        super().__init__(**kw)

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"'Dict' object has no attribute '%s'" % key)

    def __setattr__(self, key, value):
        self[key] = value


import unittest

from mydict import Dict

class TestDict(unittest.TestCase):

    def test_init(self):
        d = Dict(a = 1, b = 'test')
        self.assertEqual(d.a, 1)            # 最长用的断言:assertEqual()
        self.assertEqual(d.b, 'test')
        self.assertTrue(isinstance(d, dict))

    def test_key(self):
        d = Dict()
        d['key'] = 'value'
        self.assertEqual(d.key, 'value')

    def test_attr(self):
        d = Dict()
        d.key = 'value'
        self.assertEqual('key' in d)
        self.assertEqual(d['key'], 'value')

    def test_keyerror(self):
        d = Dict()
        with self.assertRaises(KeyError):       # 另一种断言:assertRaises(),期待抛出指定类型的Error
            value = d['empty']

    def test_attrerror(self):
        d = Dict()
        with self.assertRaises(AttributeError):
            value = d.empty

if __name__ = '__main__'
    unittest.main()

2)方法二:在命令行通过参数 -m unittest直接进行单元测试

python -m unittest 1120-0.py

(3)setUp与tearDown

class Dict(object):
    def __init__(self, **kw):
        super().__init__(**kw)

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"'Dict' object has no attribute '%s'" % key)

    def __setattr__(self, key, value):
        self[key] = value


import unittest

from mydict import Dict

class TestDict(unittest.TestCase):

    def test_init(self):
        d = Dict(a = 1, b = 'test')
        self.assertEqual(d.a, 1)            # 最长用的断言:assertEqual()
        self.assertEqual(d.b, 'test')
        self.assertTrue(isinstance(d, dict))

    def test_key(self):
        d = Dict()
        d['key'] = 'value'
        self.assertEqual(d.key, 'value')

    def test_attr(self):
        d = Dict()
        d.key = 'value'
        self.assertEqual('key' in d)
        self.assertEqual(d['key'], 'value')

    def test_keyerror(self):
        d = Dict()
        with self.assertRaises(KeyError):       # 另一种断言:assertRaises(),期待抛出指定类型的Error
            value = d['empty']

    def test_attrerror(self):
        d = Dict()
        with self.assertRaises(AttributeError):
            value = d.empty

    # 添加setUp和tearDown
    def setUp(self):            # 调用测试方法前被执行
        print('setUp...')

    def tearDown(self):         # 调用测试方法后被执行
        print('tearDown...')

2.文档测试

在写注释的时候,添加这样的内容,告诉函数的调用者该函数的期望输入和输出

def abs(n):
    '''
    Function to get absolute value of number.
    Example:
    >>> abs(1)
    1
    >>> abs(-1)
    1
    >>> abs(0)
    0
    '''

    return n if n >=0 else (-n)

"文档测试"(doctest)模块可以直接提取注释中的代码并执行测试。 doctest严格按照Python交互命令行的输入输出来判断测试结果是否正确,只有测试异常的时候,可以用...表示中间一大段烦人的输出。

例如:

class Dict(dict):
    '''
    Simple dict but also support access as x.y style.

    >>>d1 = Dict()
    >>>d1['x'] = 100
    >>>d1.x
    100
    >>>d1.y = 200
    >>>d1['y']
    200
    >>>d2 = Dict(a=1, b=2, c='3')
    >>>d2.c
    '3'
    >>>d2['empty']
    Traceback(most recent call last):
        ....
    KetError:'empty'
    >>>d2.empty
    Traceback(most recent call last):
        ...
    AttributeError:'Dict' object has no attribute 'empty'
    '''

    def __init__(self, **kw):
        super(Dict, self).__init__(**kw)

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise Attribute(r"'Dict' object has no attribute '%s'" % key)

    def __setattr__(self, key, value):
        self[key] = value

if __name__ == '__main__':
    import doctest
    doctest.testmod()

3.文件读写

(1)读文件

1)读取文件

# 打开文件  f = open('文件名', '标示符')
f = open('/Users/michael/test.txt', 'r')
# 读取文件的全部内容,Python把内容读到内存
f.read()
# 关闭文件
f.close()

2)读取文件的两种写法 a.第一种

try:
    f = open('/path/to/file', 'r')
    print(f.read())
finally:
    if f:
        f.close()

b.第二种

with open('/path/to/file', 'r') as f:
    print(f.read())

3)读取文件的注意事项

# 如果文件很小,read()一次性读取最方便
 # 如果不能确定文件大小,反复调用read(size)比较保险
 # 如果是配置文件,调用readlines()最方便
  for line in f.readlines():
      print(lines.strip())

(2).file-like Object

open()函数返回的这种有个read()方法的对象

(3).二进制文件

f = open('/User/michael/test.jpg', 'rb')
print f.read()

(4).字符编码

1)读取非UTF-8编码的文本文件 例如:传入GBK编码的文件

f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
print f.read()

2)遇到编码错误后的处理

f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')

(5)写文件:和读文件操作差不多

# 'w':写文本文件
# 'wb':写二进制文件
with open('/Users/michael/test.txt', 'w') as f:
    f.write('Hello, world!')

转载于:https://my.oschina.net/yj1993/blog/1576224

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值