unittest框架的使用方法,unittest模块
一、unittest模块的属性介绍UnitTest:
Python自动化领域有两种测试框架,分别是UnitTest和PyTest。
测试本身就是一个单元测试框架。到目前为止,基于该框架已经可以实现Selenium、Appium和Requests接口的自动化。
默认情况下,UnitTest已经安装在python环境中,不需要额外安装。
四个特点:
1.前部和后部,安装和拆卸
2.测试用例,所有这些都是基于TestCase类实现的。
3.测试套件和运行器,可以精细地管理测试用例并生成测试报告。
4.断言机制,封装了很多断言。可以通过self直接调用所有封装的断言函数。1.1 unittest的属性如下(红色的公共属性):[基本测试套件,函数测试用例,跳过测试,测试用例,测试加载器,测试程序,测试结果,测试套件, TextTestResult , TextTestRunner , case , defaultTestLoader , expectedFailure , findTestCases , gettest cases , installHandler , loader , main , makeSuite , registerResult , removeHandler , removeResult , Runner , signals ,
1.2通用属性介绍unittest。TestCase:TestCase类,所有测试用例类继承的基础类,该类下所有以test开头的函数都是测试用例。
BaiduTest类(单元测试。测试用例):
及格
定义测试_案例1(自身):
Passunittest.main():使用她,你可以很容易地把一个单元测试模块变成一个可以直接运行的测试脚本。main()方法使用TestLoader类来搜索模块中包含的、以“test”开头的所有测试方法,并自动执行它们。默认的执行顺序是:根据ASCII码加载测试用例,数字和字母的顺序是:0-9,A-Z,A-Z,所以会先执行以A开头的测试用例方法,会后执行以A开头的方法。
单元测试。TestSuite():unittest框架的test suite()类用于创建测试套件,即多个测试用例的集合。
单元测试。TextTextRunner():unittest框架的text text runner()类通过该类下的run()方法运行套件组装的测试用例,作为套件测试套件包含。
unittest . defaulttestloader():defaulttestloader()类。这个类下面的discover()方法可以自动找到测试用例文件(test*。py ),并将找到的测试用例组装到测试套件中。因此,可以通过run()方法直接执行discover。用法如下:
discover=unit test . defaulttestloader . discover(test _ dir,pattern=test_*。py’)
Unittest.skip (): Decorator。当运行一个用例时,一些用例可能不想被执行,等等。您可以使用装饰器暂时屏蔽这个测试用例。一个常见的用法是,例如,如果您想要调试某个测试用例,并且您想要首先屏蔽其他用例,您可以用装饰器屏蔽它们。
@ unittest.skip(跳过的原因)Decorator:无条件跳过被修饰的测试,并解释跳过测试的原因。
@unittest.skipIf (condition ,跳过原因)Decorator:当条件为真时,跳过修饰测试,并说明跳过测试的原因。
@ unittest.skipless (condition ,跳过原因)Decorator:当条件为假时,跳过修饰测试,并说明跳过测试的原因。
@unittest.expectedFailure:预测会失败,所以先执行。如果失败,它不会报告错误,这个测试用例将被忽略。跳过和跳过的区别是跳过而不执行用例。这是在用例执行失败后跳过。
二。每个属性的详细介绍。1.常用的属性setUp():1的setUp()方法。TestCase类用于在执行测试用例之前初始化它。如果您需要在测试用例中访问数据库,您可以建立一个数据库连接,并在setUp中初始化它。如果测试用例需要登录web,可以先实例化浏览器。
TearDown():tearDown()方法用于测试用例执行后的善后工作。例如关闭数据库连接。关闭浏览器。
Assert*):一些断言方法:在执行一个测试用例的过程中,通过判断测试得到的实际结果是否等于预期结果来决定最终的测试用例是否被执行。
AssertEqual(a,B,[msg=测试失败时打印的信息]):断言A和B是否相等,如果相等,则测试用例通过。
AssertNotEqual(a,B,[msg=测试失败时打印的信息]):断言A和B是否相等,如果不相等,则测试用例通过。
AssertTrue(x,[msg=测试失败时打印的信息]):断言x是否为真,如果是,则测试用例通过。
AssertFalse(x,[msg=测试失败时打印的信息]):断言x是否为假,如果是,测试用例将通过。
AssertIs(a,B,[msg=测试失败时打印的信息]):断言A是否为B,如果是,测试用例通过。
AssertNotIs(a,B,[msg=测试失败时打印的信息]):断言A是否为B,如果不是,则测试用例通过。
asserts None(x,[msg=测试失败时打印的信息]):断言x是否为None,如果为None,则测试用例通过。
assertsinotnone(x,[msg=测试失败时打印的信息]):断言x是否为None,如果不为None,则测试用例通过。
AssertIn(a,B,[msg=测试失败时打印的信息]):断言A是否在B中,如果B,测试用例通过。
AssertNotIn(a,B,[msg=测试失败时打印的信息]):断言A是否在B中,如果不在,测试用例通过。
Assert iSense (A,B,[msg=测试失败时打印的信息]):断言A是B的实例,然后测试用例通过。
AssertificationInstance (A,B,[msg=测试失败时打印的信息]):断言A是B的实例,如果不是,则测试用例通过公共属性2。TestSuite类(在组织用例时使用,带有TextText Runner) [addtest , addtests , count test cases , debug ,
描述:
addTest():addTest()方法是将add test():add test添加到测试套件中。如下图,test_baidu模块下的百度测试类下的test_baidu测试用例被添加到测试套件中。
suite=unittest。测试套件()
套房。AddTest (test _ Baidu。百度测试( test _ Baidu)) 3。TextRunner的属性如下:(组织用例时使用,配合测试套件)[buffer , descriptions , failfast , resultclass , run , stream ,
描述:
run():run()方法是运行测试套件的测试用例,参与的是套件测试套件。
runner=unittest。TextTestRunner()
Runner.run(组曲)三。unittest 3.1基本用法基本用法下面以selenium操作Google浏览器打开一个网页为例来说明unittest的用法。
简单封装selenium访问Google的线性代码,得到web_key_demo的逻辑代码。基于封装的逻辑代码,可以引入unittest来管理多个测试用例。
导入时间
从selenium导入web驱动程序
关键字驱动类:底层逻辑代码。这个类不会直接执行测试行为。
属于逻辑层代码,常规操作行为封装成自定义关键字函数。
在执行自动化时,调用用户自定义的函数类来实现自动化测试操作。
一般操作行为:
1.创建浏览器对象
2.访问url
3.元素定位
4.投入
5.点击
6.其他的.
#根据类型生成相应的浏览器对象
定义浏览器(类型_):
尝试:
# driver本身仅限于webdriver对象。
driver=getattr(webdriver,type_)()
例外情况为e:
driver=webdriver。铬合金()
返回驱动器
类别密钥演示:
def __init__(self,type_):
self.driver=browser(type_)
#访问url
定义打开(自身,url):
self.driver.get(url)
#元素定位:八种元素定位
定义定位器(自身、名称、值):
返回self.driver.find_element(名称,值)
#输入
定义输入(自身、名称、值、文本):
self.locator(名称,值)。发送密钥(txt)
#点击
定义点击(自身,名称,值):
self.locator(名称,值)。单击()
#关闭浏览器
定义退出(自己):
self.driver.quit()
定义睡眠(自我,时间_):
time.sleep(time_)网络密钥演示
使用unittest编写python单元测试代码包括以下步骤:
1.编写一个继承unittest模块中TestCase类的python类,它是一个测试类。
2.在上面写的测试类中定义测试方法(这指的是测试用例)。每个方法的方法名需要以test开始,没有附加参数。在这个测试方法中,被测试的代码被调用来验证测试结果。TestCase类中有很多标准的验证方法,比如最常见的assertEqual。
3.执行unittest.main(),它将负责运行测试。它将实例化TestCase的所有子类,并运行所有以test开头的方法。
UnitTest # Python自带,不需要额外安装。
从web_key_demo导入KeyDemo
class CaseDemo(unittest。测试用例):
#在执行每个测试用例之前执行。
定义设置(自身)-无:
self.kd=KeyDemo(Chrome )
#每个测试用例在执行后立即执行。
定义拆卸(自身)-无:
self.kd.quit()
Test _ 01 (self): #测试用例名称需要以Test开头。
self . KD . open( http://www.baidu.com )
Self.kd.input(id , kw ,美颜)
self.kd.click(id , su )
self.kd.sleep(3)
定义测试_02(自身):
self.kd=KeyDemo(Chrome )
self . KD . open( http://www.baidu.com )
Self.kd.input(id , kw ,妹子)
self.kd.click(id , su )
self.kd.sleep(3)
定义测试_03(自身):
及格
if __name__==__main__ :
#执行这个脚本来执行所有以test开头的测试用例,执行顺序是默认顺序:
#设置-测试_01 -拆卸
#设置-测试_02 -拆卸
#设置-测试_03 -拆卸
Unittest.main()3.2断言、跳过和预测失败
UnitTest # Python自带,不需要额外安装。
从ddt导入DDT,data,file _ data,unpack #需要Pip安装DDT。
@ddt #修饰ddt声明我要用这个ddt来管理测试类。
class CaseDemo(unittest。测试用例):
#如果你想从外部传递参数给测试用例类,你需要调用父类的init。从源代码中,您可以看到父类只有一个参数,如methodName=runTest
def __init__(self,methodName=runTest ,微信=None):
超级()。__init__(methodName=methodName)
self.wechat=微信
#在测试用例执行之前执行。
定义设置(自身)-无:
# self.kd=KeyDemo(Chrome )
#打印(self .微信)
打印()
及格
#测试用例在执行后立即执行。
定义拆卸(自身)-无:
# self.kd.quit()
打印(-)
及格
#============================================跳过=========
@unittest.skip(我无条件跳过,所以我无条件跳过)
def test_skip1(self):
打印(‘我还有机会BB吗?)
@ unittest.skipless (1 2,如果判断结果为假,我就跳过)
def test_skip2(自身):
打印(‘我还有机会BB吗?)
@unittest.skipIf(1 2,如果判断结果为真,我就跳过)
def test_skip3(self):
打印(‘我还有机会BB吗?)
#========================================================================
#预测失败:先执行。如果失败,它不会报告错误,这个测试用例将被忽略。跳过和跳过的区别是跳过而不执行用例。这是在执行用例失败后跳过。
@unittest.expectedFailure
定义测试_aa(自身):
及格
Self.assertEqual(123,321,msg=它真的失败了)
#================================================================
定义test_assert(self):
断言测试,msg是断言失败后的提示信息,所以是可选的。
def _test()。
返回“老王”
res=_test()
#各种断言方法都是内置属性,可以选择合适的来使用。
Self.assertEqual(res,老赵,msg=f 别冤枉他,是{res}) # Assert value1==value2
# #失败后返回AssertionError老张,老李]中找不到老王:老王不在嫌疑人中,不是他。
# self.assertIn(res,[老张,老李],msg=f{res}不在嫌疑人内部,不是他)
# #失败后的回报:‘老王’不假:回报不假。
# self.assertFalse(res,msg= return is not False )
if __name__==__main__ :
unittest.main()视图代码
3.3 测试用例找不到报错注意执行的时候光标不能放入案例演示类中,需要放到外面,点一下其他位置再执行,不然会报错
属性错误:类型对象"案例演示"没有属性"测试_01 "
错误
回溯(最近一次呼叫):
testPartExecutor中文件" E:\ python 3.8 \ lib \ unittest \ case。py "的第60行
产量
文件E:\ python 3.8 \ lib \ unittest \ case。py ,第676行,运行中
自我callTestMethod(测试方法)
文件E:\ python 3.8 \ lib \ unittest \ case。py ,第633行,in _callTestMethod
方法()
文件" E:\ python 3.8 \ lib \ unittest \ loader。py”,第34行,测试失败
提升自我。_异常
loadTestsFromName中文件" E:\ python 3.8 \ lib \ unittest \ loader。py "的第169行
parent,obj=obj,getattr(obj,part)
属性错误:类型对象"案例演示"没有属性"测试_01 "报错信息
四、单元测试结合二氯二苯三氯乙烷模块给测试用例传参
单元测试和二氯二苯三氯乙烷有很好的契合度,滴滴涕读取的数据可以直接用于单元测试
4.1滴滴涕数据直接传参导入unittest # python自带,不需要额外安装
从二氯二苯三氯乙烷导入滴滴涕,数据,文件数据,解包#需要点安装二氯二苯三氯乙烷
从网络密钥演示导入键盘演示
@ddt #装饰二氯二苯三氯乙烷来声明我要用这个二氯二苯三氯乙烷来管理测试类
class CaseDemo(unittest .测试用例):
# 在测试用例执行前先执行
定义设置(自身)-无:
打印()
及格
# 测试用例执行后紧接着执行
定义拆卸(自身)-无:
打印(-)
及格
#================================================DDT的数据直接传参=======================================
@data(隔壁老王) # 单个传参
def test_01(本人,姓名):
打印(姓名)
@data([隔壁老赵,嘿咻嘿咻]) # 多个参数
@解包#多个参数需要这样解压
def test_02(自己,姓名,动作):
打印(姓名)
打印(操作)
@data([隔壁老王, 睡觉],[隔壁老李, 幽会]) # 多组数据,每组多个参数,几组数据执行几次函数
@解包#需要这样解压
def test_03(自己,姓名,动作):
打印(姓名)
打印(操作)
if __name__==__main__ :
unittest.main()
隔壁老王
-
隔壁老赵
嘿咻嘿咻
-
隔壁老王
睡觉
-
隔壁老李
幽会
-
在0.013秒内进行了四次测试
好
"4.2滴滴涕模块读取格式文件第三节代码可以发现,测试用例01和02只是数据不同,可以采取数据驱动
首先需要安装二氯二苯三氯乙烷和PyYAML模块,用二氯二苯三氯乙烷读取格式数据文件中一组一组数据为一个个的字典,逐个传入测试用例来执行
导入单元测试
从二氯二苯三氯乙烷导入滴滴涕,文件_数据
从网络密钥演示导入键盘演示
@ddt #装饰二氯二苯三氯乙烷来管理测试类
class CaseDemo(unittest .测试用例):
# 在测试用例执行前先执行
定义设置(自身)-无:
self.kd=KeyDemo(Chrome )
# 测试用例执行后紧接着执行
定义拆卸(自身)-无:
self.kd.quit()
@file_data( ./data/search.yaml) # ddt模块读取文件中数据转化为一组一组数据传入测试用例
def test_01(自身,网址,_输入,点击):#测试用例名字需要以试验开头
self.kd.open(网址)
self.kd.input(**_input)
self.kd.click(**click)
self.kd.sleep(3)
if __name__==__main__ :
unittest.main()yaml文件数据层:
- # 一个符号表示一组数据,滴滴涕读取后是一个字典
网址:http://www.baidu.com
_输入:
名称:id # _输入下的一组数据,读取后字典键值对的价值是一个字典
值:千瓦
txt:美女
点击:
名称:id
数值:苏
-
网址:http://www.baidu.com
_输入:
名称:id
值:千瓦
txt:妹子
点击:
名称:id
数值:苏
-
网址:http://www .京东
_输入:
名称:id
值:键
txt:不可描述的好东西
点击:
名称:xpath
value: //button[@aria-label=搜索]search.yaml
动词(verb的缩写)测试套件测试套件是测试用例的集合。我们加的东西都会包含在里面,执行顺序是加法的顺序。
Unittest.main()只能以默认顺序执行所有测试用例。您可以使用测试套件来执行一些测试用例,并且可以指定顺序。
注意:测试套件的代码必须在另一个文件中,不能直接写在测试用例文件的main中。
UnitTest # Python自带,不需要额外安装。
从ddt导入DDT,data,file _ data,unpack #需要Pip安装DDT。
@ddt #修饰ddt声明我要用这个ddt来管理测试类。
class CaseDemo(unittest。测试用例):
#如果你想从外部传递参数给测试用例类,你需要调用父类的init。从源代码中,您可以看到父类只有一个参数,如methodName=runTest
def __init__(self,methodName=runTest ,微信=None):
超级()。__init__(methodName=methodName)
self.wechat=微信
#在测试用例执行之前执行。
定义设置(自身)-无:
打印()
#测试用例在执行后立即执行。
定义拆卸(自身)-无:
打印(-)
定义测试_01(自身):
Test_01:可以在报表的描述信息中显示评论。
打印(打印信息可以显示在成功用例的测试报告中)
@data(隔壁老王)#单通参数
def test_03(本人,姓名):
打印(姓名)
@unittest.skip(我无条件跳过,所以我无条件跳过)
def test_skip1(self):
test_skip1:可以在报告的描述信息中显示注释。
Print(test_skip1)我还有机会BB吗?)
定义test_assert(self):
断言测试,msg是断言失败后的提示信息,所以是可选的。
def _test()。
返回“老王”
res=_test()
#各种断言方法都是内置属性,可以选择合适的来使用。
Self.assertEqual(res,老赵,msg=f 别冤枉他,是{res}) # Assert value1==value2
# #失败后返回AssertionError老张,老李]中找不到老王:老王不在嫌疑人中,不是他。
# self.assertIn(res,[老张,老李],msg=f{res}不在嫌疑人内部,不是他)
# #失败后的回报:‘老王’不假:回报不假。
# self.assertFalse(res,msg= return is not False )
if __name__==__main__ :
unittest.main()
# #像这样在这个测试用例的main中添加套件,执行后你会发现全部都被执行了,而不仅仅是套件中添加的几个用例。
# #在test类的main函数中,默认执行unittest.main()方法,套件不会生效。suite必须生成一个新对象,即创建另一个文件并导入到CaseDemo类中进行构建。
#导入单元测试
# #构建一个测试集
# suite=unittest。测试套件()
# #添加测试用例
# suite . add test(case demo( test _ skip 1 ))
# suite . add test(case demo( test _ assert ))
# # suite . addtest(case demo( test_03 )#此test _ 03使用ddt作为参数,不会运行。以某种方式.
# #执行测试
# runner=unittest。TextTestRunner()
# runner.run(suite)case_demo03
添加测试套件的方法有很多,如下:(测试套件可以传递给测试用例,方法见test_skip1)
导入单元测试
从case_demo03导入案例演示
从ddt导入DDT,data,file _ data,unpack #需要Pip安装DDT。
#构建一个测试集
suite=unittest。测试套件()
# Suite添加测试用例
# #第一种方法:一个一个加
# # suite . addtest(case demo( test_03 )#此test _ 03使用ddt作为参数,不会运行。以某种方式.
# suite . add test(CaseDemo( test _ skip 1 ,微信=666)) #可以重写case demo的init方法,可以传递参数。
# suite . add test(case demo( test _ assert ))
#第二种方法:在列表中添加多个
cases=[案例演示( test _ skip1 ,微信=我是额外参数),
CaseDemo(test_01 ),
CaseDemo(test_assert ),
]
suite.addTests(案例)
#
# #第三种方法:批量添加测试用例类
# #将执行路径中名称与 case_demo*匹配的所有文件下测试用例类的所有测试用例。py
# execute_path=。/
# suite=unittest . default test loader . discover(start _ dir=execute _ path,pattern=case_demo*。py ,顶层目录=无)
# #第四种方法:基于类对象添加测试用例类
# #将执行该类下的所有测试用例
# suite.addTests(unittest。TestLoader()。loadTestsFromTestCase(CaseDemo))
# #第五种方法:基于类名添加一个测试用例类
# #将执行该类下的所有测试用例
# suite.addTests(unittest。TestLoader()。loadTestsFromName(case_demo03。CaseDemo ))
# #还有其他方法,可以用unittest指出来。测试加载程序()
#单元测试。TestLoader()。loadTestsFromModule()
#单元测试。TestLoader()。loadTestsFromNames()
if __name__==__main__ :
#执行测试套件
runner=unittest。TextTestRunner()
Runner.run(组曲)VI。python使用BeautifulReport形成测试报告。对于测试用例的执行结果,我们可以使用beautifulreport生成漂亮的html测试报告。使用后,总结出以下特点:
1.执行失败的错误信息可以直接显示在详细信息中。
2.成功执行的结果可以通过打印输出,显示在测试报告的详细信息中。
3.测试用例的注释信息可以显示在报告的描述栏中。
用法很简单,见下图:
导入单元测试
从case_demo03导入案例演示
从ddt导入DDT,data,file _ data,unpack #需要Pip安装DDT。
#构建一个测试集
suite=unittest。测试套件()
# Suite添加测试用例
# #第一种方法:一个一个加
# # suite . addtest(case demo( test_03 )#此test _ 03使用ddt作为参数,不会运行。以某种方式.
# suite . add test(CaseDemo( test _ skip 1 ,微信=666)) #可以重写case demo的init方法,可以传递参数。
# suite . add test(case demo( test _ assert ))
#第二种方法:在列表中添加多个
cases=[案例演示( test _ skip1 ,微信=我是额外参数),
CaseDemo(test_01 ),
CaseDemo(test_assert ),
]
suite.addTests(案例)
#
# #第三种方法:批量添加测试用例类
# #将执行路径中名称与 case_demo*匹配的所有文件下测试用例类的所有测试用例。py
# execute_path=。/
# suite=unittest . default test loader . discover(start _ dir=execute _ path,pattern=case_demo*。py ,顶层目录=无)
# #第四种方法:基于类对象添加测试用例类
# #将执行该类下的所有测试用例
# suite.addTests(unittest。TestLoader()。loadTestsFromTestCase(CaseDemo))
# #第五种方法:基于类名添加一个测试用例类
# #将执行该类下的所有测试用例
# suite.addTests(unittest。TestLoader()。loadTestsFromName(case_demo03。CaseDemo ))
# #还有其他方法,可以用unittest指出来。测试加载程序()
#单元测试。TestLoader()。loadTestsFromModule()
#单元测试。TestLoader()。loadTestsFromNames()
if __name__==__main__ :
# #执行测试套件
# runner=unittest。TextTestRunner()
# runner.run(套件)
#使用BeautifulReport执行套件并生成测试报告
从美丽报表导入美丽报表
result=BeautifulReport(套件)
# filename:测试报告的报告名称
# description:测试用例的名称,它将显示在图形页面中。
# report_dir:报告存储路径,不自动创建。
#主题:默认可以,但是不能写。
result.report生成的报告(filename=wxbot原子操作测试报告,description=测试死报告,report _ dir= report ,theme= theme _ deafult )如下:
转载请联系作者授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。