unittest框架核心要素及应用黑马

1.unittest核心要素

unittest介绍测试框架,不仅仅用于单元测试python自动的测试包用法和django.test.TestCase类似1.1unittest介绍和核心要素

1.2unittest核心要素的使用

1.测试用例2.容器,容器添加测试用例3.运行容器中的测试用例importunittest#测试类,继承于unittest.TestCaseclassMyTest(unittest.TestCase):deftest_1(self):print(test_1)deftest_2(self):print(test_2)if__name__==__main__:#类的外面#2.容器,容器添加测试用例suite=unittest.TestSuite()#测试用例的执行顺序,按添加的顺序执行suite.addTest(MyTest(test_1))suite.addTest(MyTest(test_2))#3.运行容器中的测试用例runner=unittest.TextTestRunner()runner.run(suite)

注意:只能通过命令运行

pythonxxx.py

1.3Fixture

测试类中:实现了前、后置方法,它就是一个fixture1.4defaultTestLoader

1.测试用例2.容器,容器添加测试用例3.运行容器中的测试用例importunittest#测试类,继承于unittest.TestCaseclassMyTest(unittest.TestCase):deftest_1(self):print(test_11)deftest_2(self):print(test_22)if__name__==__main__:#2.容器,容器添加测试用例#默认找指定路径下,所有test开头的文件#参数1:路径,参数2:指定的文件suite=unittest.defaultTestLoader.discover(./,test_2_demo.py)#3.运行容器中的测试用例runner=unittest.TextTestRunner()runner.run(suite)

注意:只能通过命令运行

pythonxxx.py

2.unittest基本使用

1.导入unittest模块2.新建类,继承于unittest.TestCase3.类中方法1.前、后置(不是必须的,有前置必须写后置,匹配的)2.test开头的测试用例(测试用例中有断言)4.unittest.main()运行测试importunittestclassMyTest(unittest.TestCase):

classmethoddefsetUpClass(cls)-None:print(setUpClass)

classmethoddeftearDownClass(cls)-None:print(tearDownClass)defsetUp(self)-None:print(setUp)deftearDown(self)-None:print(tearDown)deftest_1(self):print(test_)deftest_s(self):print(test_s)a=1+1self.assertEqual(a,2,结果不为2)deftest_f(self):print(test_f)a=1+2self.assertEqual(a,3,结果不为3)defxxx_xxx(self):#不会执行非test开头的方法print(xxxxx)if__name__==__main__:unittest.main()

测试用例运行顺序:0~9,A~Z,a~zpython代码运行,pycharm直接右击运行,等价于:pythonxxx.py3.断言

#arg1和arg2相等,测试通过,标志为.#arg1和arg2不相等,测试不通过,标志为F,抛出异常,显示msg的信息unittest.assertEqual(arg1,arg2,msg=None)

4.参数化

importunittestfromparameterizedimportparameterized#需要先安装模块classMyTest(unittest.TestCase):defsetUp(self)-None:print(setUp)deftearDown(self)-None:print(tearDown)#1.参数化参数:列表套元组#2.列表有几个元素,测试用来执行几次#3.元组元素的位置匹配测试用例的形参

parameterized.expand([(mike,),(yoyo,abc)])deftest_params(self,name,pwd):print(name=%s,pwd=%s%(name,pwd))if__name__==__main__:unittest.main()

5.mock

5.1mock介绍

5.2Mock类基本使用

5.2.1return_value

importunittestimportunittest.mockclassMyTest(unittest.TestCase):deftest_return(self):#1.创建Mock()对象,给return_value关键字传参mock_obj=unittest.mock.Mock(return_value=)#mock_obj是对象,可调用对象,用法和函数一样ret=mock_obj()print(ret)

5.2.2side_effect

importunittestimportunittest.mockclassMyTest(unittest.TestCase):deftest_except(self):#1.创建Mock()对象,传递异常对象mock_obj=unittest.mock.Mock(side_effect=BaseException(自定义异常))#mock_obj是对象,可调用对象,用法和函数一样mock_obj()deftest_list(self):#1.创建Mock()对象,传递listmock_obj=unittest.mock.Mock(side_effect=[1,2,3])#mock_obj是对象,可调用对象,用法和函数一样print(mock_obj())print(mock_obj())print(mock_obj())print(mock_obj())#err,StopIterationdeftest_func(self):deffunc(a,b):returna+b#1.创建Mock()对象,传递函数名mock_obj=unittest.mock.Mock(side_effect=func)#mock_obj是对象,可调用对象,用法和函数一样print(mock_obj(1,1))#TypeError:func()missing2requiredpositionalarguments:aandbmock_obj()

5.2.3mock案例

5.3限制模拟的范围

classMyTest(unittest.TestCase):deftest_1(self):#unittest.mock.Mock#通过这种方式Mock后,后面调用的测试用来也有效果(保证mock先执行)pay.pay_way=unittest.mock.Mock(return_value={result:success,reason:null})ret=pay_status.pay_way_status()print(test_1=,ret)self.assertEqual(ret,支付成功,支付失败)deftest_2(self):ret=pay_status.pay_way_status()print(test_2=,ret)self.assertEqual(ret,支付成功,支付失败)

5.3.1mock.path

5.3.2patch上下文管理器

通过mock.path或者patch上下文管理器,限制mock范围patch上下文管理器注意作用域问题importunittestimportunittest.mockimportpayimportpay_statusclassMyTest(unittest.TestCase):

