前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python数据驱动深入实践(一)

Python数据驱动深入实践(一)

作者头像
iTesting
发布2019-10-29 16:34:07
1.1K0
发布2019-10-29 16:34:07
举报
文章被收录于专栏:iTestingiTesting

iTesting,爱测试,爱分享

在做自动化测试特别是接口测试的过程中,我们经常碰到这样的例子,几个用例步骤,操作完全一样,仅仅是数据和结果不一样。常规的做法是每套数据写一个测试用例。

这样弊端也非常明显,一声假如这部分用例操作需要改变,那么用例要一个个修,二就是代码很不整洁。那么有什么好的办法没?今天我们来了解下自动化测试里的数据驱动。

顾名思义,数据驱动的存在就是为了解决上述问题。那么在自动化测试里,有哪些好的数据驱动库呢?

DDT (Data-Driven Tests) allows you to multiply one test case by running it with different test data, and make it appear as multiple test cases.

1.安装

代码语言:javascript
复制
pip install ddt

2.API

ddt作为unittest的补充,它的使用需要跟unittest结合起来。 ddt提供了如下用法:

ddt.add_test: 给一个类添加一个测试用例。

dd.ddt: 装饰类,也就是继承自TestCase的类。

ddt.data: 装饰测试方法。参数是一系列的值。

ddt.file_data: 装饰测试方法。参数是文件名。文件可以是json 或者 yaml类型。

注意,如果文件以”.yml”或者”.yaml”结尾,ddt会作为yaml类型处理,其他所有文件都会作为json文件处理。 如果文件中是列表,每个列表的值会作为测试用例参数,同时作为测试用例方法名后缀显示。 如果文件中是字典,字典的key会作为测试用例方法的后缀显示,字典的值会作为测试用例参数。

ddt.unpack: 传递的是复杂的数据结构时使用。比如使用元组或者列表,添加unpack之后,ddt会自动把元组或者列表对应到多个参数上。字典也可以这样处理。

测试用例方法名生成规则“ 使用ddt后,会产生一个新的测试用例方法名:之前的测试用例方法名_ordinal_data 之前的测试用例方法名:即定义的测试用例方法名。比如def test_large(),这里就是test_large

ordinal:整数,从1开始递加。

data: 如果传递过来的数据存在__name__属性,则这里就是该数据的__name__值。如果未定义__name__ 属性,ddt会尽量将传递过来的数据转化为python标识符,作为data显示。比如(3,2)就转化为3_2。需要注意的是,如果数据是字典,则这里就是字典的key。

ddt里用的最多的就是@data 和 @file_data:

data: contains as many arguments as values you want to feed to the test. file_data: will load test data from a JSON or YAML file.

3.举例

使用ddt很简单,你只需要在你的测试类上加装饰器@ddt, 然后在你需要用数据驱动测试用例上加装饰器@data @unpack, @file_data 即可。

我们先来看看@data的用法:

代码语言:javascript
复制
#ddt_related/test_ddt.py
#先看数据直接提供部分
import unittest

from ddt import ddt, data, unpack

def larger_than_2(x):
    return x>2


def add_values(x, y):
    return x + y


@ddt
class SampleTest(unittest.TestCase):
    def setUp(self):
        pass

    def test_larger_than_2_no_para(self):
        self.assertTrue(larger_than_2(2))

    @data(3, 4, 5)
    def test_larger_than_2(self, value):
        self.assertTrue(larger_than_2(value))

    @data((1,2, 3))
    def test_add_values(self, value):
        a, b, c = value
        self.assertEqual(add_values(a, b), c)

    @data([2, 3, 6], [4,5,9])
    @unpack
    def test_add_values_unpack(self, a, b, c):
       self.assertEqual(add_values(a, b), c)

    def tearDown(self):
        pass


if __name__ == "__main__":
    unittest.main()deblock %}

我们来运行下, 结合我们前面介绍过的pytest框架, commandline里运行:

代码语言:javascript
复制
python -m pytest ddt_related/test_ddt.py  --html=report.html

结果如下:

我们从结果中可以看到,ddt自动帮我们把数据驱动的用例分解成多个用例运行,用例名称也按照一定的规则重新生成了。

再来看看@file_data的用法:

代码语言:javascript
复制
# 我们先在ddt_related文件夹下建立文件json_data.json, 内容如下:
{
  "add_test": {"a":1, "b":2, "c":3}
}

#然后我们运行用例:

@ddt
class SampleTest(unittest.TestCase):
    def setUp(self):
        pass

    @file_data(os.path.join(os.path.dirname(__file__), "json_data.json"))
    def test_add_values_unpack(self, a, b, c):
        self.assertEqual(add_values(a, b), c)

    def tearDown(self):
        pass

# command line运行 python -m pytest ddt_related/test_ddt.py  --html=report.html
#我们发现用例执行成功, 说明json文件被正确的读取和应用了。
注意, ddt的一个坏处是什么? 不同的数据文件不能混淆在一个文件.

举例来说,我们实现了两个方法, 一个需要1个参数,另外一个需要2个参数。

代码语言:javascript
复制
def larger_than_2(x):
    return x>2


def add_values(x, y):
    return x + y

如果你想以一个文件放2个函数的数据,例如:

代码语言:javascript
复制
# 我们先在ddt_related文件夹下建立文件json_data.json, 内容如下:
{
  "add_test": {"a":1, "b":2, "c":3},
  "larger_than_2" :[1, 2, 3]
}
然后你运行用例,会失败如下:
TypeError: test_add_values_unpack() missing 2 required positional arguments: 'b' and 'c'
TypeError: test_larger_than_2() got an unexpected keyword argument 'b'

ddt给出的解释是:

In case of a list, each value in the list will correspond to one test case, and the value will be concatenated to the test method name. In case of a dict, keys will be used as suffixes to the name of the test case, and values will be fed as test data.

如果我们测试用例接受的参数个数不同,那么就需要建立不同的数据文件, 所以从这个程度上来说,ddt也有它的局限性, 那么如何规避这个问题呢?,我们可以在文件里存储数据,然后读出来后,按需放入@data来使用。

有了ddt,我们实现了用数据驱动测试, 并且代码量显著减少了,确实不错,我们如果再认真一点, 就会思考ddt是如何实现数据驱动的?为什么多一条数据就多一条用例? 为什么用了ddt, 我测试用例的名称,在测试报告的体现,不再是原来的了,而是加了suffix?

下面我将带领大家深入了解ddt的实现,并由此自己用代码实现数据驱动, 敬请期待 :)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iTesting 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.安装
  • 2.API
    • ddt里用的最多的就是@data 和 @file_data:
    • 3.举例
      • 注意, ddt的一个坏处是什么? 不同的数据文件不能混淆在一个文件.
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档