在做自动化测试时,我们通常有这样的需求,对某一个用例,希望可以根据我们提供的不同数据而运行多次,每次运行加载一条数据,但是运行的是同一个用例,仅仅是数据不同。
这个模式Java里TestNG有个概念叫DataProvider, python里也有,叫ddt。 上次我们介绍了用法,连接在此Python数据驱动实践,今天来讲下如何自己实现一个ddt。
我们先来看一个简单例子:
正常来说, 要验证这个函数的实现正确与否,最基本的两个检查点一定是一个通过一个不通过。 上面代码可以看到我们写了两条用例,基本实现了我们的需求,但是感觉还有优化的空间,于是我们改成了这样
看起来简单了一点,但是对于接口测试来说,一个函数可能验证的点有几十条,难道我们要copy-paste test_sum_data这个函数多次吗?
大家都知道, python里有装饰器这个概念,装饰器最大的特点就是接收一个函数称为参数,然后做一些”夹带私货“的操作后再返回这个函数。
如果你不是很了解装饰器的话,也没关系,你只要记住如下转换就可以了:
python解释器会解释成下面这样的语句:
了解了上面,那我们继续看,我们应该怎么用装饰器来精简我们的函数:
可以看到函数第2此运行的时候失败了,报的错也是assert error。
你们发现没? 函数test_sum_data的自身的实参不起作用了, 变成从my_data提供了,那么我的函数就要相应的优化下
可是还有个问题,我想把这个数据驱动给我不同的函数使用怎么办?
就这样,我们一步一步实现了数据驱动的功能,实际上,如果你看过Python DataProvidor–ddt的源码,就发现,它实际上也是这么实现的。
本文的主要难点在装饰器上,而对于装饰器的理解,主要难点在闭包上,大家可以相应的搜索下,如有疑问,欢迎交流。
Hold On, 这就结束了吗? NO!
我们知道,自动化过程中我们通常会希望一个case在报告里有一个对应结果. 但对于我们实现的DataProvider,在测试报告里只会显示一条记录,太不利于我们调试了。
那么,如何在测试报告里体现呢? 且听下回分解:)