iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python接口自动化浅析数据驱动原理
  • 376
分享到

Python接口自动化浅析数据驱动原理

2024-04-02 19:04:59 376人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录一、openpyxl模块openpyxl模块介绍openpyxl安装openpyxl简单使用二、excel用例管理三、ddt介绍及使用ddt介绍ddt使用ddt:data:unp

在上一篇python接口自动化测试系列文章:Python接口自动化浅析登录接口测试实战,主要介绍接口概念、接口用例设计及登录接口测试实战。

以下主要介绍使用openpyxl模块操作excel及结合ddt实现数据驱动。

在此之前,我们已经实现了用unittest框架编写测试用例,实现了请求接口的封装,这样虽然已经可以完成接口的自动化测试,但是其复用性并不高。

我们看到每个方法(测试用例)的代码几乎是一模一样的,试想一下,在我们的测试场景中,

一个登录接口有可能会有十几条到几十条测试用例,如果每组数据都编写一个方法,

这样将会有更多的重复项代码,不仅执行效率不高,也不好维护。

接下来将会对框架进行优化,采用数据驱动方式:

  • 把测试数据用excel表格管理起来,代码做封装;
  • 用ddt来驱动测试,两部分相互独立。

一、openpyxl模块

openpyxl模块介绍

openpyxl是python第三方模块,运用openpyxl库可以进行excel的读和写。

在了解openpyxl模块之前,我们需要先熟悉excel的结构,才能更好理解openpyxl是如何操作excel。

从外到内,首先是一个excel文件(名),打开excel之后,会看到底部有一个或多个sheet(工作簿),每个sheet里有很多单元格,总体来说,主要分为三个层级。

在opnepyxl里面,一个Excel文件对应着一个Workbook对象, 一个Sheet对应着一个Worksheet对象,而一个单元格对应着一个Cell对象。了解这些之后,对openpyxl是如何操作excel就比较清楚了。

openpyxl安装

pip install openpyxl

openpyxl简单使用


import openpyxl
 
if __name__ == '__main__':
    path = 'F:/case/test_case.xlsx'
    # 读取excel文件
    workbook = openpyxl.load_workbook(path)
    # 读取所有sheet
    sheet = workbook.get_sheet_names()
    # 获取某个sheet
    sheet = workbook[sheet[0]]
    # 获取某个cell的值
    cell_val = sheet.cell(row=2, column=2).value
    print(cell_val)

以上仅介绍openpyxl常用的语法,有兴趣了解更多内容可自行百度扩展。

二、Excel用例管理

项目下,新建一个文件夹:data,文件夹下新建一个cases.xlsx文件,用来存放测试用例。

以下,是一个简单的登录测试用例设计模板:

可以根据该表格生成实际结果,并将测试结果写入(Pass、Fail)表格。

公众号后台回复:接口测试用例模板,可以获取完整接口测试用例Excle模板。

既然有了用例模板,我们就开始从用openpyxl模块对excel读写数据。

如下,在common文件夹下,新建excel_handle.py,用于封装操作excel的类。

excel_handle.py


import openpyxl
class ExcelHandler:
    def __init__(self, file):
        self.file = file
    def open_excel(self, sheet_name):
        """打开Excel、获取sheet"""
        wb = openpyxl.load_workbook(self.file)
        # 获取sheet_name
        sheet = wb[sheet_name]
        return sheet
    def get_header(self, sheet_name):
        """获取header(表头)"""
        wb = self.open_excel(sheet_name)
        header = []
        # 遍历第一行
        for i in wb[1]:
            # 将遍历出来的表头字段加入列表
            header.append(i.value)
        return header
    def read_excel(self, sheet_name):
        """读取所有数据"""
        sheet = self.open_excel(sheet_name)
        rows = list(sheet.rows)
        data = []
        # 遍历从第二行开始的每一行数据
        for row in rows[1:]:
            row_data = []
            # 遍历每一行的每个单元格
            for cell in row:
                row_data.append(cell.value)
                # 通过zip函数将两个列表合并成字典
                data_dict = dict(zip(self.get_header(sheet_name),row_data))
            data.append(data_dict)
        return data
    @staticmethod
    def write_excel(file, sheet_name, row, cloumn,data):
        """Excel写入数据"""
        wb = openpyxl.load_workbook(file)
        sheet = wb[sheet_name]
        sheet.cell(row, cloumn).value = data
        wb.save(file)
        wb.close()
