目录
一、框架概念
1、什么是unittest?
unittest是python自带的单元测试框架。pytest也是在它的基础上去实现的。
2、unittest的4个核心组件
TestCase:测试用例类,用来定义测试用例函数的
TestSuite:测试套件,用来收集测试用例的
TestRunner:测试用例运行类,用来执行测试用例的,以测试套件的维度去执行
TestFixture:测试脚手架,用来做前置条件和后置处理的
3、测试流程
1)先定义测试用例类,在测试用例类中写测试方法。使用TestCase
2)收集要执行的测试用例类或者文件里边的测试方法,放在测试套件中。使用TestSuite
3)将收集好的测试套件放在测试用例运行器中去执行,并收集测试结果。使用TestRunner
4)做好前置条件和后置处理。使用TestFixture
注:这里涉及一个面试题,你用unittest是怎么去做自动化测试的?
4、如何写测试用例?(TestCase)
1)导入模块 import unittest
2)定义一个测试用例类:类名必须Test开头(别的名称会被python认为不是测试用例,就不会收集)
3)定义测试方法:测试方法也必须是Test开头,必须写在测试用例类里头
4)框架执行入口:unittest.main()会自动收集当前py文件中的测试用例,然后执行(但是再后续的实践中,我们不会使用该方法,该方法可以用来调试当前用例类)
例如:
import unittest
class TestDemo(unittest.TestCase):
# test命名的默认为测试用例
def test_01(self):
print("测试用例01")
def test_02(self):
print("测试用例02")
if __name__ == '__main__':
unittest.main()
执行结果解读:
5、测试用例包含哪些东西?
1)前置条件(如果没有可以不写):sql语句的执行,创建各种连接,工具类的实例化
2)测试步骤(业务逻辑):数据替换、数据驱动等
3)测试结果断言:响应结果断言、数据库断言
4)后置条件(如果没有可以不写):数据清理、数据库连接关闭
注:下边我们按照从易到难的顺序进行概述讲解。
二、前后置概述
1、类级别的前后置
1)前置:当前测试用例类中的测试用例执行之前执行一次
@classmethod
def setUpClass(cls):
print("类级别的前置(类方法)")
2)后置:当前测试用例类中的测试用例执行之后执行一次
@classmethod
def tearDownClass(cls):
print("类级别的后置(类方法)")
例如:
import unittest
class TestDemo(unittest.TestCase):
# 定义类级别的前置
# 因为是继承TestCase类中的方法,源码中此方法为类方法,所以继承过来也是类方法
@classmethod
def setUpClass(cls):
print("类级别的前置(类方法)")
# 同前置,写后置
@classmethod
def tearDownClass(cls):
print("类级别的后置(类方法)")
# test命名的默认为测试用例
def test_01(self):
print("测试用例01")
def test_02(self):
print("测试用例02")
if __name__ == '__main__':
unittest.main()
结果解析:(我这里打印的顺序是不对的,代码的执行顺序是先前置再用例最后是后置)
2、函数级别的前后置
1)前置:每个测试用例执行之前执行一次
def setUp(self):
print("函数级别的前置")
2)后置:每个测试用例执行之后执行一次
def tearDown(self):
print("函数级别的后置")
例如:
import unittest
class TestDemo(unittest.TestCase):
# 函数级别的前置
def setUp(self):
print("函数级别的前置")
# 函数级别的后置
def tearDown(self):
print("函数级别的后置")
# test命名的默认为测试用例
def test_01(self):
print("测试用例01")
def test_02(self):
print("测试用例02")
if __name__ == '__main__':
unittest.main()
结果解读:
3、类级别的前后置可以和函数级别的前后置同时存在
那么运行的时候,就是类前置->函数前置->测试用例->函数后置->....->类后置
感兴趣的小伙伴可以自己写写试一下,在这里我就不赘述了
三、用例的执行顺序概述
1、根据ascii码一位一位去对比,小的先执行
查看ascii码的方法:
# 打印ascii码
print(ord("a"))
# 将ascii码转换为对对应的值
print(chr(97))
常用顺序:0-9 < A-Z < a-z
2、测试用例类中的话,先执行测试函数、再执行测试文件
四、断言概述
1、概念
1)继承TestCase类的断言方法
2)自动化基本只能用到这个,判断是否相等:self.assertEqual(1,2)
2、断言的特点
1)unittest以程序运行过程中是否抛出异常来判断用例执行是否成功
2)如果断言失败,程序会抛出异常,框架会把这个用例标记为失败
3)只要程序执行过程中出现其他异常,框架也会去捕获并将用例标记为失败
3、异常的捕获与抛出
1)手动去捕获异常的话,框架会默认这条用例是通过的,因为异常被捕获没有抛给框架
import unittest
class TestDemo(unittest.TestCase):
# test命名的默认为测试用例
def test_01(self):
print("测试用例01")
# 1==2吗?
try:
# 断言判断1==2?
self.assertEqual(1, 2)
except Exception as e:
# 打印捕获到的异常
print("失败", e)
def test_02(self):
print("测试用例02")
if __name__ == '__main__':
unittest.main()
执行结果:两条用例都通过,把捕获到的异常打印了出来
2)将捕获到的异常抛给框架,让框架把用例标记为失败
import unittest
class TestDemo(unittest.TestCase):
# test命名的默认为测试用例
def test_01(self):
print("测试用例01")
# 1==2吗?
try:
self.assertEqual(1, 2)
except Exception as e:
print("失败", e)
# 将捕获到的异常抛给框架
raise AssertionError(e)
def test_02(self):
print("测试用例02")
if __name__ == '__main__':
unittest.main()
执行结果: 一条通过、一条失败。异常抛给框架去标记失败用例
4、补充断言
方法 | 检查点 |
self.assertEqual(a,b) | a==b |
self.assertNotEqual(a,b) | a!=b |
self.assertTrue(a,b) | bool(x) is True |
self.assertFalse(a,b) | bool(x) is False |
self.assertIn(a,b) | a in b |
self.assertNotIn(a,b) | a not in b |
self.assertIs(a,b) | a is b |
self.assertIsNot(a,b) | a is not b |