接口自动化测试--基于Python+unittest框架实例

上一节我们介绍了基Python + unittest框架实现接口自动化测试的相关内容,本节我们继续介绍如何对重复的一些操作进行封装,增加代码的复用性以及框架的可维护性。

1. 模块封装

上一节中的测试用例,不论是请求login接口还是请求door接口,都是通过调用python的requests模块发送请求,在每个用例中单独实现,因此我们可以将这部分在每个用例中请求接口的操作做统一封装,方便各个测试用例使用以及后期维护。

1)excel数据读取模块封装

在common包中新建一个模块,命名为"read_Xls.py",示例代码如下:

#coding:utf-8
__author__ = 'Mr. null'

import xlrd

class ReadExcel():
     def readExcel(fileName,SheetName="Sheet1"):
         data = xlrd.open_workbook(fileName)
         table = data.sheet_by_name(SheetName)

         #获取总行数
         nrows = table.nrows
         if nrows > 1:
             #获取第一列的内容,列表格式
             keys = table.row_values(0)

             listData = []
             for col in range(1,nrows):
                 values = table.row_values(col)
                 api_dict = dict(zip(keys, values))
                 listData.append(api_dict)
             return listData
         else:
             print("表格无数据")
             return None

if __name__ == '__main__':
    print('read xls')

read_Xls.py模块读取excel表格数据,返回的是一个列表,里面的数据以字典格式存放,通过索引得到字典然后取字典的值。

2)发送请求模块封装

在common包中新建一个模块,命名为"req_api.py",示例代码如下:

# -*- coding:utf-8 -*-

import requests
import json

class SendRequests():

    def sendRequests(self,Data,header=''):
        '''
        从表格中获取测试数据作为参数值发送
        '''
        method = Data["method"]
        url = Data["url"]
        if Data["params"] == "":
            param = None
        else:
            param = eval(Data["params"])

        if Data["body"] == "":
            body_data = None
        else:
            body_data = eval(Data["body"])

        #发送请求
        if method == 'get':
            resp = requests.get(url=url,headers=header,params=param)
        elif method == 'post':
            resp = requests.post(url=url,headers=header,data=json.dumps(body_data))
        return resp

if __name__ == '__main__':
    print('start testing...')

req_api.py模块实现了对输入的字典数据进行解析,并通过get、post方法向服务端接口发送请求的过程。

2. 数据驱动测试

DDT,是Data-Driven Tests的缩写,翻译成中文就是“数据驱动测试”,在自动化测试框架中,数据驱动的意思是测试用例或者说测试套件是由外部数据集合来驱动,其主要特点就是让测试数据独立于测试脚本单独存在,解除脚本与数据之间的强耦合,测试脚本不再负责管理测试数据,而测试数据在数据驱动测试中会以文件或者数据库的形式存在。脚本每次执行会从数据文件或者数据库中读入测试数据,根据测试数据的不同走进不同的测试路径。在整个测试中,测试脚本是一成不变的,它一直执行它本身的代码,而活着的是我们的测试数据集,我们通过不同的数据控制测试脚本中代码的走向。因此,才有了数据驱动的说法。

1)Python ddt模块

Python 的 unittest 没有自带数据驱动功能,如果需要数据驱动,就需要第三方模块 ddt ,在命令行输入如下命令:

pip install ddt

Tips:

pip 是一个 Python 包安装与管理工具,安装Python后默认带pip

使用方法:

  • @ddt:
    装饰类,也就是继承自TestCase的类,示例如下:
@ddt
class Test_Login(unittest.TestCase):
  • @data():
    装饰测试方法,参数是一系列的值,示例如下:
    @data(*testData)
    def test_login(self,data):

2)构造测试数据

data目录下创建一个名为"data_login.xlsx"的表格文件,表格表头及含义如下表所示:

id name method url params headers body status_code expect_result
用例编号 用例名称 请求方法 url 参数 请求头 body 状态码 预期结果

在login.xlsx表格中增加登录相关的5条测试用例

3)开发登录接口测试用例

上面我们完成了发送请求模块、读取表格模块的封装以及测试数据的构造,加下来我们就可以开发测试用例了,在testcase包中新建模块"test_login.py",代码实例如下:

#coding:utf-8
__author__ = 'Mr. null'

import unittest
from ddt import ddt,data
from common.req_api import SendRequests
from common.read_Xls import ReadExcel
import os

path = os.path.dirname(os.getcwd())+"\\data\\data_login.xlsx"
testData = ReadExcel.readExcel(path,"Sheet1")

@ddt
class Test_Login(unittest.TestCase):

    def setUp(self):
        print('start test...')

    @data(*testData)
    def test_login(self,data):
        #发送请求并获取响应包体
        resp = SendRequests().sendRequests(data)
        #切割字符串取后面的部分
        expect_result1 = data["expect_result"].split(":")[1]
        #转换为字符串
        expect_result = eval(expect_result1)
        #断言判断返回结果与预期结果是否一致
      

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

<p> 本专刊共五章 21 篇正文及 5 个对应的 GitHub 项目,主要介绍了接口测试基础知识及测试用例设计方法,认证鉴权、加密验签,自动化测试,安全性测试,性能测试等内容,每一章节都有代码实例来剖析其原理,并提供了一个完整电商系统的代码,可以直接实操演练,让你知其然知其所以然,轻松搞定接口测试。加入专刊,你就加入了一大群志同道合的优质测试人圈子,同时还有和作者及作者的朋友们互动交流的机会。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p> <p> <br /> </p>

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务