if __name__ == "__main__":
    # 以下为测试代码
    excel = ExcelHandler('../data/cases.xlsx')
    data = excel.read_excel('login')

接下来结合ddt实现数据驱动,先简单来介绍下ddt。

三、ddt介绍及使用

ddt介绍

  • 名称:Data-Driven Tests,数据驱动测试
  • 作用:由外部数据集合来驱动测试用例的执行
  • 核心的思想:数据和测试代码分离
  • 应用场景:一组外部数据来执行相同的操作
  • 优点:当测试数据发生大量变化的情况下,测试代码可以保持不变
  • 实际项目:excel存储测试数据,ddt读取测试数据到单元测试框架(测试用例中)

补充:

所谓数据驱动,就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。说的直白些,就是参数化的应用。

ddt安装

pip install ddt

ddt使用

要想知道ddt到底怎么使用,我们从ddt模块源码中提取出三个重要的函数ddt、unpack、data。


def ddt(cls):
    """
    Class decorator for subclasses of ``unittest.TestCase``.
    Apply this decorator to the test case class, and then
    decorate test methods with ``@data``.
    For each method decorated with ``@data``, this will effectively create as
    many methods as data items are passed as parameters to ``@data``.
    The names of the test methods follow the pattern
    ``original_test_name_{ordinal}_{data}``. ``ordinal`` is the position of the
    data argument, starting with 1.
    For data we use a string representation of the data value converted into a
    valid python identifier.  If ``data.__name__`` exists, we use that instead.
    For each method decorated with ``@file_data('test_data.JSON')``, the
    decorator will try to load the test_data.json file located relative
    to the python file containing the method that is decorated. It will,
    for each ``test_name`` key create as many methods in the list of values
    from the ``data`` key.
    """
    for name, func in list(cls.__dict__.items()):
        if hasattr(func, DATA_ATTR):
            for i, v in enumerate(getattr(func, DATA_ATTR)):
                test_name = mk_test_name(name, getattr(v, "__name__", v), i)
                test_data_docstring = _get_test_data_docstring(func, v)
                if hasattr(func, UNPACK_ATTR):
                    if isinstance(v, tuple) or isinstance(v, list):
                        add_test(
                            cls,
                            test_name,
                            test_data_docstring,
                            func,
                            *v
                        )
                    else:
                        # unpack dictionary
                        add_test(
                            cls,
                            test_name,
                            test_data_docstring,
                            func,
                            **v
                        )
                else:
                    add_test(cls, test_name, test_data_docstring, func, v)
            delattr(cls, name)
        elif hasattr(func, FILE_ATTR):
            file_attr = getattr(func, FILE_ATTR)
            process_file_data(cls, name, func, file_attr)
            delattr(cls, name)
    return cls
def unpack(func):
    """
    Method decorator to add unpack feature.
    """
    setattr(func, UNPACK_ATTR, True)
    return func
def data(*values):
    """
    Method decorator to add to your test methods.
    Should be added to methods of instances of ``unittest.TestCase``.
    """
    global index_len
    index_len = len(str(len(values)))
    return idata(values)

ddt:

装饰类,也就是继承自TestCase的类。

data:

装饰测试方法。参数是一系列的值。

unpack:

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

知道了具体应用后,简单来个小例子加深理解。

test_ddt.py


