ps,其他可参考内容:https://www.jianshu.com/p/e50d8f810eab
首先要知道,一个完整的单元测试流程:
完整单元测试流程:
1.写好一个完整的TestCase类
2.多个TestCase 由TestLoder被加载到TestSuite里面, TestSuite也可以嵌套TestSuite
3.由TextTestRunner来执行TestSuite,测试的结果保存在TextTestResult中 TestFixture指的是环境准备和恢复
testcase类完善
1.确定需要测试的模块
#需要测试下面这两个方法
def myadd(a,b):
return a+b
def myminu(a,b):
return a-b
2.自己的testcase类
import unittest
class mytest(unittest.TestCase):
'''TestCase类使用'''
@classmethod
def setUpClass(cls):
'''父类函数重写 必须使用装饰器,是所有case执行的前置条件,只运行一次'''
ta="hello"
tb="hi"
print("前置条件设置")
@classmethod
def tearDownClass(cls):
'''父类函数重写 必须使用装饰器,所有case执行完后只运行一次'''
print("最后执行")
def setUp(self):
'''父类函数重写 环境准备,测试用例执行的前置条件 在每个test的测试函数执行时先跑一次'''
print("初始化环境变量")
def tearDown(self):
'''父类函数重写 环境还原,执行测试用例的后置条件 在每个test的测试函数执行时先跑一次'''
sa="wo"
sb="ho"
print("环境还原")
def test_mytestadd(self):
'''自定义测试函数test1 每个测试函数以test开头'''
self.assertEqual(3,myadd(2,1)) #是否相等
self.assertNotEqual(2,myadd(3,9))
def test_mytestmins(self):
'''自定义测试函数test2 以test开头 若有多个 按从上到下顺序执行'''
self.assertNotEqual(3,myminu(5,3))
self.assertEqual(7,myminu(11,4))
if __name__=='__main__':
'''verbosity为0:不用输出测试结果,为1:默认为1,F为测试失败,E是测试出错,S为跳过测试,一个点是测试成功;为2:输出详细测试结果'''
unittest.main(verbosity=1)
testsuite使用
def usetestsuit():
'''TestSuite()类和TestLoad类使用'''
suite=unittest.TestSuite() #生成suite类,可以存放testcase
a="test"
if a=="testtwo":
testcases=[mytest("test_mytestadd"),mytest("test_mytestmins")]
suite.addTests(testcases) #添加多个testcase到suite
elif a=="testone":
suite.addTest(mytest("test_add_with_sikp"))
elif a=="testall":
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(mytest))#加载所有mytest类中的test开头的测试用例
else:
suite.addTests(unittest.TestLoader().discover('.','test_*.py'))
import HTMLReport
report="txt"
if report == 'terminal':
runner = unittest.TextTestRunner(verbosity=1)
runner.run(suite)
elif report == 'txt':
with open('ut_log.txt', 'a') as fp:
runner = unittest.TextTestRunner(stream=fp, verbosity=1)
runner.run(suite)
elif report == 'html':
runner = HTMLReport.TestRunner(report_file_name='test',
output_path='report',
title='测试报告',
description='测试描述',
sequential_execution=True
)
runner.run(suite)
整个测试环节完整代码如下:
import unittest
def myadd(a,b):
return a+b
def myminu(a,b):
return a-b
'''完整单元测试流程:
1.写好一个完整的TestCase类
2.多个TestCase 由TestLoder被加载到TestSuite里面, TestSuite也可以嵌套TestSuite
3.由TextTestRunner来执行TestSuite,测试的结果保存在TextTestResult中
TestFixture指的是环境准备和恢复
'''
class mytest(unittest.TestCase):
'''TestCase类使用'''
@classmethod
def setUpClass(cls):
'''父类函数重写 必须使用装饰器,是所有case执行的前置条件,只运行一次'''
ta="hello"
tb="hi"
print("前置条件设置")
@classmethod
def tearDownClass(cls):
'''父类函数重写 必须使用装饰器,所有case执行完后只运行一次'''
print("最后执行")
def setUp(self):
'''父类函数重写 环境准备,测试用例执行的前置条件 在每个test的测试函数执行时先跑一次'''
print("初始化环境变量")
def tearDown(self):
'''父类函数重写 环境还原,执行测试用例的后置条件 在每个test的测试函数执行时先跑一次'''
sa="wo"
sb="ho"
print("环境还原")
def test_mytestadd(self):
'''自定义测试函数 每个测试函数以test开头'''
self.assertEqual(3,myadd(2,1)) #是否相等
self.assertNotEqual(2,myadd(3,9))
def test_mytestmins(self):
'''自定义测试函数 以test开头 若有多个 按从上到下顺序执行'''
self.assertNotEqual(3,myminu(5,3))
self.assertEqual(7,myminu(11,4))
'''
1.@unittest.skip("不执行当前测试用例"),无条件配置时,无条件跳过当前测试用
2.@unittest.skipif(condition,reason),提交为真 跳过
3.@unittest.skipUnless(condition,reason),条件为假,跳过
'''
@unittest.skip("不执行当前测试用例") #装饰器用来跳过测试用例
def test_add_with_sikp(self):
self.assertEqual(3,myadd(1,2))
self.assertEqual(3,myadd(1,2))
def usetestsuit():
'''TestSuite()类和TestLoad类使用'''
suite=unittest.TestSuite() #生成suite类,可以存放testcase
a="test"
if a=="testtwo":
testcases=[mytest("test_mytestadd"),mytest("test_mytestmins")]
suite.addTests(testcases) #添加多个testcase到suite
elif a=="testone":
suite.addTest(mytest("test_add_with_sikp"))
elif a=="testall":
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(mytest))#加载所有mytest类中的test开头的测试用例
else:
suite.addTests(unittest.TestLoader().discover('.','test_*.py'))
import HTMLReport
report="txt"
if report == 'terminal':
runner = unittest.TextTestRunner(verbosity=1)
runner.run(suite)
elif report == 'txt':
with open('ut_log.txt', 'a') as fp:
runner = unittest.TextTestRunner(stream=fp, verbosity=1)
runner.run(suite)
elif report == 'html':
runner = HTMLReport.TestRunner(report_file_name='test',
output_path='report',
title='测试报告',
description='测试描述',
sequential_execution=True
)
runner.run(suite)
if __name__=='__main__':
'''verbosity为0:不用输出测试结果,为1:默认为1,F为测试失败,E是测试出错,S为跳过测试,一个点是测试成功;为2:输出详细测试结果'''
unittest.main(verbosity=1)