Discuss / Python / 单元测试

单元测试

Topic source

Mr_RightMen

#1 Created at ... [Delete] [Delete and Lock User]
class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score
    def get_grade(self):
        if self.score >= 60 and self.score < 80:
            return 'B'
        elif self.score >= 80 and self.score <=100:
            return 'A'
        elif self.score >= 0 and self.score <60:
            return 'C'
        else:
            raise ValueError('Wrong score.')
# 我们写好代码之后,往往需要写一些单元测试来测试程序是否满足我们的需求
# 这时候引入python自带的unittest模块,写一个测试模块
# 写一个测试类,从unittest.TestCase继承
# 每一类测试都需要编写一个test_xxx()方法
# 常用的断言是assertEqual(),判断函数返回结果是否和给出的结果相等
# assertTrue(),返回的结果是否为True
# assertRaise(KeyError),期待抛出指定类型的Error,比如说,当一个条件不满足时,抛出KeyError
# 实际例子
# mydict.py
class Dict(dict):

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

    def __getattr__(self, key):
        try:
            return self[key]
            # 这里我们定义了一个AttributeError
        except KeyError:
            raise AttributeError(r"'Dict' object has no attribute '%s'" % key)

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

#mydict_test.py
import unittest

from mydict import Dict

class TestDict(unittest.TestCase):

    # 另外,我们还可以在单元测试中写两个特殊的方法setUp,setDown,这两个方法会分别在没调用一个测试方法的前后分别执行
    # 比如我们要测试一个跟数据库有关的程序时,就可以在setUp中链接数据库,在setDown中关闭数据库
    def setUp(self):
        print('setUp...')

    def tearDown(self):
        print('tearDown...')

    def test_init(self):
        d = Dict(a=1, b='test')
        # 断言部分,d.a 是否为1
        self.assertEqual(d.a, 1)
        self.assertEqual(d.b, 'test')
        # 断言部分,d是否为一个dict
        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.assertTrue('key' in d)
        self.assertEqual(d['key'], 'value')

    def test_keyerror(self):
        d = Dict()
        # 这里我们就期待返回我们程序中定义的KeyError
        with self.assertRaises(KeyError):
            value = d['empty']

    def test_attrerror(self):
        d = Dict()
        # 这里我们就期待返回我们程序中定义的AttributeError
        with self.assertRaises(AttributeError):
            value = d.empty

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


# 写好测试模块后,我们可以使用 python -m unittest mydict_test来直接运行单元测试
# 用这种方法,可以依次批量运行多个单元测试

很详细,谢谢

赞一个


  • 1

Reply