接口自动化测试

Posted cnhkzyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口自动化测试相关的知识,希望对你有一定的参考价值。

一. 定义公共的请求方法

如下图所示,同一个模块,只是请求数据和返回数据不同,http请求的发送过程是完全相同的

技术分享图片

对于不同模块,只是请求的url、请求方法、请求数据和返回数据不同,http请求的过程也是完全相同的

技术分享图片

这样就可以将发送请求的方法写成一个类或函数,供不同的测试用例调用

具体的实现是

import requests

class MyRequests:

    def send_request(self, method, url, **kwargs):
        res = requests.request(method, url, **kwargs).text
        return res

二. 利用excel存储测试数据,实现测试数据和测试脚本的分离

利用excel存储测试数据的好处是,可以实现测试数据和测试脚本的分离,以后一旦数据有变动(添加删除、修改测试数据),不需要修改代码,只在excel中修改就好了

技术分享图片

那么,测试数据和脚本是怎么联系在一起的?

可以定义一个读取excel的类,这个类读取到的数据返回给测试用例,测试用例再调用每一条测试数据去发送请求,进行比对。但有一个问题,按照以往的做法,一个test_send_request函数里利用for循环遍历每条测试数据,得到的结果始终是一个测试用例,我们希望每一条测试数据都是一个测试用例,就需要用到ddt

三. ddt

1. 什么是ddt

ddt(data driven tests):数据驱动测试,由外部数据集合来驱动测试用例

核心的思想:数据和测试代码分离

 

2. 应用场景

一组数据来执行相同的操作

当测试数据发生大量变化的情况下测试代码(或者说测试用例)可以保持不变

 

3. ddt的安装

pip install ddt

 

4. ddt的用法

使用之前先导入ddt:

import ddt

 

ddt结合单元测试来使用

1). 在测试类定义之前使用:@ddt

2). 在测试用例定义之前使用:@ddt.data(测试数据),测试数据之间用逗号隔开

3). 在2的基础上定义测试用例时,参数接收2中的测试数据

 

例:

@ddt.ddt

class DemoTest(unittest.TestCase):

  @ddt.data(2,3,4)

  def test_print(self, a):

    print("简单调用@data查看输出的值是什么?", a)

 

一组数据之间用逗号隔开

data的参数可以为如下几种:

1) 一组数据中,每个数据为单个值

2) 一组数据中,每个数据为一个列表或者一个字典

3) 文件对象:json、yaml

 

一组数据中的数据为列表或者字典:

@data([a,b],[c,d])

 

如何从以上数据中获取到列表中每一项值?

@unpack

 

若变量A=[{a:b, a1:b1},{c:d, c1:d1}]

如何将变量A中的每一组元素作为测试数据?

@data(*A)

 

数据为文件对象:json、yaml

{"name":"nick","gender":"male","age","29"}

 

@ddt.file_data(json文件路径)

 

思考:如何结合excel来使用ddt?

 

4. 实例

实例1

import ddt
import unittest

@ddt.ddt
class test_ddt(unittest.TestCase):

    @ddt.data(1,2,3,4,5,6,7)
    def test_print(self, a):
        print(a)


运行结果:
Launching unittests with arguments python -m unittest class_ddt.test_ddt in D:python_workshoppython6
evisefutureloan_API_framework
1
2
3
4
5
6
7


Ran 7 tests in 0.006s

OK

实例2

import ddt
import unittest

@ddt.ddt
class test_ddt(unittest.TestCase):

    @ddt.data([1,2],[10,11])
     def test_print(self, a):
        print(a)


运行结果:
Launching unittests with arguments python -m unittest D:/python_workshop/python6/revise/futureloan_API_framework/class_ddt.py in D:python_workshoppython6
evisefutureloan_API_framework



Ran 2 tests in 0.001s

OK
[1, 2]
[10, 11]

实例3

import ddt
import unittest

@ddt.ddt
class test_ddt(unittest.TestCase):

    @ddt.data([1,2],[10,11])
    @ddt.unpack
    def test_add_print(self,a,b):
        print(a+b)


运行结果:
Launching unittests with arguments python -m unittest class_ddt.test_ddt in D:python_workshoppython6
evisefutureloan_API_framework
3
21


Ran 2 tests in 0.002s

OK

实例4

import ddt
import unittest

data = [1,2,3,4,5,6,7,8,9,10]

@ddt.ddt
class test_ddt(unittest.TestCase):

    #从一个变量当中取值,变量是字典或者列表:表达式:*变量名
    @ddt.data(*data)
    def test_print(self, a):
        print(a)


运行结果:
Launching unittests with arguments python -m unittest D:/python_workshop/python6/revise/futureloan_API_framework/class_ddt.py in D:python_workshoppython6
evisefutureloan_API_framework
1
2
3
4
5
6
7
8
9
10


Ran 10 tests in 0.005s

OK

 

 

 

参考文章

https://www.cnblogs.com/hellowcf/p/6962935.html

 

以上是关于接口自动化测试的主要内容,如果未能解决你的问题,请参考以下文章

JMeter接口测试-模块控制器

接口测试

python接口自动化测试二:python代码实现接口测试

接口自动化测试持续集成--Soapui接口测试

不用写代码,也能做好接口测试

pytest接口自动化测试框架 | 用python代码测试接口