# !/user/bin/env Python3
# -*- coding:utf-8 -*-
"""
file:MyDic.py
create time:2018/5/24 16:28
desc: 用于单元测试,可以通过属性方法访问内部元素的Dic
"""
class Dict(dict):
"""
可以通过属性方法访问内部元素的Dic
"""
def __init__(self, **kw):
"""
初始化
:param kw:初始化字典信息
"""
super().__init__(**kw) # 使用dic的初始化方法初始化对象
def __getattr__(self, item):
"""
获取属性
:param item:key
:return: key值对应的属性
"""
try:
return self[item]
except KeyError as e:
raise AttributeError(r"Dict has not %s attribute" % item)
def __setattr__(self, key, value):
"""
设置属性值
:param key:key
:param value: 属性新值
:return:
"""
self[key] = value
# !/user/bin/env Python3
# -*- coding:utf-8 -*-
"""
file:MyDic_Test.py
create time:2018/5/24 16:33
desc: 用于测试通过属性获取值的字典类的单元测试类
"""
import unittest
from UnitTest.MyDic import Dict
class TestDict(unittest.TestCase):
"""
测试类需要从Unittest.TestCase继承
测试方法需要以test开头,否则不被认为是测试方法,测试时不会被执行
unittest.TestCase提供了很多内置条件判断用于辨别我们的方法是否达到我们的预期
最常用的断言:
assertEqual(arg1,agr2),用于判断arg1是否等于arg2
assertRaises(ErrorClass),用于判断抛出的是否是指定类型的Error,一般与with一起使用
单元测试中还有两个特殊的方法:setUP()和tearDown(),这两个方法会在分别调用每一个测试方法的前后分别执行
"""
def setUp(self):
print('begin')
def tearDown(self):
print('end')
def test_init(self):
"""
初始化测试
:return:
"""
d = Dict(a=1, b='test')
self.assertEqual(d.a, 1)
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.assertTrue('key' in d)
self.assertEqual(d['key'], 'value')
def test_keyerror(self):
d = Dict()
with self.assertRaises(KeyError):
value = d['empty']
def test_attrerror(self):
d = Dict()
with self.assertRaises(AttributeError):
value = d.empty
# 运行单元测试,还可以在命令行中通过-m unittest直接运行单元测试 python -m unittest MyDict_Test
if __name__ == '__main__':
unittest.main()