目录
fixture是在测试函数运行前后
import pytest
@pytest.fixture()
def login(username='wuya',password='admin'):
if username=='wuya' and password=='admin':
return 'sdrtyuds344dfgsdfgh345'
else:
raise '用户名或密码错误'
def test_profile(login):
assert login=='sdrtyuds344dfgsdfgh345'
初始化与清理:装饰器函数@pytest.fixture(),它是在声明一个函数是fixture,如果测试函数参数列表中含有fixture名,那么pytest执行的时候就会检测到,并在测试函数运行之前执行该fixture,fixture可以完成任务也可以返回数据给测试函数
import pytest
from selenium import webdriver
'''打开浏览器放在的fixture函数中,测试函数运行之前执行该函数'''
@pytest.fixture()
def driver():
return webdriver.Chrome()
def test_baidu_title(driver):
driver.maximize_window()
driver.get('http://www.baidu.com')
assert driver.title=='百度一下,你就知道'
fixture在ui自动化中的应用:
import pytest
@pytest.fixture()
def init(selenium):
selenium.maximize_window()
selenium.get('https://www.baidu.com/')
selenium.implicitly_wait(30)
yield
selenium.quit()
def test_baidu_title(init, selenium):
assert selenium.title == '百度一下,你就知道'
def test_baidu_url(init, selenium):
assert selenium.current_url == 'https://www.baidu.com/'
'''pytest-selenium的应用,执行命令:pytest -v -s fixture的应用.py --driver Firefox'''
fixture在api自动化中的应用:
需求:测试获取所有书籍和查找添加的书籍
结合Pytest的Fixture函数,结合requests的库,编写测试固件的应用
#!/usr/bin/env python
# !coding:utf-8
import json
import pytest, requests
# 登录成功,获取到token
@pytest.fixture()
def login():
r = requests.post(url='http://localhost:5000/auth',
json=json.load(open("pwd.json")))
return r.json()["access_token"]
# 获取headers
@pytest.fixture()
def header(login):
return {'Authorization': 'jwt {0}'.format(login)}
@pytest.fixture()
def init(header):
addBook(header)
yield
delBook(header)
# 添加书籍
def addBook(header):
r = requests.post(url='http://localhost:5000/v1/api/books',
headers=header,
json={"name": "python大法1", "author": "xia", "done": True})
print("添加书籍:", r.json())
writeBook(str(r.json()[0]['datas']['id']))
def writeBook(content):
with open("bookID", "w") as f:
f.write(content)
def bookId():
with open("bookID") as f:
return f.read()
# 删除书籍
def delBook(header):
r = requests.delete(url='http://localhost:5000/v1/api/book/{0}'.format(bookId()),
headers=header)
print(r.json())
# 获取到所有的书籍
def test_all_book(login, header, init):
r = requests.get(url='http://localhost:5000/v1/api/books',
headers=header)
print(r.json())
# 测试添加的书籍
def test_query_book(login, header, init):
r = requests.get(url='http://localhost:5000/v1/api/book/{0}'.format(bookId()),
headers=header)
print(r.json())
assert r.json()['datas'][0]['id'] == int(bookId())
conftest.py
conftest.py可以共享fixture,如果希望多个测试文件共同使用一个fixture,可以在该目录下创建conftest.py文件,然后把需要的fixture加入到里边就可以使用了,也就是把fixture和测试用例分离
conftest文件
import pytest
from selenium import webdriver
@pytest.fixture()
def driver():
return webdriver.Firefox()
@pytest.fixture()
def init(driver):
driver.maximize_window()
driver.get(url='http://www.baidu.com')
driver.implicitly_wait(10)
yield
driver.quit()
@pytest.fixture()
def login(username='xia', password='123'):
if username == 'xia' and password == '123':
return 'qweretreteqwqw'
else:
return False
测试用例
'''driver就是conftest文件里的driver函数'''
def test_baidu_url(driver, init):
assert driver.current_url == 'https://www.baidu.com/'
def test_baidu_title(driver, init):
assert driver.title == "百度一下,你就知道"
'''login就是conftest文件里的login函数'''
def test_login_profile(login):
if login == 'qweretreteqwqw':
print("欢迎登录成功")
Conftest.py使用范围
function级别:
'''function级别的conftest文件'''
import pytest
from selenium import webdriver
@pytest.fixture()
def driver():
return webdriver.Chrome()
@pytest.fixture(scope='function')
def init(driver):
driver.maximize_window()
driver.get('http://www.baidu.com')
driver.implicitly_wait(30)
yield
driver.quit()
'''测试用例文件'''
def test_baidu_url(driver,init):
assert driver.title=='百度一下,你就知道'
class级别:类级别,主要应用于类
'''class级别的conftest.py'''
import pytest
from selenium import webdriver
@pytest.fixture(scope='class')
def driver():
return webdriver.Chrome()
@pytest.fixture(scope='class')
def init(driver):
driver.maximize_window()
driver.get('http://www.baidu.com')
driver.implicitly_wait(30)
yield
driver.quit()
测试模块的代码
'''class级别'''
def test_baidu_url(driver,init):
assert driver.current_url=='https://www.baidu.com/'
class TestUi(object):
def test_baidu_title(self,driver,init):
assert driver.title=='百度一下,你就知道'
module级别:主要应用于模块,多个测试用例文件共用同一个conftest.py
session级别:在一个工程下,pytest执行的就是一个session级别的,泛指所有的函数、类、模块