import unittest
import ddt
# 装饰类
@ddt.ddt
class DdtDemo(unittest.TestCase):
    def setUp(self):
        pass
    def tearDown(self):
        pass
    
    # 装饰方法
    @ddt.data(("15312344578", "12345678"), ("15387654321", "12345678"))
    @ddt.unpack
    def test_ddt(self, username,passWord):
        print(username,password)
if __name__ == '__main__':
    unittest.main(verbosity=2)

运行结果为:

Ran 2 tests in 0.001s
OK
15312344578 12345678
15387654321 12345678

上面的例子是为了加深理解,接下来介绍excel结合ddt实现数据驱动,优化之前的test_login.py模块。

test_login.py


import unittest
from common.requests_handler import RequestsHandler
from common.excel_handler import ExcelHandler
import ddt
import json
@ddt.ddt
class TestLogin(unittest.TestCase):
    # 读取excel中的数据
    excel = ExcelHandler('../data/cases.xlsx')
    case_data = excel.read_excel('login')
    print(case_data)
    def setUp(self):
        # 请求类实例化
        self.req = RequestsHandler()
    def tearDown(self):
        # 关闭session管理器
        self.req.close_session()
    @ddt.data(*case_data)
    def test_login_success(self,items):
        # 请求接口
        res = self.req.visit(method=items['method'],url=items['url'],json=json.loads(items['payload']),
                             headers=json.loads(items['headers']))
        try:
            # 断言:预期结果与实际结果对比
            self.assertEqual(res['code'], items['expected_result'])
            result = 'Pass'
        except AssertionError as e:
            result = 'Fail'
            raise e
        finally:
            # 将响应的状态码,写到excel的第9列,即写入返回的状态码
            TestLogin.excel.write_excel("../data/cases.xlsx", 'login', items['case_id'] + 1, 9, res['code'])
            # 如果断言成功,则在第10行(测试结果)写入Pass,否则,写入Fail
            TestLogin.excel.write_excel("../data/cases.xlsx", 'login', items['case_id'] + 1, 10, result)
if __name__ == '__main__':
    unittest.main()

整体流程如下图:

到此这篇关于Python接口自动化浅析数据驱动原理的文章就介绍到这了,更多相关Python接口自动化数据驱动内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python接口自动化浅析数据驱动原理

