当前位置:网站首页>pytest 之 fixture参数化

pytest 之 fixture参数化

2022-08-09 13:06:00 沉觞流年

前面通过unittest框架介绍了UI自动化PO模式basepage封装后unittest框架搭建的UI自动化框架,基本就成型了。

前面的几篇pytest文章,也简要介绍了pytestunittest框架的相同与不同之处。将unittest框架替换为pytest框架,主要在 fixture:前置后置断言的表达 这两方面改动比较大。

pytest替换unittest

在PO分层中,元素定位、元素操作和测试数据这三层,是不需要进行改动的,需要进行改动的,是测试用例层

修改前置后置

在TestCases目录下新建一个 conftest.py 文件,用于存放前置与后置的内容

import pytest
from selenium import webdriver

from PO.PageObjects.login_page import LoginPage
from PO.PageObjects.home_page import HomePage
import ddt

from PO.TestDatas import global_datas as GD
from PO.TestDatas import login_datas as lds

import logging

@pytest.fixture
def init_driver():
    ''' 用例前置:打开谷歌浏览器访问163邮箱登录页面并最大化窗口 用例后置:退出浏览器 :return: '''
    logging.info("*********初始化driver的前置**************")
    driver = webdriver.Chrome()
    driver.get(GD.base_url)
    driver.maximize_window()
    yield driver
    logging.info("*********初始化driver的后置**************")
    driver.quit()

修改测试用例文件

先拿登录成功的测试用例来说:

  • 1、将unittest替换为pytest。unittest 通过定义一个类,继承unittest.TestCase;而pytest是通过其搜索机制发现测试用例
  • 2、前置和后置的替换。调用了 conftest.py 文件中的 init_driver fixture函数
  • 3、断言的替换
import pytest
from selenium import webdriver

from PO.PageObjects.login_page import LoginPage
from PO.PageObjects.home_page import HomePage
import ddt

from PO.TestDatas import global_datas as GD
from PO.TestDatas import login_datas as lds

import logging
from PO.Common import logger


# @ddt.ddt()
@pytest.mark.usefixtures("init_driver")
class TestLogin:


    def test_login_success(self,init_driver):
        logging.info("*********登录操作正常场景-登录成功**************")
    # 步骤:
        # 1、登录页面-登录操作
        LoginPage(init_driver).login(*lds.success_case) # 输入账号密码
    # 断言:
        # 1、首页-获取元素是否存在 (进行断言操作,元素可见返回True)
        assert HomePage(init_driver).get_element_exists()
       

在这里插入图片描述
在终端输入命令 pytest -s -v,执行一下登录成功的用例,执行通过,说明 pytest替换unittest 第一步已经成功了

在这里插入图片描述

pytest 之 fixture参数化

unittest框架中,数据驱动使用ddt模块,然而,ddt 模块不能和pytest中的 fixture共用,所以要换用 pytest 的参数化来实现 ddt

参数化的使用

在测试用例的前面加上:
@pytest.mark.parametrize(“参数名”,列表数据)

参数名:用来接收每一项数据,并作为测试用例的参数。
列表数据:一组测试数据。

@pytest.mark.parametrize("参数1,参数1",[(数据1,数据2),(数据1,数据2)])

示例:

@pytest.mark.parametrize("a,b,c",[(1,2,3),(10,10,20),(100,100,200),(101,102,203)])
def test_add(a,b,c)
	res = a + b
	assert res == c

修改测试用例文件

在这里插入图片描述

@pytest.mark.parametrize("case",lds.fail_cases)
    def test_login_failed(self,case,init_driver):
        logging.info("*********登录操作异常场景-登录失败**************")
    # 步骤:
        # 1、登录页面-登录操作
        lp = LoginPage(init_driver)
        lp.login(case["user"], case["psd"])  # 输入 cases 数据中的 账号和密码
        # print(case["user"], case["psd"], case["check"])
    # 断言:
        # 1、登录页面-获取错误提示信息 进行对比
        # print(lp.get_error_msg())
        re_error_msg = lp.get_error_msg()
        assert re_error_msg == case["check"]
        logging.info("返回的错误提示信息为{}".format(re_error_msg))

其中 lds.fail_cases对应的是列表数据,也就是登录失败要用到的测试数据,pytest 中就不用像 ddt 一样再用星号解包了,pytest的参数化内部机制自己做了解包处理;

case 对应的是参数名,这个参数名需要和测试用例函数中的参数名一致,不然无法识别。
本质就是pytestlds.fail_cases中的列表数据进行解包,然后通过 case 传参到测试用例函数中

原网站

版权声明
本文为[沉觞流年]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_44614026/article/details/114649259