Python内置框架:unittest
- unittest包含4个部分:TestCase-编写测试用例、TestLoader-加载测试用例、TestSuit-测试套件、TextTestRunner-运行测试用例,结果保存在:TextTestResult
- unitest框架编写测试用例,测试类必须继承:unittest.TestCase
- 测试用例函数必须以:test 开头,代表是一个用例
- unittest执行用例的顺序:ascii码一位一位去对比,小的先执行
前置与后置
- 函数级别:setUp()、tearDown()
- 类级别:setUpClass()、tearDownClass()–需要用:@classmethod 装饰器装饰
收集测试用例
- 首先需要创建测试套件:suit = unittest.TestSuite()
- 单个测试用例收集:
suit.addTest(测试类("用例名"))
- 按用例列表集合添加:testcase = [测试类(“用例名1”), 测试类(“用例名2”)]
suit.addTests(testcase)
- 按用例列表集合添加:testcase = [测试类(“用例名1”), 测试类(“用例名2”)]
- 按测试文件/路径收集:unittest.TestLoader()–测试加载,一般用例创建测试套件和加载测试用例,将搜索的测试用例加载到测试套件中。TestLoader()提供了以下加载测试用例的方式:
-
unittest.TestLoader().loadTestsFromTestCase(测试用例类)
— 根据testcase类名寻找用例 -
unittest.TestLoader().loadTestsFromModule(模块名,pattern=None)
— 根据testcase所在的文件名寻找用例 -
unittest.TetsLoader().loadTestsFromName(测试用例名,module=None)
— 根据用例名称寻找用例- 用例名的写法:“文件名.类名.用例名”
-
unittest.TestLoader().loadTestsFromNames(names, module=None
) — 根据多个用例名称寻找用例 -
unittest.defaultTestLoader().discover(start_dir,pattern="test*.py",top_level_dir=None)
— 根据正则规则匹配路径下符合规则的文件及文件中所有的用例 - 以上的方法步骤都一样,只是在加载用例的地方替换成对应的方法即可:如下代码示例:
import unittest # 导入unittest from static.fff import example1 # 从 testcase目录下的fff.py文件中导入example1实例类 from static import fff # 从static目录下导入fff文件 import os current_directory_path = os.getcwd() # 获取当前目录的路径,因为用例fff.py文件存放在当前目录下 # -------------------------test loader部分--------------------- load_case = unittest.defaultTestLoader.discover(start_dir=current_directory_path, pattern='fff*.py') # 加载当前目录下的fff开头的文件下的测试用例 # --------------------------test suit部分----------------------------------------- suite = unittest.TestSuite() # 构建测试套件 suite.addTest(load_case) # 添加test load收集到的test case到suite中 # --------------------------test runner部分------------------------------------- runner = unittest.TextTestRunner(verbosity=0) runner.run(suite) # 将suit放入runner中执行 # verbosity :表示测试结果的信息详细程,一共三个值,默认是1 # 0 (静默模式):你只能获得总的测试用例数和总的结果 比如 总共100个 失败20 成功80 # 1 (默认模式):非常类似静默模式 只是在每个成功的用例前面有个 . 每个失败的用例前面有个 F # 2 (详细模式):测试结果会显示每个测试用例的所有相关的信息
- 步骤:
- 加载测试用例
- 创建测试套件
- 将加载的测试用例添加到测试套件中
- 创建运行用例示例
- 将测试套件给run()方法,去执行用例
-
测试结果提取/测试报告
- 执行用例代码:
runner = unittest.TextTestRunner() result = runner.run() # 返回的是:TextTestResult,父类是:TestResult。
- 类:TextTestResult 父类:TestResult。有很多的方法和属性,可以获取执行完用例的结果的一些具体的信息
- 测试报告:使用第三方库:BeautifulReport或HTMLTestRunner。以前者为例
import unittest # 导入unittest from testcase.fff import example1 # 从 testcase目录下的fff.py文件中导入example1实例类 from BeautifulReport import BeautifulReport # 导入BeautifulReport库 # -------------------------test loader部分--------------------- load_case = unittest.TestLoader().loadTestsFromTestCase(example1) # 加载example1类下的所有用例 # ------------------------test suit部分-------------------------- suite = unittest.TestSuite() # 构建测试套件 suite.addTest(load_case) # 将test_cases列表添加到suite中 # ------------------------生成测试报告----------------------------- BeautifulReport(suite).report(filename='测试报告文件名称', description='测试报告标题', report_dir='.') # report_dir='.'把report放到当前目录下
数据驱动实现
- unittest没有提供数据驱动,或者参数化的库,需要使用到第三方库:ddt、paramunittest
- 用法示例:
# 使用unittest前,需导入unittest库 import unittest # 导入ddt import ddt # -------------------------参数化的参数------------------- test_data = [{'username':'张三', 'psw':'123456'}, {'username': '李四', 'psw': '321654'}, {'username': '王五', 'psw': '654321'},] # ---------------------------testcase部分------------------- # 实例化example类,并继承于unittest.TestCase @ddt.ddt class example1(unittest.TestCase): def test_a01(self): print('测试用例1') @ddt.data(*test_data) def test_a02(self, data): print('测试用例2') print(data) # ---------------------------test runner部分------------------- if __name__ == '__main__': # 执行当前文件的测试用例 unittest.main()