unittest单元测试框架
1.导入unittest包
========================================================================
2.创建类的时候要继承与unittest.TestCase类
2.1,setUp方法是在类中测试执行前的初始化工作
2.2,tearDown方法是在类中测试执行后的清除工作
2.3,测试用例函数以test开头的方法是普通的测试用例方法,
按照ACSII码的顺序加载测试用例,数字与字母的顺序为:0~9,A~Z,a~z
2.4,在主入口main中,使用unittest.main()方法执行以test开头的方法
注意: 在执行的时候应以run下的指定模块执行,不能以unittest in 模块执行,不然会重复执行
========================================================================
3.设置断言
可以在测试用例的函数中设置
self.assertEqual(4,demo02_calc.sum(2,2),"测试sum是否pass")
常用的断言
self.assertEqual(4,4) # 判断是否相等
self.assertTrue(a) # 判断是否为真
self.assertIn("马怒",name) # 判断是否在里面
self.assertGreater(4,2) # 判断是否大于
========================================================================
4,忽略用例:
@unittest.skip("无条件跳过"),
@unittest.skipIf(True,"条件为真时跳过")
@unittest.skipUnless(False,"条件为假False则跳过"),
@unittest.expectedFailure # 执行失败不计入失败的数量中
========================================================================
5,测试用例执行顺序:(在不使用测试套件的情况下是按照ASCII码的顺序执行,使用测试套件就按照测试套件的添加顺序执行)
5.1,方法一:(通过addTest方法执行(通过测试套件执行的不以test开头的用例也可执行))
在main的主入口中创建测试套件的实例 :suite = unittest.TestSuite()
然后通过实例使用addTest(类名(方法名))方法按照顺序执行测试用例(一条一条用例执行)
suite.addTest(类名("方法名1"))
suite.addTest(类名("方法名2"))
suite.addTest(类名("方法名3"))
unittest.main(defaultTest="suite")
或者(同方法一类似,写测试套件的方法,如下)
把unittest.Testsuite写成方法
def suite():
suite = unittest.TestSuite()
suite.addTest(test_case("test_bbb")) # addTest(类名(“方法名称”))
suite.addTest(test_case("ccc"))
return suite
if __name__ == '__main__':
unittest.main(defaultTest="suite")
5.2,方法二:(unittest.makeSuite()添加整个测试类)
if __name__ == '__main__':
# 注意:此时不是以test开头的方法不会被添加进测试套件中
# 注意:makeSuite 可能需要手动添加
suite = unittest.TestSuite(unittest.makeSuite(test_case)) # 里面是类名
unittest.main(defaultTest="suite")
5.3,方法三(unittest.TestLoader().loadTestsFromName()添加整个.py文件下的测试类)
if __name__ == "__main__":
# 通过TestLoader中字符串的方法加载用例
# 1,增加一个测试用例 模块名称.类名.方法名称
# suite = unittest.TestLoader().loadTestsFromName("demo11_测试套件4.test_case1.test_aaa")
# 2,增加整个测试类
# suite = unittest.TestLoader().loadTestsFromName("demo11_测试套件4.test_case1")
# 3,增加整个.py模块下所有的测试类
suite = unittest.TestLoader().loadTestsFromName("demo11_测试套件4")
unittest.main(defaultTest='suite')
5.4,方法四(创建多个子套件然后整合到一个大的主套件中):
先通过导入别的py模块的包,然后创建多个子套件
在创建一个主套件,把多个子套件通过addTest()方法添加到主套件中
import unittest
from unittest框架 import demo11_测试套件4
from unittest框架 import demo08_测试套件1
# 依次创建多个套件
# 1,单个用例套件
suite01 = unittest.TestLoader().loadTestsFromName('demo08_测试套件1.test_case.test_aaa')
# 2,整个类
suite02 = unittest.TestLoader().loadTestsFromName("demo08_测试套件1.test_case")
# 3,整个.py模块
suite03 = unittest.TestLoader().loadTestsFromName("demo11_测试套件4")
main_suite = unittest.TestSuite() # 主套件
main_suite.addTest(suite01) # 添加子套件到主套件中
main_suite.addTest(suite02)
main_suite.addTest(suite03)
unittest.main(defaultTest="main_suite")
5.5,方法五:(使用discover()来实现添加执行整个目录下所有的测试用例)
首先导入需要的包,然后通过os找到all_case目录的路径,在通过unittest.defaultTestLoader.discover()方法,匹配到所有的用例
再创建一个套件,通过addTest(discover)方法添加discover,最后在unittest.main(defaultTest="main_suite")执行
import os
import unittest
import HTMLTestRunner
import time
curren_path = os.path.dirname(__file__)
print(curren_path)
case_path = os.path.join(curren_path,"all_case")
# 从当前路径回到上一层路径
# case_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
print(case_path)
discover = unittest.defaultTestLoader.discover(start_dir=case_path, # 用例路径
pattern="*_case*.py",
top_level_dir=None) # 文件类型
# print(discover)
main_suite = unittest.TestSuite()
main_suite.addTest(discover)
unittest.main(defaultTest="main_suite")
========================================================================
6,在使用unittest.main()方法执行代码
6.1 如果使用测试套件要用 unittest.main(defaultTest="suite")
========================================================================
7,unicode码转成中文
name.encode("utf-8").decode("unicode_escape") # 转码成中文
========================================================================
8,导入HTMLTestRunner包,用来生成测试报告
# 执行并生成测试报告
# 加个时间戳
now = time.strftime("%y-%m_%d_%H_%M_%S_",time.localtime(time.time()))
file_obj = open("D:/pythonProject/P7_P8_Requests/"
"unittest框架/test_report/"
"{}test_report.html".format(now),"w+",encoding="utf-8")
# 创建测试报告对象,将执行的过程写入到file_obj中
runner = HTMLTestRunner.HTMLTestRunner(stream=file_obj,
title="第一次的测试报告",
description="我是测试报告的描述信息")
runner.run(main_suite)
========================================================================
详细信息的展示unittest.main(verbosity=2)
0 (静默模式): 你只能获得总的测试用例数和总的结果。
1 (默认模式): 非常类似静默模式 只是在每个成功的用例前面有个“.” 每个失败的用例前面有个 “E”
2 (详细模式):测试结果会显示每个测试用例的所有相关的信息 并且 你在命令行里加入不同的参数可以起到一样的效果
测试用例的方法下面---写上测试的注释信息---在报告中体现出来
self._testMethodName = "API_CASE_01"
self._testMethodDoc = "验证获取token接口能否正常调用"
Python接口自动化测试零基础入门到精通(2023最新版)