小强测试技术与人生杂谈

接口测试之DDT,纯代码实战,学起来

2020-12-09  本文已影响0人  测试帮日记

DDT,即数据驱动测试,简单的理解为数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。使用外部数据源实现对输入输出与期望值的参数化,避免在测试中使用硬编码的数据。

一、安装ddt模块

pipinstall ddt

ddt有四种模式:引入装饰器@ddt;导入数据@data;拆分数据@unpack;导入外部数据@file_data

二、参数化实现的方式

1、读取元组数据

、、、

#一定要和单元测试框架一起用

import unittest,os

from ddt import ddt,data,unpack,file_data

'''NO.1单组元素'''

@ddt

class Testwork(unittest.TestCase):

    @data(1,2,3)

    def test_01(self,value):      #value用来接收data的数据

        print(value)

if __name__ == '__main__':

    unittest.main()

结果:

=>1

  2

  3

'''NO.2多组未分解元素'''

@ddt

class Testwork(unittest.TestCase):

    @data((1,2,3),(4,5,6))

    def test_01(self,value):

        print(value)

if __name__ == '__main__':

    unittest.main()

结果:

=>(1, 2, 3)

  (4, 5, 6)

'''NO.3多组分解元素'''

@ddt

class Testwork(unittest.TestCase):

    @data((1,2,3),(4,5,6))

    @unpack          #拆分数据

    def test_01(self,value1,value2,value3):    #每组数据有3个值,所以设置3个形参

        print(value)

if __name__ == '__main__':

    unittest.main()

结果:

=>1 2 3

  4 5 6

、、、

2、读取列表数据

、、、

import unittest,os

from ddt import ddt,data,unpack,file_data

'''NO.1多组元素未分解'''

@ddt

class Testwork(unittest.TestCase):

    @data([{'name':'lili','age':12},{'sex':'male','job':'teacher'}])

    def test_01(self,a):

        print(a)

if __name__ == '__main__':

    unittest.main()

结果:

=>[{'name': 'lili', 'age': 12}, {'sex': 'male', 'job': 'teacher'}]

※上面结果可以看出:无法运用到requests数据请求中,所以不是很实用※

'''NO.2多组元素分解'''

@ddt

class Testwork(unittest.TestCase):

    @data([{'name':'lili','age':12},{'sex':'male','job':'teacher'}])

    @unpack

    def test_01(self,a,b):

        print(a,b)

if __name__ == '__main__':

    unittest.main()

结果:

=>{'name': 'lili', 'age': 12} {'sex': 'male', 'job': 'teacher'}

※拆分后的运行结果,不带有[ ],拆分是将列表中的2个字典拆分,所以有2个数据※

、、、

3、读取字典数据

、、、

import unittest,os

from ddt import ddt,data,unpack,file_data

'''※字典的读取比较特殊,因为在拆分的时候,形参和实参的key值要一致,否则就报错※'''

'''NO.1单组数据未分解'''

@ddt

class Testwork(unittest.TestCase):

    @data({'name':'lili','age':'16'},{'sex':'female','job':'nurser'})

    def test_01(self,a):

        print(a)

if __name__ == '__main__':

    unittest.main()

结果:

=>{'name': 'lili', 'age': '16'}

  {'sex': 'female', 'job': 'nurser'}

※以上运行的结果数据,就可以用来作为requests的请求参数~!※

'''NO.2多数据拆分,重点来了'''

@ddt

class Testwork(unittest.TestCase):

    @data({'name':'lili','age':'16'},{'name':'female','age':'nurser'})

    @unpack

    def test_01(self,name,age):

        print(name,age)

if __name__ == '__main__':

    unittest.main()

结果:

=>lili 16

  female nurser

※重点来了:首先结果展示的数据是字典里的value,没有打印key的值;其次@data里的数据key值和def方法里的形参名称一定要一致,否则,打印的时候,就会报莫名的参数错误。※

、、、

4、读取json文件数据

、、、

# data_json.json文件

{

    "test_case1": {

        "key": "value1",

        "status_code": 200

    },

    "test_case2": {

        "key": "value2",

        "status_code": 200

    },

    "test_case3": {

        "key": "value3",

        "status_code": 200

    }

}

# python读取json文件

@ddt

class InterfaceTest(unittest.TestCase):

    def setUp(self):

        self.url = "http://httpbin.org/get"

    def tearDown(self):

        print(self.result)

    @file_data("data_json.json")  #如不在同一级目录下需另做处理

    def test_get_request(self, key, status_code):

        r = requests.get(self.url, params={"key": key})

        self.result = r.json()

        self.assertEqual(r.status_code, status_code)

if __name__ == '__main__':

    unittest.main()

、、、

上一篇下一篇

猜你喜欢

热点阅读