Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作。
在说unittest之前,先说几个概念:
TestCase 也就是测试用例
TestSuite 多个测试用例集合在一起,就是TestSuite
TestLoader是用来加载TestCase到TestSuite中的
TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息
每种语言都有对应的单元测试框架:
python unittest
java junit
php phpunit
单元测试:
开发自己测自己写的代码
安装:
pip install unittest
简单实用unittest
import unittest def add(a,b): return a+b class AddTest(unittest.TestCase): def test_normal(self): #函数名要以test开头,否则不会被执行 result=add(1,1) self.assertEqual(2,result) #对比实际结果,和预期结果 def test_error(self): #函数名要以test开头,否则不会被执行 result=add(1,1) self.assertEqual(1,result) unittest.main() #会运行当前python文件里面的所有测试用例
运行测试用例的有两种方法(产生测试报告)
1、unittest.main()此方法适合运行当前文件的run
2、如果右键运行的时候出现(run 'Unittests in ......')就删掉方法1中的代码在运行
下面是一些常用的断言,也就是校验结果
assertEqual(a, b) a == b assertNotEqual(a, b) a != b assertTrue(x) bool(x) is True assertFalse(x) bool(x) is False assertIsNone(x) x is None assertIsNotNone(x) x is not None assertIn(a, b) a in b assertNotIn(a, b) a not in b
用例运行的先后顺序
import unittest def add(a,b): return a+b class AddTest(unittest.TestCase): def test_normal(self): print('test_normal') # result=add(1,1) # self.assertEqual(2,result) def test_error(self): print('test_error') # result=add(1,2) # self.assertEqual(3,result,'结果计算错误') def test_all(self): print('test_all') def test_zero(self): print('test_zero') unittest.main()
通过运行以上代码可以看出用例运行时按用例名称的字母顺序来运行的
class AddTest(unittest.TestCase): @classmethod #类方法 def setUpClass(cls): #所有用例执行之前都会运行setUpClass print('setUpClass') @classmethod #类方法 def tearDownClass(cls): #所有用例执行结束之后都会运行tearDownClass print('tearDownClass') def setUp(self): #每条用例执行前都要先执行setUp print('setUp') def tearDown(self): #每条用例执行之后都要执行tearDown print('tearDown')
通过执行以上代码可以看出,在特定运行方式情况下可以使用
产生测试报告
风格一
HTMLTestRunner
由于没有上传到pip源只能下载到本地,然后放到环境变量里面在import
import HTMLTestRunner import unittest def add(a, b): return a + b class AddTest(unittest.TestCase): def test_normal(self): # print('test_normal') result=add(1,1) self.assertEqual(2,result) def test_error(self): # print('test_error') result=add(1,2) self.assertEqual(3,result,'结果计算错误') file=open('report.html','wb') #以二进制模式打开一个文件 runner=HTMLTestRunner.HTMLTestRunner(file,title='测试报告') test_suite=unittest.makeSuite(AddTest) #把写的用例加进来(将AddTest类)加进来 runner.run(test_suite) #运行用例(用例集合 file.close()
在浏览器打开生成的report.html文件,HTMLTestRunner报告如上图:
风格二(一般用这个好换些)
BeautifulReport
由于没有上传到pip源只能下载到本地,然后放到环境变量里面在import
import BeautifulReport import unittest def add(a, b): return a + b class AddTest(unittest.TestCase): def test_normal(self): # print('test_normal') result=add(1,1) self.assertEqual(2,result) def test_error(self): # print('test_error') result=add(1,2) self.assertEqual(3,result,'结果计算错误') test_suite=unittest.makeSuite(AddTest) #把写的用例加进来(将AddTest类)加进来 repart=BeautifulReport.BeautifulReport(test_suite) #把test_suite加进来 repart.report(filename='bf_erport.html',description='测试报告') #运行指定文件名和标题
在浏览器打开生成的bf_report.html文件,HTMLTestRunner报告如上图:
bf.success_count,bf.failure_count #起的别名bf,后面两个紧跟的是用例通次数,和用例失败次数
test_suite=unittest.defaultTestLoader.discover('目录名','*.py') #查找指定目录下所有用例
参数化文件
def get_data_form_text(file_name): '''获取文件内容函数''' data=[] file_name=os.path.join(data_path,file_name) with open(file_name,encoding='utf-8') as fr: for i in fr: line=i.strip() if line: data.append(line.split(',')) return data
这个函数获取的内容是一个二维数组
from utlis.request import MyRequest from case.base_case import Basecase from parameterized import parameterized #导入这个模块参数化文件 from utlis.tools import get_data_form_text #这是写的一个函数读取文件的 class Testaddmoney(Basecase): username='niuhanyang' passwd='aA123456' @parameterized.expand(get_data_form_text('money')) #指定参数化文件名称 def test_add_money(self,stu_id,gold): '''学生批量添加金币''' userid,sign=self.login(self.username,self.passwd) data={'stu_id':stu_id,'gold':gold} headers={'cookie':'niuhanyang='+sign} print(headers) result=MyRequest('/api/user/gold_add','post',data,headers=headers) print(result.test)