51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3470|回复: 0
打印 上一主题 下一主题

[转贴] Python Decorator实现数据驱动测试

[复制链接]
  • TA的每日心情
    无聊
    1 小时前
  • 签到天数: 493 天

    连续签到: 3 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2019-1-8 17:11:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    数据驱动的本质
    所谓数据驱动,是指一段测试代码的执行次数,由相关数据的多少决定,也就是数据『驱使』代码的执行。举个栗子,一个接口需要测试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  
    复制代码






    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-20 10:54 , Processed in 0.067712 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表