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)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。