import unittest
class myclass(object):
@classmethod
def sum(cls,a,b):
return a + b
@classmethod
def sub(cls,a,b):
return a - b
class myTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("---所有测试前的准备工作")
@classmethod
def tearDownClass(cls):
print("---所有测试完成后的清理")
#初始化工作
def setUp(self):
self.a = 3
self.b = 1
print("---初始化完成")
#退出清理
def tearDown(self):
print("退出清理工作")
#具体的测试用例
def testsum(self):
self.assertEqual(myclass.sum(self.a,self.b),4,'test_sum_fail')
def testsub(self):
self.assertEqual(myclass.sub(self.a,self.b),2,'test_sub_fail')
if __name__ == '__main__':
unittest.main()
'''
四要素:
1.test fixture(测试固件)
一个test fixture代表一个或者多个测试执行前的准备动作和测试结果后的清理动作
2.test case(测试用例)
一个test case就是一个最小测试单元,也就是一个完整的测试流程,通过继承unittest.TestCase创建新的测试用例
3.test suite(测试套件)
一个test suite就是一组测试用例,一组测试套件或者两者共同组成的集合
4.testrunner(测试运行器)
一个testrunner由执行设定的测试用例和将测试结果提供给用户两部分功能组成
单元测试加载方法:
1.直接通过unittest.main()方法加载,测试方法的执行顺序按照方法名的ASCII码升序排序
2.将所有的单元测试用例(Test Case)添加到测试套件(Test suite)中一次性加载所有的对象
TestCase类中定义的特殊方法:
setUp();每个测试方法运行前执行,测试前的初始化工作
tearDown();每个测试方法结束后执行,测试的清理工作
setUpclass();所有测试方法执行前运行,单元测试前期准备,必须使用classmethod装饰器进行修饰,setUp()执行前
执行,整个测试过程只执行一次
tearDownClass();所有测试方法运行结束后执行,单元测试后期清理,必须使用classmethod装饰器进行修饰,tearDown()执行后
执行,整个测试过程只执行一次
TestLoader()类:测试用例加载器,返回一个测试用例的集合
loadTestFromTestCase():根据给定的测试类,获取其中所有以test开头的测试方法,并返回一个测试集合
TestSuite()类:组装测试用例的实例。支持添加和删除用例,最后将传递给testrunner进行测试执行
TestTestRunner()类:测试用例执行类,其中Test表示以文本形式输出测试结果
设置verbosity <= 0数字,输出结果不显示执行成功的用例数
设置verbosity = 1 ,输出结果仅以(.)表示成功的用户数
设置verbosity >= 2的数字,输出每个测试用例的详细信息
TestTestRunner.run()方法会返回一个TestResult实例对象,存储用例执行的详细信息。
加载测试集合步骤:
1.TestLoader(测试用例加载器)根据传入的参数获取相应的测试用例的测试方法
2.make suite(由单元测试框架调用,用于生产test suite对象的实例)把所有的测试用例组装成test suite集合
3.将test suite集合传递给test runner执行
测试用例按照顺序执行
if __name__ == '__main__':
suite = unittest.TestSuite()
#将测试用例添加到测试容器当中
suite.addTest(Mytest("test_name1"))
suite.addTest(Mytest("test_name2"))
suite.addTest(Mytest("test_name3"))
suite.addTest(Mytest("test_name4"))
suite.addTest(Mytest("test_name5"))
#创建TestTestRunner对象
runner = unittest.TestTestRunner()
runner.run(suite)
忽略某个测试方法
无条件忽略
有条件忽略
@unittest.skip('skipping') 无条件忽略
@unittest.skipIf(a > 5,'condition is not satisfied') 如果a > 5则忽略该条测试用例
@unittest.skipUnless(sys.platform.startswith("linux"),'requires Windows') 除非平台为Windows,否则忽略该用例
批量执行测试模块
import unittest
if __name__ == '__main__':
testSuite = unittest.TestLoader().discover(".")
unittest.TestTestRunner(verbosity=2).run(testSuite)
文件必须放在测试脚本目录
断言方法:
assertEqual(a,b,msg='sss') 测试a == b,否则抛出信息msg
assertTrue(expr,msg='sss') 测试表达式expr为True
assertIs(a,b,msg=None) 测试a和b为同一个对象
assertIsNone(expr,msg) 测试expr为None
assertIn(a,b,msg) 测试a包含在b中
assertIsInstance(obj,cls,msg) 测试obj为cls类型,可用isinstance(obj,cls)或assertIs(type(obj),cls)代替
assertRaises(exc [,fun,*args,**kwds]) 测试函数fun(*args,**lwds)抛出exc异常,否则抛出断言异常
assertRaiseRegexp(exc,r [,fun,*args,**kwds]) 测试函数fun抛出exc异常,同时可用正则r匹配异常信息,否则抛出断言异常
生成HTML测试报告(需要下载HTMLTestRunner文件,自行百度)
filename = '路径+文件名+后缀'
with open(filename,'wb') as f:
runner = HTMLTestRunner.HTMLTestRunner(stream = f,title = 'testname',description = '描述')
rnner.run()
'''
unittest测试框架的使用方法
最新推荐文章于 2025-05-04 14:28:46 发布