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) # 需要一个测试报告