一、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()
----------------------------------------------------------------------------------------------------------------------
核心作用:
- 可以减少代码的冗余,而且方便后台维护,若页面元素发生变化,只需要调整页面封装的类属性即可
- 提高用例脚本的维护性和可持续性