51Testing软件测试论坛

标题: Python Decorator实现数据驱动测试 [打印本页]

作者: 测试积点老人    时间: 2019-1-8 17:11
标题: Python Decorator实现数据驱动测试
数据驱动的本质
所谓数据驱动,是指一段测试代码的执行次数,由相关数据的多少决定,也就是数据『驱使』代码的执行。举个栗子,一个接口需要测试100种输入,返回结果经过decode之后和预期结果进行比较。一般情况下,大家想到的办法就是循环读取这100种输入和预期结果,然后进行断言。其实,这已经实现了最基本的数据驱动模式。

循环的问题
虽然循环能在一定程度上能够解决数据驱动的问题,但是确定缺点也比较明显:
每一个需要数据驱动的测试用例,都要重写类似的循环;
写业务测试代码的同时,还需要关心语法逻辑
装饰器设计模式
关于装饰器的介绍文章已经有很多了,在这里就不多做介绍,没有这方面基础的请移步Python装饰器学习
Python装饰器实现数据驱动

先给出一段调用示例代码:
  1. @WebApiBaseTestCase.d_drive_data()  
  2. def test_negative_total_fee(self, money, code, msg, comment):  
  3.     r = self.bcw.gen_prepay_order_business(money)  
  4.     r_code = r['result']['error']['code']  
  5.     r_msg = r['result']['error']['message']  
  6.     self.assertEqual(code, r_code)  
  7.     self.assertEqual(msg, r_msg)
复制代码

测试代码中,只需要关心具体的业务逻辑。
装饰器源码
  1. def d_drive_data(msg='', level='test'):  
  2.     def _call(f):  
  3.         @functools.wraps(f)  
  4.         def __call(instance, *args, **kwargs):  
  5.             csv_file = instance._get_csv_file(level)  
  6.             print_log('CSV file is here: ' + csv_file)  
  7.             cdf = CsvParser(csv_file)  
  8.             init_data = cdf.get_iterator()  
  9.             # 循环逻辑在这里  
  10.             for data in init_data:  
  11.                 return_ = f(instance, **data)  
  12.             return return_  
  13.         return __call  
  14.     return _call  
复制代码











欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2