【Python自动化测试17】openpyxl二次封装与数据驱动

文章目录

  • 一、前言
  • 二、二次封装
  • 三、数据驱动

一、前言

  本文章主要讲解Python自动化测试中openpyxl的二次封装,在自动化测试中能够更好的管理测试用例以及代码,除此之外下方有系列文章的传送门,还在持续更新中,感兴趣的小伙伴也可以前往查看,话不多说,让我们一起看看吧~

系列文章:
  系列文章1:【Python自动化测试1】遇见Python之美
  系列文章2:【Python自动化测试2】Python安装配置及PyCharm基本使用
  系列文章3:【Python自动化测试3】初识数据类型与基础语法
  系列文章4:【Python自动化测试4】字符串知识总结
  系列文章5:【Python自动化测试5】列表与元组知识总结
  系列文章6:【Python自动化测试6】字典与集合知识总结
  系列文章7:【Python自动化测试7】数据运算符知识合集
  系列文章8:【Python自动化测试8】流程控制语句讲解
  系列文章9:【Python自动化测试9】函数知识合集
  系列文章10:【Python自动化测试10】文件基础操作
  系列文章11:【Python自动化测试11】模块、包与路径知识合集
  系列文章12:【Python自动化测试12】异常处理机制知识合集
  系列文章13:【Python自动化测试13】类、对象、属性与方法知识合集
  系列文章14:【Python自动化测试14】Python自动化测试基础与进阶练习题
  系列文章15:【Python自动化测试15】unittest测试框架的核心概念与作用
  系列文章16:【Python自动化测试16】测试用例数据分离

  

二、二次封装

  基于上一次16章节的代码,我们可以继续对代码进行优化封装,封装后的代码会更加高效,主要分为三个文件:

(1)test_login.py # 测试文件
(2)login_function # 存储被测函数
(3)excel # excel表格读取
(4)login_case.xlsx # 测试用例数据

  优化后的代码如下所示(如果没有看过16章的同学,建议先去阅读16章):

"""被测函数:login_function"""
def login(username=None, password=None):
    if username is None or password is None:
        return {"code": 400, "msg": "用户名或密码为空"}
    if username == "萌笑天" and password == "123456":
        return {"code": 200, "msg": "登录成功"}
    return {"code": 300, "msg": "用户名或密码错误"}

"""测试文件:test_login.py"""
import unittest
from excel import read_excel # 导入read_excel的函数,以使用对应的功能
from login_function import login

# 获取excel数据
login_data = read_excel("login_case.xlsx", "login")

class TestLogin(unittest.TestCase):

    def test_login_success(self):
        # 通过索引为0,找到第一组测试数据
        data_info = login_data[0]
        # 取出测试数据当中的data字段
        user_info = eval(data_info["data"])
        username = user_info["username"]
        password = user_info["password"]
        expected = eval(data_info["expected"])

        actual = login(username, password)

        self.assertEqual(expected, actual)
        
"""表格读取:excel.py"""

"""
Python操作excel的思路:
1、先打开excel文件
2、选择对应表格页签
3、读取对应单元格数据
4、通过数据实现一定的操作
5、关闭excel文件
"""
import openpyxl  # 专门用于处理excel表格的库,openpyxl拥有pandas的特性,并属于轻量级库,不会像pandas一样更加复杂,更具优势
from openpyxl.worksheet.worksheet import Worksheet


def read_excel(file_path, sheet_name ):
    """读取excel的函数"""
    workbook_data = openpyxl.load_workbook(file_path)  # 打开名称为case.xlsx的excel文档
    sheet: Worksheet = workbook_data[sheet_name]  # 页签名为login,定位到login页签,指明sheet类型为Worksheet

    # """如果我们想要获取某一个单元格的数据,可以使用这个方式,但往往一个表格中有庞大的数据,我们并非通过这样的方式获取"""
    # cell = sheet.cell(row=1, column=1)  # 获取单元格数据,row为行,column为列,代码中表示的为第一行第一列的单元格
    # print(cell.value)  # 获取第一行第一列的数据

    """更推荐的获取方法是获取所有数据,因为获取的数据并非列表类型,我们还需要进一步进行数据转换"""
    values = list(sheet.values)
    workbook_data.close()  # 关闭文件
    title = values[0]
    rows = values[1:]
    new_rows = [dict(zip(title, row)) for row in rows]
    return new_rows

data = read_excel("login_case.xlsx", "login")
print(data)

  测试用例数据如下所示:
在这里插入图片描述

  执行结果如下所示,测试通过:
【Python自动化测试17】openpyxl二次封装与数据驱动_第1张图片

  当有过多的测试函数数据时我们需要通过循环去遍历,也就是for循环遍历,虽然更加便捷可以省略过多的测试函数编写,当仍然会出现一些新问题,Python程序从上往下执行,并逐条进行excel的数据读取,一旦出现报错,会终止程序运行,如下所示,会告知预期结果与实际结果不符,那么程序就会终止运行了(代码中没有直接使用for循环):
【Python自动化测试17】openpyxl二次封装与数据驱动_第2张图片
  

三、数据驱动

  思想:数据驱动(data driven testing)是一种将测试数据(输入,和期望输出)从只包含测试逻辑的测试脚本代码中区别开的方法,简单点说也就是数据分离,数据驱动也是使用不同的数据达到想要的目的。
  实现:通过导入数据驱动(DDT)的方式,进行数据驱动:
  注意:特别需要注意的就是,如果在代码中加了装饰器实现了数据驱动后,执行代码需要在空白行执行,否则会出现AttributeError的报错,需要牢记!
  意义:
  (1)测试逻辑高,代码复用率高,可以被多条测试数据复用,同时可以提高编写效率。
  (2)异常排查率较高,测试框架依据测试数据,每条数据生成测试用例,用例执行过程相互隔离,数据驱动可以让测试用例数据更加独立,具有独立性,每一个测试用例相互之间不会影响。
  (3)代码的可维护性高,清晰的测试框架,提高可读性与可维护性。

import unittest
from excel import read_excel # 导入read_excel的函数,以使用对应的功能
from login_function import login
from unittestreport import ddt, list_data # unittestreport是一个综合报告输出、ddt等多个内容的库

# 获取excel数据
login_data = read_excel("login_case.xlsx", "login")

# 测试类上使用ddt,以表示使用数据驱动
@ddt
class TestLogin(unittest.TestCase):

    # 如果你想在哪个函数上使用数据驱动,那么就在函数上增加list_data
    @list_data(login_data)
    def test_login_success(self, data_info):
        # 通过索引为0,找到第一组测试数据
        data_info = login_data[0]
        # 取出测试数据当中的data字段
        user_info = eval(data_info["data"])
        username = user_info["username"]
        password = user_info["password"]
        expected = eval(data_info["expected"])

        actual = login(username, password)

        self.assertEqual(expected, actual)

【Python自动化测试17】openpyxl二次封装与数据驱动_第3张图片
  
  

  好啦~以上就是本次文章分享的全部内容啦,你学会了吗?希望能给大家带来帮助哦!

  
  

在这里插入图片描述

你可能感兴趣的:(Python自动化测试,python,自动化,开发语言,自动化测试,数据驱动)