pytest-xlsx:把excel作为测试文件的pytest插件

pytest-xlsx 是一个 pytest 的插件,它可以将 xlsx 文件作为 pytest 可以执行的测试文件和测试用例,

这样软件测试人员就可以通过 Excel 便捷的实现关键字驱动测试(像 Robot Framework 那样)

xlsx 测试用例样本

在 xlsx 中使用关键字驱动测试

在 xlsx 中使用用例标记

在 xlsx 中使用数据驱动测试

目前绝大部分人都是通过 pytest.mark.parametrize 加载和执行 excel 文件的,类似这样:

import pytest

# excel内容传递给 pytest.mark.parametrize
@pytest.mark.parametrize("data", read_excel("ddt.xlsx"))  
def test_(data):
    print(data["name"])  # 用例名称
    print(data["step"])  # 用例步骤
    print(data["assert"])  # 用例断言

如果 excel 中有 N 组既定的数据,就会执行 N 个用例。

这种方式优势是简单

  • 理解简单:参数化是 pytest 中常见的用法

  • 实现简单:创建和执行由pytest实现

  • 维护简单:只需要维护 read_excel 函数

劣势也是简单,比如:

  • 命令行中显示的是 python 文件,而不是 excel 文件

命令行中显示 python 文件

  • 如果出错了也只会显示 python 代码的报错信息,不会显示 excel 中的数据

  • 执行 excel 文件需要先写好 python 代码,甚至每一个 excel 都可能要配一个 python 用例

  • 无法在 excel 中使用自定义标记、参数化测试、动态夹具等 pytest 特色功能

因为从本质上来看,excel 在这里只是充当了数据文件,而不是用例文件,用例还是代码中的那个函数

def test_(data):
	...

本插件作为一个全新解决方案

不需要编写代码读取、解析 excel 文件内容,也不需要编写代码创建用例

因为现在 pytest 真的可以把 excel 作为用例文件了!

命令行中显示excel文件

而且用例失败时可以显示表格内容,

例如下图可以直观的判断出是【点击新增地址】时,定位失败

用例失败时显示表格内容

安装

你可以通过 pip 安装本插件

pip install pytest-xlsx==0.3.1

本文是 pytest-xlsx==0.3.1 的使用说明,若是其他版本,细节上可能有些许差异

使用

1. 创建 xlsx 文件

创建一个 test_开头的 xlsx 文件,例如:

test_my_blog.xlsx

文件名的 test_前缀遵循了 pytest 一贯的测试文件命名惯例,

同时也能避免加载不打算作为测试用例的文件,毕竟 xlsx 文件更多的用武之地是数据存储

2. 编写测试用例

在 xlsx 写入以下内容,这是我们创建的第一个测试用例

步骤 ID步骤名称标记参数
0用例名称name登录
1打开浏览器browserchrome
2打开博客gethttps://baidu.com/login
3输入用户名input//*[@id="username"]admin
4输入密码input//*[@id="password"]123456
5点击登录click//*[@id="login"]
0用例名称name评论
1打开浏览器browserchrome
2打开博客gethttps://baidu.com/post/1
3输入内容input//*[@id="comment"]admin
4点击发布click//*[@id="ubmit"]

3. 启动 pytest

执行xlsx文件

如果在启动 pytest 时,传递 -vvs 参数可以得到更加详细的内容

输出xlsx内容

从输出信息可知 pytest-xlsx 做了哪些事:

  1. 将 test_my_blog.xlsx 作为测试文件

  2. 将 sheet 标题(Sheet1)和 excel(评论、登录)内容作为测试 ID

  3. 将 excel 的内容作为测试用例的内容,并打印出来

指南

1. 如何理解 xlsx 中的内容

  1. test_*.xlsx 文件,将被 pytest 视为测试文件

  2. 测试文件中的 Sheet,将被 pytest 视为测试类

  3. Sheet 中标记字段的内容是 name 和 mark 的行,将被 pytest 视为用例信息

  4. 此外的所有内容,将被 pytest 视为用例步骤

  5. 支持多个文件、多个 Sheet、多个用例,同时编辑和执行

2. 如何执行 xlsx 中的内容

