测试代码之测试类

类的测试于函数的测试类似,但也有些许不同。

测试类

先写出一个用于测试的类,并存储在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

两个测试都通过了!

方法setUp()

在上面两个测试中,每次我们都需要创建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,也就是说,我们把它们存储在属性中,这样,就可以在这个类中的任何一个地方使用它们了。