unittest是Python语言自带的单元测试框架,不仅适用于单元测试,还可以适用于web自动化测试,提供了很多断言方法,可以组织执行测试用例,生成测试结果等。
测试方法:setUp、tearDown执行每个测试方法都会执行一次setUp、tearDown
类级别:setUpClass、tearDownClass所有测试方法运行前运行后执行,使用@classmethod装饰器,整个测试过程只执行一次。
断言,就是让程序自己判断执行结果是否符合预期。
import unittest
class Test(unittest.TestCase):
def setUp(self) -> None:
# 每个测试方法前执行
print("setUp方法")
def tearDown(self) -> None:
# 每个测试方法后执行
print("tearDown方法")
@classmethod
def setUpClass(cls) -> None:
print("setUpClass每个类执行一次")
@classmethod
def tearDownClass(cls) -> None:
print("tearDownClass每个类执行一次")
def test_01(self):
a = 1
b = 2
c = a + b
self.assertEqual(c,3)
def test_02(self):
a = 2
b = 3
c = a*b
self.assertEqual(c,6)
if __name__ == '__main__':
# 调用main方法执行unittest内所有test开头的方法
unittest.main()
if __name__ == '__main__':
unittest.main()
suit = unittest.TestSuite() # 创建suit实例并构造测试用例集
suit.addTest(Test('test_01')) # Test为class名;test_01是class中的方法
suit.addTest(Test('test_02')) # 用例执行顺序,按照加载的顺序执行
runner = unittest.TextTestRunner()
# 使用run方法运行测试套件
runner.run(suit)
加载器TestLoader提供了以下几个方法来查找用例并批量加入测试套件:
suit = unittest.TestSuite()
loader = unittest.TestLoader() # 创建加载器对象
suit.addTest(loader.loadTestsFromTestCase(Test)) # 通过测试类加载测试
runner = unittest.TextTestRunner()
# # 使用run方法运行测试套件
runner.run(suit)
使用unittest.defaultTestLoader()类,通过该类下面的discover()方法自动搜索指定目录下指定开头 的.py文件,并将查找到的测试用例组装到测试套件。
test_dir='./'
# test_dir为要指定的目录 ./为当前目录;pattern:为查找的.py文件的格式
discover = unittest.defaultTestLoader.discover(test_dir,pattern='test_*.py')
runner = unittest.TextTestRunner()
runner.run(discover)
unittest的执行结果
单元测试完成后,可以将结果生成HTML测试报告。HTMLTestRunner是Python标准库的unittest模块的一个扩展。它生成易于使用的HTML测试报告。
1.下载HTMLTestRunner.py 链接: https://pan.baidu.com/s/1-iLHuHHbpuL1qdV3AMj6bA 提取码: w8og 也可以在github上搜索功能更强大的模板。
2.复制HTMLTestRunner.py文件到项目文件夹或者Python 安装路径下的lib文件夹。
示例
import unittest
from HTMLTestRunner import HTMLTestRunner
import time
class Test(unittest.TestCase):
def setUp(self) -> None:
# 每个测试方法前执行
print("setUp方法")
def tearDown(self) -> None:
# 每个测试方法后执行
print("tearDown方法")
@classmethod
def setUpClass(cls) -> None:
print("setUpClass每个类执行一次")
@classmethod
def tearDownClass(cls) -> None:
print("tearDownClass每个类执行一次")
def test_01(self):
a = 1
b = 2
c = a + b
self.assertEqual(c, 3)
def test_02(self):
a = 2
b = 3
c = a * b
self.assertEqual(c, 5, "不相等")
if __name__ == '__main__':
test_dir = './'
# test_dir为要指定的目录 ./为当前目录;pattern:为查找的.py文件的格式
discover = unittest.defaultTestLoader.discover(test_dir,pattern='test_*.py')
# 定义报告目录
file_dir = "./report/"
# 定义报告名称格式
now_time = time.strftime("%Y-%m-%d %H_%M_%S")
# 报告完整路径和名称
file_name = file_dir + now_time + "Report.html"
with open(file_name, "wb") as fp:
# 创建执行对象 是一个HTMLTestRunner的对象 生成测试结果报告内容
runner = HTMLTestRunner(stream=fp,
title="测试报告",
description="用例执行情况:",
verbosity=2
)
# 执行测试流程
runner.run(discover)