xlsx 中的内容分为两部分:

  1. 标记字段的内容是 name 或 mark 的,作为用例信息,用来创建用例

    • name:指定用例名字

    • mark:和pytest中的mark用法类似,指定用例标记,或使用数据驱动测

  2. 用例信息之外的其他内容,作为用例步骤,用来执行用例

    1. 用例内容全部交给 xlsx_runner 进行执行

    2. 默认的 xlsx_runner 只会进行打印,上图可以看到 xlsx 中的用例步骤被打印出来了

    3. xlsx_runner 是一个夹具,你可以重新定义

3. 如何自定义 xlsx_runner

xlsx_runner 是一个 fixture,所以只需要在 conftest.py 中重新定义同名 fixture,

即可让测试步骤安装你的想法执行

比如:将测试步骤写入到文件中,而不是打印到屏幕上

import pytest

from pytest_xlsx.runner import Runner, XlsxItem


class FileRunner(Runner):  # 1. 定义Runner
    def execute(self, item: XlsxItem):  # 2. 实现execute方法
        """
        :param item: 用例对象
        :return:
        """

        if item.is_first_step:  # 如果是第一个步骤
            self.f = open(f"{item.name}.txt", "w", encoding="utf-8")  # 则创建文件

        # 写入 步骤序号 和 步骤内容
        self.f.write(f"{item.current_step_no}:{item.current_step}\n")

        if item.is_last_step:  # 如果是最后一个步骤
            self.f.close()  # 关闭文件


def xlsx_runner_():  # 3. 重写xlsx_runner,使用自定义Runner
    return FileRunner()

具体步骤:

  1. 继承 pytest_xlsx.runner.Runner,实现一个新的 class 名为 FileRunner

  2. 实现 runTest 方法,这方法会接收到全部的用例步骤

  3. 创建名为 xlsx_runner 的 fixtures,并返回 FileRunner 实例对象

定义好 fixture 后,再执行 pytest 就看不到测试步骤被打印了

反倒是在目录中创建了相应的 txt 文件

除了打印、写入文件之外,你还可以根据项目需要,将测试步骤用于浏览器控制(Web 自动化测试)、接口调用(API 自动化测试)等场景。

4. XlsxItem 中有什么

execute 方法所接收的 item 参数,是 XlsxItem 的实例对象,其拥有以下属性

属性名属性内容类型备注
xlsx_data从 xlsx 中读取到的全部数据dict
nodeid当前测试用例 idstr
name当前用例名称str
current_step_no当前用例步骤序号int第一个是 0
max_step_no最大用例步骤序号int步骤数量 - 1
is_first_step是否是第一个步骤bool
is_last_step是否最后一个步骤bool
current_step当前步骤内容dict

XlsxItem 在执行某一个用例时,会依次读取步骤内容,然后将自己传递给 xlsx_runner,

也就是说,在同一个用例中有多少个步骤,xlsx_runner 的 execute 就会被调用多少次,

你可以通过访问 item参数的属性,来判断当前是哪一个步骤,并决定如何执行

配置

目前,pytest-xlsx 的配置只有一项: 

xlsx_meta_column_name=标记 ,用来指定用例信息的列名

如果你的 xlsx 使用 “关键字” 这一列存储 name 和 mark,比如这样

那么应该在配置文件中进行指定新的列名即可

[pytest]xlsx_meta_column_name = 关键字

注意:pytest 加载配置文件时不会指定的文件字符编码。如果配置文件中有非 ASCII 内容,务必将配置文件的字符编码改为操作系统的默认编码

兼容性

pytest-xlsx 在实现上遵循 pytest 惯例和约定,对 pytest 的其他插件亦有极好的兼容性,

以下插件已经验证完美兼容(若有更多兼容性问题,或者兼容验证结果,欢迎提出):

  • pytest-html

  • pytest-allure

  • pytest-xdist

  • 更多。。。

开发计划

  • ✅ 支持 parametrize

  • ✅ 支持 mark (支持:skip、skipif、xfail、用户自定义 mark,暂不支持:usefixtures)

  • ▢ 支持 fixture

  • ▢ 支持指令集(类似 RF 的用户关键字)

原创不易,喜欢请星标+点赞+在看,关注公众号《XXXXX》,不错过技术干货,谢谢鼓励!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值