unittest框架
什么是框架?
框架英文单词framework,为解决一类事情的功能集合。需要阿钊框架的规定去书写代码
什么是unittest框架
unittest是python自带的单元测试框架。
和pytest框架的区别:pytest框架是需要另外单独安装的
对于测试来说,他的作用是执行用例代码的框架。也就是说使用unittest框架来管理,运行多个测试用例的
TestCase(测试用例)
每个TestCase都是一个代码文件,在这个代码文件中,书写真正的用例代码
TestCase注意事项:
- 测试用例类需要继承unittest.TestCase
- 测试方法必须以test开头
- 代码文件的名字必须按照标识符的规则来书写
- 文件内容的开头,使用注释说明该文件的作用
代码示例:
import unittest#导包 class TestDemo(unittest.TestCase):#继承了testcase def test_case01(self):pass#方法名需要以test开头 def test_case02(self):pass
TestSuite(测试套件)
testsuite是把测试用例汇总起来,需要配合TestRunner一起使用才能运行
import unittest suite = unittest.TestSuite()#先将testsuite实例化,拿到一个suite对象 # 添加测试用例的方式有多种 #第一种添加方式,直接将测试用例类中的所有测试方法添加进来 suite.addTest(unittest.makeSuite(要执行的测试用例类名)) #第二种添加方式,一次添加一条用例,效率低。但是可以结合*(通配符)使用。 suite.addTest(测试类名('方法名'))
TestRunner(测试执行)
注意点:
- 实例化执行对象时,unittest后面的是TextTestRunner()
import unittest suite = unittest.TestSuite()#先将testsuite实例化,拿到一个suite对象 suite.addTest(unittest.makeSuite(要执行的测试用例类名))#添加测试用例 runner = unittest.TextTestRunner()#实例化一个执行对象 runner.run(suite)#调用执行对象中的run方法,将添加完测试用例的测试套件作为参数传过去。
TestLoader(测试加载)
TestLoader是什么:TesetLoader(测试加载),作用和TestSuite是一样的,是对TestSuite的补充,用来组装测试用例的
什么场景使用testloader:比如testcase的代码文件有很多
import unittest #加上discover返回的是一个suite对象,不加的话是返回的是一个testloader对象。 #discover是查找的意思。 #接收两个参数,分别是用例路径和用例的文件名。 # 用例路径推荐使用相对路径;文件名可以结合通配符使用。如:test*,*.py。 suite = unittest.TestLoader.discover('用例所在的路径','用例的代码文件名') # 这样写和前面也是一样的效果 suite = unittest.defaultTestLoader('用例所在的路径','用例的代码文件名') runner = unittest.TextTestRunner() runner.run(suite)
FixTure(测试夹具)
是一种代码结构
下面这些方法的名字是固定的,必须要这么写,且大小写也要保持一致。因其本质是重写了父类的方法,所以名字一定要保持一样。否则就不是重写的意义了。
方法级别的
在每个测试方法(测试用例)执行之前/之后都会自动调用的结构
代码示例
import unittest class TestDemo(unittest.TestCase): def setUp(self):#在每个测试用例执行之前会先执行setUp里面的内容 print('------setUp里面的内容-------') def tearDown(self):#在每个测试用例执行之后,会执行tearDown里面的内容 print('------tearDown里面的内容------') def test_case01(self): print('第一条测试用例') def test_case02(self): print('第二条测试用例') 执行结果: Ran 2 tests in 0.006s OK ------setUp里面的内容------- 第一条测试用例 ------tearDown里面的内容------ ------setUp里面的内容------- 第二条测试用例 ------tearDown里面的内容------ Process finished with exit code 0
类级别的
在每个测试类中所有方法执行前后 都会自动调用的结构(在整个类执行之前和执行之后各一次)
import unittest class TestDemo(unittest.TestCase): @classmethod def setUpClass(cls): print('-----类中方法执行前-----') @classmethod def tearDownClass(cls): print('-----类中方法执行后-----') def test_case01(self): print('第一条测试用例') def test_case02(self): print('第二条测试用例') 执行结果 OK -----类中方法执行前----- 第一条测试用例 第二条测试用例 -----类中方法执行后----- Process finished with exit code 0
模块级别的fixture
在每个代码文件执行前后执行的代码结构
什么是模块:每个代码文件都是一个模块
import unittest def setUpModule():#在模块执行之前会先执行这个方法中的代码。方法名必须是这个 print('---在模块执行前先执行这句话---') def tearDownModule():#在模块执行之后会执行这个方法中的代码。方法名必须是这个 print('---在模块执行之后要执行这句话') class TestDemo(unittest.TestCase): def test_case01(self): print('第一条测试用例') def test_case02(self): print('第二条测试用例') 执行结果: OK ---在模块执行前先执行这句话--- 第一条测试用例 第二条测试用例 ---在模块执行之后要执行这句话 Process finished with exit code 0
断言
什么是断言?
让程序代替认为判断测试程序执行结果是否符合预期结果的过程
百度百科介绍:断言(assertion)是一种在程序中的一阶逻辑(如:一个结果为真或假的逻辑判断式),目的为了表示与验证软件开发者预期的结果——当程序执行到断言的位置时,对应的断言应该为真。若断言不为真时,程序会中止执行,并给出错误信息。
assertEqual
self.assertEqual('预期结果','实际结果')#判断预期结果和实际结果是否相等。相等,用例通过;不相等,用例不通过,抛出异常。
assertIn
self.assertIn('预期结果', '实际结果') # 判断预期结果是否包含在实际结果中 # 包含,用例通过,不包含,用例不通过,抛出异常
参数化
unittest框架本身是不支持参数化的,想使用参数化,需要安装插件来完成。
下载方法一:pip install parameterized
下载方法二:pycharm中下载
下载完成如何验证
验证方法一:pip list。会显示所有的插件,如果这里面有parameterized说明安装成功了
验证方法二:导包验证,找个python文件import一下,如果有提示就说明安装成功了
使用参数化实例
跳过
对于一些未完成的或者不满足测试条件的测试函数和测试类。不想执行它,可以使用跳过的方法。使用装饰器完成。
跳过的两种方式
直接跳过@unittest.skip()
给要跳过的测试用例加上装饰器@unittest.skip()
符合条件的跳过@unittest.skipIf()
在想要跳过的测试用例前面增加装饰器@unittest.skipIf()
skipIf()接收两个参数:1.条件表达式。2.跳过原因
代码演示:
import unittest version_code = 30 class TestDemo(unittest.TestCase): @unittest.skip('跳过原因') # 直接将测试用例标记成跳过 def test_case01(self): print('test_case01') # skipIf()根据条件判断测试函数是否跳过,符合条件就跳过。 # skipIf方法接收两个参数。首先是判断表达式,其次是跳过的原因 @unittest.skipIf(version_code > 1, '版本号大于1,所以不执行') def test_case02(self): print('test_case02') def test_case03(self): print('test_case03') 执行结果: OK (skipped=2) Skipped: 跳过原因 Skipped: 版本号大于1,所以不执行 test_case03 Process finished with exit code 0
测试报告
有两种测试报告
第一种是:unittest自带的测试报告
只有单独运行TestCase的代码,才会生成测试报告。通过testrunner执行时不会生成。
第二种是:HTMLTestRunner
需要单独下载,是一个第三方的类库。用来执行测试用例,并生成测试报告。
注意:使用HTMLTestRunner生成报告,就不能使用unittest自带的testrunner了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步