python之Unittest模块学习

1.什么是单元测试?
单元测试就是通过传参,对某个模块、某个类、某个函数进行结果输出后验证的测试

2.Python里面有两个单元测试的类:
2.1Unittest(Python自带)
2.2Pytest(下载安装)
PS:前者是接口自动化项目用;后者是WEB自动化项目、APP自动化项目用
思考:在接口自动化中是否可以用Pytest来替换Unittes

3.Unittest模块包含了如下几个字模块:
3.1TestCase(测试用例)
3.2TestSuit(测试集)
3.3TestLoader(加载用例)
3.4TextTestRunner(执行用例)/HTMLTestRunnerNew(推荐使用,生成HTML网页版测试报告)

注意:要在github下载好HTMLTestRunnerNew.py放在python的Lib路径下,然后就可以调用了。但是这种方式不好,原因是:代码发生迁移后,人家本地并没有下载此py文件,运行代码就会报错!解决方案是:在项目工程目录下,新建一个package包,把下载好HTMLTestRunnerNew.py放进去,这样有requirements.txt就可以进行移植了!

python之Unittest模块学习_第1张图片
python之Unittest模块学习_第2张图片
3.1TestCase(测试用例)使用方法:

3.1.1必须继承unittest.TestCase方法,用例名称前必须用test_开头,否则不识别!一条用例就是一个方法,def开头
3.1.2用例执行后,需要判断用例是Pass还是Fail,可以用unittest.TestCase模块的:断言
常用的断言方法

assertEqual(a,b,msg="None")  判断a,b是否相等,不相等时,抛出msg;
assertTure(x,msg="None") 判断x表达式是否为真,表达式为假时,抛出msg;
assertIn(a,b,msg="None") 判断a是否在b里面,a不在b里面时,抛出msg;
assertIsNone(x,msg="None") 判断x是否为空,x不为空时,抛出msg。

ps:可以使用多个断言方式,同时满足的条件下,用例才通过!!

3.1.3代码为什么要做异常处理,并且把错误抛出来,原因:
1.当程序运行的时候出现了异常,导致程序终止,无法运行剩下的代码了;
2.当程序出现异常,使用者无法看懂代码的错误,我们需要友好的显示错误信息即可。

import unittest
from xxx import MathMethod    #导入需要测试的方法
class TestMathMethod(unittest.Testcase):
	def test_testcase01(self):
		'''两个正数相加'''
		result=MathMethod(1,2).add()    #导入需要测试的方法后,传入参数
		try:
			self.assertEqual(3,result,msg:"预期结果与实际结果不相等")
		except Exception as e:     #Exception 常规错误(万能的)
			print("断言出错了:{}".format(e))
		raise e   #最后把错误抛出来
					

	def test_testcase02(self):
		"一正一负相加"
		result=MathMethod(-10,5).add()    #导入需要测试的方法后,传入参数

#作用:在别的地方引用此模块,调试的代码不会被导入
if __name__=="__main__":  #程序入口
	unitest.main()      #执行当前页面test_开头的所有用例

3.1.4 测试用例里面的setUp函数tearDown函数的使用
setUp函数:初始化环境(执行每条用例之前,都要执行setUp函数下面的代码,每次都要执行)
tearDown函数:清洗环境(执行每条用例之后,都要执行tearDown函数下面的代码,每次都要执行)

3.1.5测试用例里面的setUpClass函数tearDownClass函数的使用
setUpClass函数:初始化环境(执行测试类之前,要执行setUpClass函数下面的代码,只执行一次)
tearDownClass函数:清洗环境(执行测试类之后,要执行tearDownClass函数下面的代码,只执行一次)

3.2TestSuit(测试集)使用方法:

3.2.1当测试用例全部写完,但是只想执行其中部分,可以使用TestSuit()来收集测试用例

addTest()     #用例只能一个一个的添加,不方便(引入unittest.TestLoader(),批量加载用例)

import unittest
from xxx import xxx      #测试用例的类
suite=unittest.TestSuit()
suite.addTest(测试用例的类("用例名称1"))    #用例名称用字符串的形式传入
suite.addTest(测试用例的类("用例名称2"))
suite.addTest(测试用例的类("用例名称3"))
.....

3.3TestLoader(加载用例)使用方法:

方式一:通过测试类来加载用例(loadTestsFromTestCase)
一次性加载测试用例类名1下的所有用例

    import unittest
    from xxx import xxx      #测试用例的类
    suite=unittest.TestSuit()
    loader=unittest.TestLoader()
    suite.addTest(loader.loadTestsFromTestCase(测试用例类名1))  #测试用例类名直接传入

方式二:通过测试类所在的模块加载用例(loadTestsFromModule)
一次性加载测试用例模块名下的所有用例

import unittest
from xxx import xxx      #测试用例模块
suite=unittest.TestSuit()
loader=unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(测试用例模块名))   #测试用例模块名直接传入

3.4生成测试报告方法:

方式一:使用unittest自带的TextTestRunner生成测试报告(文本格式,不推荐使用)

with open("xxxx.txt","w",encoding="utf-8") as file:   #利用上下文管理器把测试结果写入到xxx.txt中
    runner=unittest.TextTestRunner(stream=file, descriptions=True, verbosity=2)  
    runner.run(suite)   #执行测试套件里面的所有用例

python之Unittest模块学习_第3张图片
方式二:使用第三方模块HTMLTestRunnerNew(生成HTML格式的测试报告,推荐使用)

with open("测试报告.html","wb") as file:
    runner = HTMLTestRunnerNew.HTMLTestRunner(stream=file,  
                                              verbosity=2,
                                              title="report",
                                              description="测试点",
										      tester="xiaochen")
    runner.run(suite)

注意:要在github下载好HTMLTestRunnerNew.py放在python的Lib路径下,然后就可以调用了。但是这种方式不好,原因是:代码发生迁移后,人家本地并没有下载此py文件,运行代码就会报错!解决方案是:在项目工程目录下,新建一个package包,把下载好HTMLTestRunnerNew.py放进去,这样有requirements.txt就可以进行移植了!
python之Unittest模块学习_第4张图片
python之Unittest模块学习_第5张图片
方式三:使用unittest.defaultTestLoader.discover() 模糊匹配
此方式不用添加测试套件(unittest.TestSuit())和加载测试用例(unittest.TestLoader())

import unittest
import HTMLTestRunnerNew

#使用unittest.defaultTestLoader.discover()自动查找指定文件夹下,以test_开头的.py模块里面的每一个测试方法
all_testcases=unittest.defaultTestLoader.discover(contants.testcases_dir, pattern='test_*.py',top_level_dir=None)  #第一个参数是:执行的路径;第二个参数是:以test_开头的模糊查询;3.第三个参数是:测试用例目录下还有子目录,需要top_level_dir =测试用例的根目录,第一个参数填写子目录。

#利用上下文管理器自动关闭资源
with open(contants.reports_html,"wb+") as file:    #选择绝对路径,把文件打开,写进内容 (报告的文件名直接写在路径里面)

    runner=HTMLTestRunnerNew.HTMLTestRunner(stream=file,
                                            title="xxx测试报告",
                                            description="描述测试点xxx",
                                            tester="xiaochen")

    runner.run(all_testcases)

你可能感兴趣的:(Python语法)