Python自动化测试:pytest实现关键字驱动

1350 篇文章 12 订阅
716 篇文章 5 订阅
文章讲述了如何使用pytest的mark和fixture功能优化关键词驱动的自动化测试用例,减少了代码重复,提高了代码可读性和易维护性。通过@pytest.mark.yaml_case装饰器,可以直接引用yaml文件作为测试步骤,简化了测试函数的编写。
摘要由CSDN通过智能技术生成

在上一篇文章中,我编写了一个非常简单的关键字驱动程序, 不过这个程序只是跑通了功能,还有很多可以优化的地方,这篇文章我想通过 pytest 来简化自动化测试用例的编写,使用的是比较基础的 pytest 功能。 下篇文章我再写个复杂版的,从底层直接执行 yaml 文件作为用例。

优化前的用例

在没有优化之前,如果想添加用例,首先需要编写一个 yaml 文件, 然后再写一个 python 的自动化测试用例,用例的代码如下:

def test_keyword(driver):
    """获取 yaml 文件"""
    with open('signin.yaml', encoding='utf-8') as f:
        steps = yaml.safe_load(f)
        page = Page(driver)

    for step in steps:
        action_name = step.get('action')
        params = step.get('params')
        action = getattr(page, action_name)
        action(**params)

虽然这个程序用起来比较简单,如果要新建其他的用例,只需要把这个函数复制一遍,修改 signin.yaml 文件名,其他代码不需要动,但是还达不到不需要动脑筋的程度,每次复制这么多重复代码也不好看。

优化后的用例

import pytest

@pytest.mark.yaml_case('signin.yaml')
def test_keyword():
	pass

优化后的用例明显更简单,函数体中甚至一行代码也没有。 yaml 文件的配置采用装饰器形式配置在测试函数上方,更加清晰,修改的时候很容易找到地方。

具体实现

实现方式其实只用到了 pytest 的两个知识点:mark 和 fixture, 先看一下代码:

# conftest.py
import pytest
import yaml
from selenium import webdriver
from keyworks import Page

@pytest.fixture
def driver():
    d = webdriver.Chrome()
    d.implicitly_wait(8)
    d.maximize_window()
    yield d
    d.quit()

@pytest.fixture
def page(driver):
    """获取page"""
    return Page(driver)

@pytest.fixture(autouse=True)
def yaml_case(page, request):
    """yaml 测试步骤"""
    yaml_marker = request.node.get_closest_marker('yaml_case')
    yaml_file, *_ = yaml_marker.args
    with open(yaml_file, encoding='utf-8') as f:
        steps = yaml.safe_load(f)
        for step in steps:
            action = getattr(page, step['action'])
            action(**step['params'])

重点在最后一个 fixture。 首先我把 yaml_case 这个 fixture 设成了自动使用,这样在测试函数中我就不需要手工调用了,因此在用例函数中我不需要传入任何参数。

在 yaml_case 这个 fixture 中,第一行代码request.node.get_closest_marker('yaml_case')获取到 yaml_case 这个标记 mark, 第二行代码 yaml_marker.args 得到标记中的参数,也就是 signin.yaml 这个文件的路径。接下来,读取这个文件中的测试步骤,并且调用具体的执行操作就可以了,调用代码在前一篇文章中已经讲过,如果有疑问可以再翻回去看看。

@pytest.mark.yaml_case('signin.yaml')
def test_keyword():
	pass

总结

这个代码的实现主要使用了 pytest 灵活的 mark 机制和 fixture 管理, 只要 pytest 用得熟练,实现起来并不难。如果有任何疑问和建议,欢迎私信我一起讨论。

如果文章对你有帮助,记得点赞,收藏,加关注。会不定期分享一些干货哦......

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

资料获取方式 :

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值