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就可以进行移植了!
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) #执行测试套件里面的所有用例
方式二:使用第三方模块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就可以进行移植了!
方式三:使用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)