Python Unittest原理及基本使用方法
基本使用步骤:
1、importunittest
2、新建一个Class继承unittest.TestCase
3、定义一个以test开头的函数作为测试用例【必须以test开头】
4、执行测试用例前都会先调用Setup函数【每个测试用例调用一次】或者setupClass函数【所有测试用例仅调用一次】
5、执行完测试用例后都会调用tearDown函数【多次】和tearDownClass函数【仅一次】
PS:
1、不能重写init()
2、函数必须以test开头才能作为测试用例
3、setupClass()和tearDownClass()必须用@classmethod修饰
#-*-encoding=utf-8-*-
importunittest
classDemo1(unittest.TestCase):
defsetUp(self):
print'调用setup函数'
@classmethod
defsetUpClass(cls):
print'调用setupClass函数'
deftearDown(self):
print'调用tearDown函数'
@classmethod
deftearDownClass(cls):
print'调用tearDownClass函数'
@staticmethod
deftest_add():
print'3+5={}'.format(3+5)
@staticmethod
deftest_sub():
print'3-5={}'.format(3-5)
if__name__=='__main__':
unittest.main()
运行结果
调用setupClass函数
调用setup函数
3+5=8
调用tearDown函数
调用setup函数
3-5=-2
调用tearDown函数
调用tearDownClass函数
Ran2testsin0.012s
OK
TestSuite【测试组】添加测试用例进行测试
#-*-encoding=utf-8-*-
classClass1(object):
def__init__(self):
print'调用Class1初始化函数'
self.name='未定义姓名'
self.age='未定义年龄'
defset_name(self,name):
self.name=name
defset_age(self,age):
self.age=age
defprint_name(self):
print'Class1的姓名是:{}'.format(self.name)
defprint_age(self):
print'Class1的年龄是:{}'.format(self.age)
if__name__=='__main__':
pass
#-*-encoding=utf-8-*-
importunittest
fromClass1importClass1
classCallClass1(unittest.TestCase):
defsetUp(self):
self.class1=Class1()
pass
deftearDown(self):
self.class1=None
pass
deftest_set_name(self):
self.class1.set_name('设置了名字')
self.class1.print_name()
deftest_print_name(self):
self.class1.print_name()
if__name__=='__main__':
unittest.main()
#-*-encoding=utf-8-*-
importunittest
fromTest_Demo2importCallClass1
if__name__=='__main__':
testSuite=unittest.TestSuite()
testSuite.addTest(CallClass1('test_set_name'))
testSuite.addTests(
[CallClass1('test_set_name'),CallClass1('test_print_name')])
textTestRunner=unittest.TextTestRunner()
textTestRunner.run(testSuite)
运行结果
调用Class1初始化函数
Class1的姓名是:设置了名字
调用Class1初始化函数
Class1的姓名是:设置了名字
调用Class1初始化函数
Class1的姓名是:未定义姓名
...
----------------------------------------------------------------------
Ran3testsin0.000s
OK
Processfinishedwithexitcode0
记录测试报告到txt文件
#-*-encoding=utf-8-*-
importunittest
fromTest_Demo2importCallClass1
if__name__=='__main__':
testSuite=unittest.TestSuite()
testSuite.addTest(CallClass1('test_set_name'))
testSuite.addTests(
[CallClass1('test_set_name'),CallClass1('test_print_name')])
#textTestRunner=unittest.TextTestRunner()
#textTestRunner.run(testSuite)
#将测试结果输出到测试报告中
withopen('UnittestTextReport.txt','w')asf:
runner=unittest.TextTestRunner(stream=f,verbosity=2)
runner.run(testSuite)
记录测试报告到html文件
#将测试结果输出到测试报告html中
withopen('HTMLReport.html','w')asf:
runner=HTMLTestRunner(stream=f,
title='MathFuncTestReport',
description='generatedbyHTMLTestRunner.',
verbosity=2
)
runner.run(suite)
断言
当断言为真时,会执行断言之后的代码如(在断言之后打印成功提示信息)
若断言为假,则之后的代码不会被执行,打应错误信息,之后提示信息不会被执行;unittest中提示F,失败,若捕获到异常,则为E,代表错误;
补充:若断言为假,则当前函数def,停止运行,但会运行之后的def函数
重点:try语句块中不要使用assert一起使用,assert断言为假时,会抛出异常,测试用例为失败,如果放到try中,则会捕获到异常,测试用例永远标记为通过
断言结果:
.表示通过或者pass
FFalse,表示断言没有通过
EError,表示程序内部发生了错误。
查找当前目录下所有的测试用例【默认以test开头的py文件,可以自己配置】
#-*-encoding=utf-8-*- importunittest importos if__name__=='__main__': loader=unittest.defaultTestLoader.discover(os.getcwd()) #tests=unittest.defaultTestLoader.discover( #start_dir='.',#=>指定查找的目录 #pattern='test*.py'#=>指定查找规则 #) runner=unittest.TextTestRunner() runner.run(loader)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。