ui自动化框架之pytest+seliuem讲解之夹具函数 fixture

ui自动化会有好多流程是固定的 

在每一个用例开始和结尾都有一些固定的流程这些固定的流程可以提取出来

这样对每一个用例,如果地址变了也好维护 ,不用每一个用例都去改

根据你项目的用例粒度去修改

如果你想在每个文件的函数内容方法前和结束后执行

def setup_function():
print('开始')
def teardown_function():
print('结束')
def test_01():
print(1)
def test_02():
print(2)
如果你想在文件前后执行
def setup_module():
print('开始')
def teardown_module():
print('结束')
def test_01():
print(1)
def test_02():
print(2)
还有类_class
等等很多这种方法不太好用
unitest框架常用这种方法去做固定流程的设计

ui自动化框架之pytest+seliuem讲解之夹具函数 fixture

如何使用pytest fix函数定义一些初始化的流程呢?????

在demo文件夹建立一个a文件

import pytest

@pytest.fixture(scope='module')#这里可以写多个控制你的粒度
def start_browser():
print('启动浏览器')
@pytest.fixture()#
def close_browser():
print('关闭浏览器')
from demo.a import *   调用方法
def setup_module():
print('开始')
def teardown_module():
print('结束')
def test_01(start_browser):
print(1)
def test_02(start_browser):
print(2)

firture相对于setup和teardown来说应该有以下几点优势
命名方式灵活,不局限于setup和teardown这几个命名
conftest.py 配置里可以实现数据共享,不需要import就能自动找到一些配置
scope="module" 可以实现多个.py跨文件共享前置, 每一个.py文件调用一次
scope="session" 以实现多个.py跨文件使用一个session来完成多个用例

如何优化引入包的代码???????????

from demo.a import * 这句如何优化  建立一个文件conftest 文件把开始和结束方法写进去,别的文件要用会自动调用 

ui自动化框架之pytest+seliuem讲解之夹具函数 fixture

收尾的函数如何写的,比如close这个函数 

#先执行自动到confter调用函数启动,然后看到yield会返回执行完用例后执行关闭浏览器
conftest 这样写
import pytest
@pytest.fixture()
def browser():
print('启动浏览器')
yield
print('关闭浏览器')
#先执行自动到confter调用函数启动,然后看到yield会返回执行完用例后执行关闭浏览器
模拟真实的前端开始和结束过程

ui自动化框架之pytest+seliuem讲解之夹具函数 fixture

 如何将学到的运用到项目中呢?????????????

我们以一个校验商品脚本和一个添加购物车商品信息的脚本为例子

在case下建立一个conftest文件

import pytest
from selenium import webdriver
@pytest.fixture()
def driver():#这个名字可以任意定义
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(5)
driver.get("http://8.141.52.231/shop/index.php")
yield driver
driver.close()
用例文件如何引入呢????????
from selenium import webdriver
import time
import random
def test_cart01(driver):

 如果前面的家具函数中的代码报错了呢?下方还执行不,这时候会有一个场景,比如地址变了,浏览器不会关的问题

import pytest
from selenium import webdriver
@pytest.fixture()
def driver(request):
#实现打开浏览器有问题就正常关闭,用例关闭一个执行下一个
def close_browser(): 走到这里知道是收尾函数暂时不执行先缓存 ,用例执行完了会执行它
driver.close()
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(5)
driver.get("http://8.141.52.231/shop/index.php")
request.addfinalizer(close_browser())#这里,加载一遍调用上面的方法,代替了yield的作用
    return driver

 缺点是没有代码联想???你点击driver 再次联想就没有需要手动输入

如何使用pytest进行参数化呢?????????也叫数据驱动

比如你有一个登录分为正式密码和错误密码

1.加上标签

2.把数据写里面

3.用例里面正常编写 

一组数据参数化写法???????

import pytest
@pytest.mark.parametrize('username',['admin','zhangsan',' '])
def test_01(username):
print(f'用户名:{username}')
多组呢???????
import pytest
@pytest.mark.parametrize('username,pwd',[('admin',123456),('zhangsan',45678)])
def test_01(username,pwd):
print(f'用户名:{username}')
print(f'密码:{pwd}')
这样写改数据不太好改,需要改代码,最终测试数据要放到测试文件里

1.先在当前文件下一个读csv文件方法 util文件 此文件目录下放csv文件

import csv as CSV


def csv(file_name):
r = []
with open(f'./demos/{file_name}.csv', 'r', encoding='utf-8') as file:
itor = CSV.reader(file)
itor.__next__()
for i in itor:
r.append(i)
return r

 2.然后在case用例脚本运用参数化

#密码错误的用例
import pytest
from demos.util import * 导入读csv方法

@pytest.mark.parametrize('username, password, msg', csv('login'))#调用csvlogin方法拿到三个值
def test_login02(driver, username, password, msg):#传参
driver.find_element_by_xpath("//div[@id='header']/div[@class='header-bar']/div/ul/li/a").click()
driver.find_element_by_id("email").send_keys(username)
driver.find_element_by_name("password").send_keys(password)