本文链接: https://www.lsjlt.com/news/133509.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python接口自动化浅析数据驱动原理
    目录一、openpyxl模块openpyxl模块介绍openpyxl安装openpyxl简单使用二、Excel用例管理三、ddt介绍及使用ddt介绍ddt使用ddt:data:unp...
    99+
    2024-04-02
  • Python接口自动化浅析Token应用原理
    目录一、Token基本概念及原理1、Token作用2、什么是Token3、Token运行原理4、Token认证优点5、Token和 Cookie、Session 的选型二、Token...
    99+
    2024-04-02
  • Python接口自动化浅析如何处理动态数据
    在上一篇Python接口自动化测试系列文章:Python接口自动化浅析logging封装及实战操作,主要介绍如何提取token、将token作为类属性全局调用及充值接口如何携带tok...
    99+
    2024-04-02
  • Python接口自动化浅析unittest单元测试原理
    目录一、单元测试三连问1、什么是单元测试?2、为什么要做单元测试?3、怎么做单元测试?二、unittest模块说明1、unittest简介2、unittest组成1.TestCase...
    99+
    2024-04-02
  • Python接口自动化浅析requests请求封装原理
    目录以下主要介绍如何封装请求将常用的get、post请求封装起来get请求源码:post请求源码:再来研究下request源码:直接调用request函数在上一篇Python接口自动...
    99+
    2024-04-02
  • Python接口自动化浅析如何处理接口依赖
    在前面的Python接口自动化测试系列文章:Python接口自动化浅析logging封装及实战操作, 其中介绍了将logging常用配置放入yaml配置文件、logging日志封装及...
    99+
    2024-04-02
  • Python接口自动化浅析pymysql数据库操作流程
    目录一、pymysql介绍及安装01 pymysql介绍02 pymysql安装二、pymysql流程及模块说明01 pymysql操作流程02pymysql模块说明Connecti...
    99+
    2024-04-02
  • Python接口自动化浅析yaml配置文件原理及用法
    目录一、yaml介绍及使用01 yaml简介02 yaml语法规则03 yaml数据结构对象数组纯量二、yaml配置文件的使用01 yaml配置文件准备02 yaml配置文件格式校验...
    99+
    2024-04-02
  • Python接口自动化浅析登录接口测试实战
    目录1、什么是接口?那么,接口测试和功能测试的区别在哪呢?2、如何开展接口测试?3、如何设计接口用例?1.获取接口文档Fiddler2.分析接口文档的接口,提取测试点3.接口测试用例...
    99+
    2024-04-02
  • 怎么用Python实现数据驱动的接口自动化测试
    这篇文章主要讲解了“怎么用Python实现数据驱动的接口自动化测试”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python实现数据驱动的接口自动化测试”吧!在接口测试的过程中,很多时...
    99+
    2023-06-17
  • Python接口自动化浅析logging日志原理及模块操作流程
    目录一、日志介绍01 为什么需要日志?02 什么是日志?03 日志的用途是什么?04 日志的级别分为哪些?05 日志功能的实现二、Logging模块01 logging模块介绍02 ...
    99+
    2024-04-02
  • Python接口自动化之浅析requests模块get请求
    一、requests模块说明 介绍 Requests是Python语言的第三方的库,专门用于发送HTTP请求。 特点 1.Requests支持HTTP连接保持和连接池,支持使用coo...
    99+
    2024-04-02
  • Python接口自动化之浅析requests模块post请求
    在上一篇Python接口自动化测试系列文章:Python接口自动化之浅析requests模块get请求,介绍了requests模块、get请求及响应结果详解。接下来介绍request...
    99+
    2024-04-02
  • Python接口自动化浅析logging封装及实战操作
    在上一篇Python接口自动化测试系列文章:Python接口自动化浅析logging日志原理及模块操作流程,主要介绍日志相关概念及logging日志模块的操作流程。 而在此之前介绍过...
    99+
    2024-04-02
  • Python-接口自动化(一)
      一、python语言特点 1、易于学习:python有相对较少的关键字,结构简单,有一个明确定义的语法,学起来比较简单;   2、易于阅读:python代码定义的更清晰;   3、易于维护:python的成功在于它的源代码是相当容易...
    99+
    2023-01-31
    接口 Python
  • Python-接口自动化(十)
    (十一)ddt 1、利用ddt实现数据驱动,ddt是第三方模块,在终端输入pip install ddt 进行安装 导入:from ddt import ddt,data,unpack a、如果unpack后的参数少于5个可以使用 推荐...
    99+
    2023-01-31
    接口 Python
  • python+requests接口自动化
    文章来源:https://my.oschina.net/u/3041656/blog/820023         前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和j...
    99+
    2023-01-31
    接口 python requests
  • Python-接口自动化(三)
      (三)函数   1、函数 函数的语法: 1 def 函数名(): 2 3 函数体     a、函数的关键字是def,函数体就是你希望这个函数帮你实现什么功能,函数名命名需要遵循的原则是以小写字母分开,由数字字母数字...
    99+
    2023-01-31
    接口 Python
  • Python-接口自动化(六)
      (七)接口   1、接口:外部系统与本系统之间以及系统内部的各个子系统间,以约定标准提供的服务,包括对外提供的接口/对外提供的接口。 不同的请求协议:http  webservice  dubbo  socket http请求分为:...
    99+
    2023-01-31
    接口 Python
  • Python-接口自动化(九)
    (十)python操作Excel读/写测试数据 1、夹心饼干 setUp:在每一条测试用例执行之前执行 tearDown:在每一条测试用例执行之后执行 上面的这两个东东就叫做夹心饼干,在必要的时候写, 比如说在执行测试用例之前你有数据需...
    99+
    2023-01-31
    接口 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作