类的测试于函数的测试类似,但也有些许不同。
先写出一个用于测试的类,并存储在diaocha.py
中:
class Dc():
'''收集匿名调查问卷'''
def __init__(self,question):
self.question = question
self.responses = []
def printquestion(self):
‘’‘打印问题’‘’
print(self.question)
def store_res(self,newres):
‘’‘存储答案’‘’
self.responses.append(newres)
def show_results(self):
‘’‘打印全部答案’‘’
for i in self.responses:
print(i)
接下来我们编写测试,用于测试Dc中的方法store_res()能否正常存储答案:
import unittest
from diaocha import Dc
class TestDc(unittest.TestCase):
def test_oneres(self):
'''测试存储一个答案'''
question = "你是中国人嘛?"
mydiaoche = Dc(question)
mydiaoche.store_res('是')
self.assertIn('是',mydiaoche.responses)
def test_more_res(self):
'''测试存储多个答案'''
question = '你是中国人?'
mydiaocha = Dc(question)
huida = ['是','ok','你猜']
for i in huida:
mydiaocha.store_res(i)
for j in huida:
self.assertIn(j,mydiaocha.responses)
unittest.main()
使用断言assertIn判断一个item是不是在list中,结果如下:
..
----------------------------------------------------------------------
Ran 2 tests in 0.002s
OK
两个测试都通过了!
在上面两个测试中,每次我们都需要创建Dc的实例,每个方法中都需要创建答案,做了很多重复的工作。
可以使用unittest.TestCase类包含的方法setUp()简化代码。
import unittest
from diaocha import Dc
class TestDc(unittest.TestCase):
def setUp(self):
question = '你是中国人吗?'
self.mydiaocha = Dc(question)
self.huida = ['是','ok','你猜']
def test_oneres(self):
self.mydiaocha.store_res(self.huida[0])
self.assertIn(self.huida[0],self.mydiaocha.responses)
def test_more_res(self):
for i in self.huida:
self.mydiaocha.store_res(i)
for j in self.huida:
self.assertIn(j,self.mydiaocha.responses)
unittest.main()
如果TestCase中包含了方法setUp(),那么Python将先运行它,再运行test_打头的方法。 我们在setUp()方法中,创建了Dc的实例和存储答案的列表,只不过它们都包含前缀self,也就是说,我们把它们存储在属性中,这样,就可以在这个类中的任何一个地方使用它们了。