一、基本用法
定义一个测试类,并继承unittest.TestCase类.
class TestClassName(unittest.TestCase)
类中的方法,必须用test开头,如test_001.
运行方式:
if __name__ == "__main__":
unittest.main()
类方法:
assertEqual(expect, result):断言实际与预期是否一致.
setUp():测试类执行后最先调用的方法.
tearDown():测试类执行后最后调用的方法.
注解(修饰器):
@unittest.skip:这个测试方法会被跳过,不执行.
@unittest.skipIf(boolean, "True跳过方法"):boolean为true则跳过此方法,boolean为false则执行此方法.
@unittest.skipUnless(boolean, "False则跳过方法"):boolean为true则执行此方法,boolean为false则跳过此方法.
二、测试套(测试集合)
--------------------------注意事项------------------------------
unittest使用测试套时:不能与注解一起使用,天生的问题,无法解决.
如果测试套与注解一起使用,那么就要用unittest方式执行.
如果测试套不与注解一起使用时,要用Python方式运行.
---------------------------------------------------------------
定义测试套件:suite = unittest.TestSuite()
添加测试用例:suite.addTest(ClassName("test_method"))
运行方式(要用Python的方式运行):
if __name__ == "__main__":
suite_runner = unittest.TextTestRunner()
suite_runner.run(set_suite())
三、unittest生产测试报告
前提:把HTMLTestRunner.py文件拷贝到:Python安装目录\lib.
# Python 文件读取操作
# 1. 定义: open(file, mode='r' ....)
# 2. 参数: file:将要生成的测试报告名称
# 如:在当前目录生成报告:'./report.html'
# mode:文件的打开方式
# 如: r: 只读方式打开
# w: 可写方式打开
# b: 二进制格式(流文件)
# 3. 文件:打开 -> 编辑 -> 关闭
# python 中提供了自动关闭的功能:with
# 4. with open('./report.html', 'wb') as f:
# 1). 在当前目录新建一个 report.html 文件
# 2). 该文件使用:可写+二进制 的方式打开/读写
# 3). f:这个文件在代码中的别名
生成测试报告:
with open('./report.html', 'wb') as f:
# 导包:import HTMLTestRunner
# 创建一个运行器
# 实例化报表类
# 参数stream:需要传入文件名
# 参数title: 报告的标题
# 参数description:报告的内容阐述
# 第一个HTMLTestRunner是文件名,第二个HTMLTestRunner是类名.
runner = HTMLTestRunner.HTMLTestRunner(stream=f, title='测试报表', description='这是我的测试报告')
# 运行测试集合
runner.run(set_suite())
四、参数化
1) 通过第三方工具包:parameterized
前提:
File--->Settings--->Project:项目名--->Python Interpreter--->点击"+"
--->输入"parameterized"--->点击"Install Package".
1. 需求:判断两个数是否相等.
# 文件(模块)名.类名
# 将参数封装成一个list列表,list每一个元素可以是元组类型
@parameterized.parameterized.expand([(5, 5), (0, 0), (-1, -1)])
def test_01(self, x, y):
self.assertEqual(x, y)
2. 判断两数之和是否相等.
@parameterized.parameterized.expand([(1, 1, 2), (2, 2, 4), (3, 4, 7)])
def test_002(self, num1, num2, res):
self.assertEqual(num1 + num2, res)
2) 参数化+测试套
感觉没啥说的,和一般的测试套一样.
3) 通过csv文件进行参数化
导包: import csv
# 获取csv文件方法
def get_csv(filename="csvdata.csv"):
lst = []
with open(filename, "r") as f:
reader = csv.reader(f)
for line in reader:
lst.append(line)
# 去除首行
return lst[1:]
# 测试执行类
class TestCsv(unittest.TestCase):
@parameterized.parameterized.expand(get_csv())
def test_001(self, add1, add2, expected):
self.assertEqual(int(add1) + int(add2), int(expected))
|