samo老师: unittest初始化实例和和执行用例实例


unittest 初始化方法

 每个方法执行一次

setUp(self)
tearDown(self)

每个类执行一次的方法 要加装修器
@classmethod
def setUpClass(cls)
@classmethod
def tearDownClass(cls) -> None:


# !/usr/bin python3                                 
# encoding: utf-8 -*-                            

# 对于unittest框架来说,他的测试必须以类的形式定义
import unittest

from lesson1117.operate import FileOperate
from lesson1117.stu_manager import Manager
from lesson1117.stu_operate import StusOperate
from lesson1117.student import Student


class TestStuOperateAdd(unittest.TestCase):

    # 通常情况下,有可能在每个测试用例执行前需要统一的做前置处理或者后置处理
    # setUp和tearDown里的代码的执行次数是和当前类下的测试用例方法个数一致的
    def setUp(self) -> None:
        #这里是做前置处理的,比如我们要先登录
        print('先完成登录')
        Manager.login('admin','123456')
    def tearDown(self) -> None:
        print('后置处理')
        print('退出系统')
        print('数据清理')


    # 在这里去实现测试用例
    # 测试方法必须以test开头,一个测试方法就可以认为是一条测试用例
    def test_add_stu(self):
        # 在这里实现目标的测试步骤
        # 正常添加学员
        # 如果数据是写死的,那么每次执行测试都要手动修改
        # 数据准备,可以将原有的数据清除
        StusOperate.del_stu('5')
        stu = Student('5','','17726633','9823874')
        result  = StusOperate.add_stu(stu)
        assert result == '添加成功' # assert的断言一旦失败,那么当前用例剩下的代码不会被执行
        # 函数调用已经完成,如何判断结果呢
        # 判断结果的这个过程,我们叫做断言
        # 手工做的时候打开文件看看这个学员信息是否已经出现
        # 那么代码呢,代码可以读取文件得到结果,判断结果是否正确
        stus_dict = FileOperate.read()
        assert '5' in stus_dict #这就是一个断言,先判断id是否在整体学员的字典中
        # 得到该学员信息,判断各项信息与期望值是否一致
        stu_info = stus_dict['5']
        assert stu_info.name == ''
        assert stu_info.phone == '17726633'
        assert stu_info.qq == '9823874'
    def test_add_stu_id_exist(self):
        # 这是id已存在
        stu = Student('4', '', '17726633', '9823874')
        result = StusOperate.add_stu(stu)
        # id已存在的结果如何判断,修改add_stu函数的返回结果,然后针对返回结果做判断
        assert result == '4已经存在无法添加'

class TestStuOperateChange(unittest.TestCase):
    # 当前类是专门用来测试修改学员的方法的
    # 对于修改了必须先有数据,才能修改
    # 所以我要先准备数据,让这些测试用例公用一条数据
    # 当你的测试类需要进行前置或者后置操作时,可以采用如下的函数
    # 类级别的前置和后置,在当前类下只会一次
    @classmethod
    def setUpClass(cls) -> None:# -> None指的是函数的返回值类型
        # 在这里进行数据准备
        stu = Student('6','沙1','177266331','98238741')
        StusOperate.add_stu(stu)
        print('类初始化')


    def test_change1(self):
        # 修改姓名
        StusOperate.change_stu('6',name='沙2')
        # 断言
        stus_dict = FileOperate.read()
        stu = stus_dict['6']
        assert stu.name == '沙2'
        pass
    def test_change2(self):
        pass
    @classmethod
    def tearDownClass(cls) -> None:
        # 当前类下所有的测试用例执行完成之后,做数据清理
        StusOperate.del_stu('6')
        print('类后置处理')
# if __name__ == '__main__':
#     suite = unittest.TestSuite()
#     # 这表示将TestStuOperateChange这个类里的test_change1加入到执行集合中
#     suite.addTest(TestStuOperateChange('test_change1'))
#     # 这表示将TestStuOperateAdd这个类里的test_add_stu加入到执行集合中
#     suite.addTest(TestStuOperateAdd('test_add_stu'))
#
#     # 执行器
#     runner = unittest.TextTestRunner()
#     runner.run(suite)

执行时如果文件被unitest 执行过,需要调试时就新建一个文件,来调用

以单条用例执行的方法

以文件匹配 *_test.py 结尾的文件匹配执行测试用例的方法

# !/usr/bin python3                                 
# encoding: utf-8 -*-                            
import unittest

from lesson1120.stu_operate_test import TestStuOperateChange, TestStuOperateAdd

if __name__ == '__main__':
    # suite = unittest.TestSuite()
    # # 这表示将TestStuOperateChange这个类里的test_change1加入到执行集合中
    # suite.addTest(TestStuOperateChange('test_change1'))
    # # 这表示将TestStuOperateAdd这个类里的test_add_stu加入到执行集合中
    # suite.addTest(TestStuOperateAdd('test_add_stu'))


    # 指定目录,匹配文件,加载测试用例
    suite = unittest.defaultTestLoader.discover('../lesson1120','*_test.py')

    # 执行器
    runner = unittest.TextTestRunner()
    runner.run(suite)

    # 需要一个测试报告