unittest.mock.patch(pay.pay_way)deftest_1(self,mock_obj):mock_obj.return_value={result:success,reason:null}ret=pay_status.pay_way_status()print(test_1=,ret)self.assertEqual(ret,支付成功,支付失败)deftest_3(self):withunittest.mock.patch(pay.pay_way)asmock_obj:mock_obj.return_value={result:success,reason:null}ret=pay_status.pay_way_status()print(test_3=,ret)self.assertEqual(ret,支付成功,支付失败)deftest_2(self):ret=pay_status.pay_way_status()print(test_2=,ret)self.assertEqual(ret,支付成功,支付失败)if__name__==__main__:unittest.main()

5.4类方法替换

fromunittestimportmockimportunittestclassPay(object):defpay_way(self):假设这里是一个支付的功能,未开发完支付成功返回:{result:success,reason:null}支付失败返回:{result:fail,reason:余额不足}reason返回失败原因raiseNotImplementedError(代码还没有实现)defpay_way_status(self):根据支付的结果success或fail,判断跳转到对应页面假设这里的功能已经开发完成#todo此时pay_way()函数并未完成!你先假定他完成了result=self.pay_way()print(result)ifresult[result]==success:return支付成功ifresult[result]==fail:return支付失败classTestPayStatues(unittest.TestCase):单元测试用例deftest_1(self):p=Pay()p.pay_way=unittest.mock.Mock(return_value={result:success,reason:null})ret=p.pay_way_status()self.assertEqual(ret,支付成功,测试失败)

unittest.mock.patch.object(Pay,pay_way)deftest_2(self,mock_obj):mock_obj.return_value={result:success,reason:null}p=Pay()ret=p.pay_way_status()self.assertEqual(ret,支付成功,测试失败)deftest_3(self):withunittest.mock.patch.object(Pay,pay_way)asmock_obj:mock_obj.return_value={result:success,reason:null}p=Pay()ret=p.pay_way_status()self.assertEqual(ret,支付成功,测试失败)

5.5常用的方法和属性

importunittestimportunittest.mockclassMockTest(unittest.TestCase):deftest_return_value(self):mock_obj=unittest.mock.Mock(return_value=)result=mock_obj()print(result)#打印mock_obj()print(mock_obj.called)#是否被调用过,返回布尔值print(mock_obj.call_count)#获取调用测试,返回调用测试

6.测试报告

6.1HTMLTestRunner

0.导包,importunittest1.定义类,继承unittest.TestCase2.是一个fixture,有前置后置方法3.有test开头的测试用例,结果用断言判断4.运行测试importunittestfromHTMLTestRunner.HTMLTestRunnerimportHTMLTestRunner#需要安装插件classMyTest(unittest.TestCase):defsetUp(self)-None:print(setUp)deftearDown(self)-None:print(tearDown)

classmethoddefsetUpClass(cls)-None:print(setUpClass)

classmethoddeftearDownClass(cls)-None:print(tearDownClass)deftest_1_add(self):num=1+2print(test_add)self.assertEqual(num,3,msg=加法错误)deftest_2_sub(self):num=1-1print(test_sub)self.assertEqual(num,3,msg=减法错误)if__name__==__main__:#1.把测试用例添加到suite容器中suite=unittest.defaultTestLoader.discover(./,test_1.py)#2.打开文件,是一个文件对象withopen(./HTMLTestRunner.html,w,encoding=utf-8)asf:#3.HTMLTestRunner()创建一个runner对象runner=HTMLTestRunner(stream=f,#测试报告需要写入到的文件verbosity=2,#控制台输出信息的详细程度,默认为1title=这是报告标题,#测试报告的标题description=这是一个测试报告内容#测试报告的描述)#4.runner把容器中测试用例运行runner.run(suite)

6.2BeautifulReport

importunittestfromBeautifulReportimportBeautifulReportclassMyTest(unittest.TestCase):defsetUp(self)-None:print(setUp)deftearDown(self)-None:print(tearDown)

classmethoddefsetUpClass(cls)-None:print(setUpClass)

classmethoddeftearDownClass(cls)-None:print(tearDownClass)deftest_1_add(self):addnum=1+2print(test_add)self.assertEqual(num,3,msg=加法错误)deftest_2_sub(self):subnum=1-1print(test_sub)self.assertEqual(num,3,msg=减法错误)if__name__==__main__:#1.把测试用例添加到suite容器中#suite=unittest.defaultTestLoader.discover(./,test_2.py)suite=unittest.defaultTestLoader.discover(./)#2.创建runner对象,同时把suite传参进入runner=BeautifulReport(suite)#3.运行,同时生成测试报告#参数1:生成文件的注释,参数2:生成文件的filename,参数3:生成report的文件存储路径runner.report(报告描述必须有,在报告中显示为用例名称,测试报告文件名2,./)

7.综合案例

7.1测试流程和目录结构

7.2基础工具方法类:读取json数据

#读取json文件#1.传入文件,读取内容,返回文件中数据#路径的处理importosimportjsonclassData(object):#类属性#获取工程所在的绝对路径BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#设置为类方法,是为了方便调用

classmethoddefread_info(cls,file_name=server.json)::paramfile_name:文件名:return:文件中的json数据file_path=os.path.join(cls.BASE_DIR,data,file_name)#print(file_path)#只读方式打开文件withopen(file_path,r,encoding=utf-8)asf:ret=json.load(f)#load,加载,加载是读#print(ret)returnret#测试一下#print(Data.BASE_DIR)#ret=Data.read_info(server.json)#ret=Data.read_info(users/login_users.json)#print(ret=,ret)

7.3基础工具方法类:请求封装

1.发送请求,只需要指定路径‘/login/’,无需指定url,其他参数和原来的一样importrequestsdefxxx(path=/info/,params=None,**kwargs):url=


转载请注明:http://www.jiaju1314.com/xxzl/xxzl/16549.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了