学习资料:
官网:
http://pyunit.sourceforge.net/pyunit_cn.html#SYSREQ
其他文章:
https://www.cnblogs.com/fengf233/p/11799619.html
主要结构
整体结构:unittest库提供了Test Case, Test Suite, Test Runner, Test Fixture
- Test Case:通过继承TestCase类,创建一个测试用例集,但这个测试用例集里面可能包含多个测试用例(或者测试步骤)即test开头的方法
- Test Suite:把多个测试用例集合在一起来执行。可以通过addTest加载TestCase到Test Suite中,从而返回一个TestSuite实例。
- Test Runner:Test Runner是一个用于执行和输出测试结果的组件,可以使用图形界面,文本界面,或者返回一个特殊的值的方式来表示测试执行的结果。
- Test Fixture:提供一些脚手架类的方法,常用于测试环境的设置与清理。
创建测试用例,Test Case
1、新建一个py文件,testcass.py
import unittest
class Test1(unittest.TestCase):
def setUp(self):
print("test start")
def tearDown(self):
print("test end")
def test1(self):
print('这是test1')
assert self.setup1 == '初始化'
def test2(self):
try:
print('这是test2')
time.sleep( 2 )
self.assertEqual(1, 1)
tmp1 = 0
except:
tmp1 = 1
else:
print('test2 ok')
self.assertEqual(tmp1, 0, '出错')
if __name__ == '__main__':
unittest.main()
当 断言条件只要满足多个条件中的一个即可的时候。可以考虑这样写:
self.assertIn(tmp1 , [0, 1], msg="出错了")
当 断言的标准有很多个,且必须全部满足时,除了一个一个判断的方法以外,还可以使用 all() 函数。
def test_999(self):
a = [0 ,0 -1 ,1]
self.assertTrue(all(a),msg='flase')
# 将需要判断的结果都放到a列表。all() 当所有迭代对象都为真时,返回真。
#元素除了是 0、空、None、False以外的都算 True。
# 与 all() 相对的函数是 any()。当有一个迭代对象是真,即返回真
class ipc_api_TestCase(unittest.TestCase):
@classmethod
def setUpClass(cls):
#测试类之前运行
pass
@classmethod
def tearDownClass(cls):
#测试类之后运行
pass
def setUp(self):
#用例执行前置条件
pass
def tearDown(self):
#用例执行后置条件
pass
测试集合Test Suite
添加单个测试用例
suite = unittest.TestSuite() # 创建测试套件
suite.addTest(类名(‘测试函数名’)) # 将第一个测试用例添加到套件中
suite.addTest(类名(‘测试函数名’)) # 将第二个测试用例添加到套件中
runner = unittests.TextTestRunner() # 指定使用 TextTestRunner 运行测试用例
runner.run(suite) # 运行测试套件
指定按顺序运行一个模块中的多个测试用例
suite = unittest.TestSuite()
tests = [类名('测试函数1'), 类名('测试函数2'),...]
# 只执行指定的测试用例
# 按照编写的顺序执行测试
# 多个测试用例放到列表中
suite.addTests(tests) # 将测试添加到测试套件中
runner=unittest.TextTestRunner(verbosity=2) # 可以指定测试结果的详细程度
runner.run(suite)
自动匹配添加多个测试用例
# 创建测试套件
suite = unittest.TestSuite()
# 指定识别测试用例的规则
tests = unittest.defaultTestLoader.discover(''测试模块所在目录'', pattern='test*.py')
# 识别所有test开头的py文件为测试用例
# 按模块名顺序执行
suite.addTest(tests)
runner = nuittest.TestRunner(verbosity=2)
runner.run(suite)
添加测试类
suite1 = unittest.TestSuite() #定义一个测试集合
suite1.addTest(unittest.makeSuite(测试类))
suite2 = unittest.TestSuite()
loader = unittest.TestLoader()
suite2.addTest(loader.loadTestsFromTestCase(类名))
ps:直接添加测试类。运行时的用例运行顺序,并不是按照脚本写的顺序。而是根据用例的名称,按字母逐个排序。
例如:
def test_1():
pass
def test_2():
pass
def test_10():
pass
运行顺序就是 :test_1() > test_10() > test_2()
想要按顺序运行:
方法一:使用suite.addTest 逐个添加
方法二:使用suite.addTests 添加用例列表
方法三:在用例的名称上 ,改变
def test_001():
pass
def test_002():
pass
def test_010():
pass
def test_100():
pass
生成测试报告,
报告模板 BeautifulReport 比较美观。
pip install BeautifulReport
导入:
from BeautifulReport import BeautifulReport as bf
run = bf(suite) #实例化BeautifulReport模块
run.report(filename='测试报告',description='测试deafult报告',report_dir='report',theme='theme_default')
BeautifulReport.report
report (
filename -> 测试报告名称, 如果不指定默认文件名为report.html
description -> 测试报告用例名称展示
report_dir='.' -> 报告文件写入路径
theme='theme_default' -> 报告主题样式 theme_default theme_cyan theme_candy theme_memories
)
想要 增加用例描述字段,而不是null
直接在每一个用例里面添加一下这样的(’’‘测试’’’)注释就可以了,写了什么用例描述就是什么。
def test1(self):
''' 这是 beautifulreport 报告 每一条用例描述对应的地方'''
print('这是test1')
assert self.setup1 == '初始化'