web自动化3-pytest前后置夹具

一、pytest前后置(夹具)-fixture

夹具的作用:在用例执行之前和之后,需要做的准备工作和收尾工作。

用于固定测试环境,以及清理回收资源。

举个例子:访问一个被测页面-登录页面,执行测试用例过程中,上来就输入账户、密码、验证码吗,实际上是先获取浏览器的驱动,有了驱动才去执行用例的执行,用例执行完后关闭页面。

夹具要做的事情就是在执行用例之前,把驱动获取到,用例执行完之后,页面需要关闭就放到固定的测试环境之后。

pytest内部提供了多种类型的夹具

1、已经定义好的夹具类型一共有以下几种类型:

  • 函数
  • 方法
  • 模块

2、自定义夹具:fixture

使用fixture灵活调度固定的测试环境

1.1、fixture基本介绍

是pytest当中的一个装饰器

@pytest.fixture(夹具的作用域、参数化、自动使用)

复制代码
@pytest.fixture(scope="function",autouse=True)
def go_shop():
    print("使用自动保持登录的id")  # 代码段1
    yield  # 不需要返回任何的内容
    print("登录成功之后的用户id")  # 代码段2

每一个函数级别的用例,它都会在你用例执行之前执行代码段1,用例执行之后执行代码段2

1、自动调用夹具

2、不自动调用夹具

1.2、项目中的使用

fixture一般在项目中集中管理-封装成一个模块。

  • 整个项目中会定义一个py模块:conftest.py专门用来放置自定义的fixture,文件名固定而且不能修改。
  • 在使用fixture不需要进行导包,可以直接使用。不管是在项目根目录还是用例目录都会自动识别进行调用。
  • 执行顺序:多个fixture-从最外边到最里边以及从最上边到最下边,定位fixture然后执行。有相同的名字的,根据ASCII编码进行筛选选中,然后进行一个集中使用。

也就是将定义fixture的那段代码放在conftest.py文件中即可。

二、POM设计模式

  • P:page代表页面
  • O:object代表对象
  • M:module代表模型

以页面对象为模型进行封装和使用的模式。

核心思想(以下三步):

新建一个pom.py文件,封装后台登录页面类

封装后台登录页面类

class BackgroundLoginPage():

定义一个实例属性获取驱动

def init(self,driver):

self.driver = driver

1、对页面元素 进行封装成类的属性

页面类属性的封装:需要被操作的元素

pom.py文件

- 输入账号

ipt_username =(By.XPATH,"/html/body/form/table/tbody/tr/td[3]/table/tbody/tr[2]/td[2]/input")

- 输入密码

ipt_password =(By.XPATH,"/html/body/form/table/tbody/tr/td[3]/table/tbody/tr[3]/td[2]/input")

#- 输入验证码

ipt_code =(By.XPATH,"/html/body/form/table/tbody/tr/td[3]/table/tbody/tr[5]/td[2]/input")

- 点击登录

btn_login_submit =(By.XPATH,'//*[@id="login_btn"]')

2、对用例执行流程 设计成类的实例方法

pom.py文件

def login(self):

self.driver.find_element(*self.ipt_username).send keys("admin")

self.driver.find_element(*self.ipt_password).send keys("888888")

self.driver.find_element(*self.ipt_code).send keys("xcvf")

self.driver.find_element(*self.btn_login_submit).click

3、通过定义好的页面类实例化一个对象,通过对象调用实例方式执行用例。

test_login2.py

创建webdriver对象

获取驱动对象

def test_001():

driver =webdriver.chrome()

通过驱动访问页面

driver.get("http://47.107.116.139/fangwei/m.php?m=Public\&a=login\&")

#将页面最大化

driver.maximize window()

login_page = BackgroundLoginPage(driver)

login_page.login()


代码优化

1、使用前后置(夹具),将获取驱动和关闭驱动放在fixture中,在conftest.py文件:

@pytest.fixture

def driver():

print("用例开始执行之前,获取驱动")

driver = webdriver.Chrome()

#通过驱动访问页面

driver.get("http://47.107.116.139/fangwei/m.php?m=Public\&a=login\&")

#将页面最大化

driver.maximize_window()

yield driver

#用例执行完成之后,关闭驱动

print("用例执行完成之后,关闭驱动")

driver.quit()

2、这样test_login2.py文件:

from pom import BackgroundLoginPage

创建webdriver对象

获取驱动对象

def test_001(driver):

login_page = BackgroundLoginPage(driver)

login_page.login()


核心作用:

  • 可以减少代码的冗余,而且方便后台维护,若页面元素发生变化,只需要调整页面封装的类属性即可
  • 提高用例脚本的维护性和可持续性
相关推荐
小码哥说测试2 天前
Selenium+Pytest自动化测试框架 ------ 禅道实战
自动化测试·软件测试·selenium·测试工具·单元测试·pytest·接口测试
m0_371356152 天前
【测试框架篇】单元测试框架pytest(2):用例编写
单元测试·pytest
m0_371356152 天前
【测试框架篇】单元测试框架pytest(3):用例执行参数详解
单元测试·pytest
linda_06073 天前
【Allure】mac下环境配置
pytest
七灵微3 天前
【测试】【Debug】vscode pytest 找不到测试用例测试文件 行号部位没有绿色箭头
pytest
防御塔策略4 天前
pytest简单使用
python·单元测试·pytest·hook·fixture·mark
MJH8275 天前
Pytest参数详解 — 基于命令行模式!
自动化测试·软件测试·经验分享·python·职场和发展·pytest·postman
可遇_不可求5 天前
pytest插件精选:提升测试效率与质量
pytest
七灵微5 天前
【测试】【Debug】pytest运行后print没有输出
pytest
qq_433716957 天前
测试分层:减少对全链路回归依赖的探索!
自动化测试·软件测试·功能测试·测试工具·回归·pytest·postman