conftest进阶使用
思路:我们平时导包多,而且经常使用某一段代码,一般我们使用封装的思想进行优化,pytest中conftest模块提供了更高效的方法
你可以添加任何想一次性封装的代码,这里吧代码变成变量,需要使用的时候就在函数中声明调用即可
conftest.py
import pytest
from appium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.support import expected_conditions
# 构建上下文承接的内存对象,去接收 driver
class Context:
pass
@pytest.fixture
def assert_data():
def _assert(data, target):
if data["type"] == "not in":
assert data["value"] not in target
if data["type"] == "equal":
assert data["value"] in target
if data["type"] == "in":
for i in target:
assert data["value"] in i
return _assert
@pytest.fixture
def driver():
url = 'http://127.0.0.1:4732/wd/hub'
caps = {}
caps['paltfromName'] = 'Android'
caps['platformVersion'] = '10'
caps['deviceName'] = 'MI_PAD_4'
caps['appPackage'] = 'com.flychord.altas.masterpiano.test'
caps['appActivity'] = 'com.flychord.piano.module_home.InitializePageActivity'
caps['noReset'] = True
setattr(Context, "driver", driver)
_driver = webdriver.Remote(url, caps)
return _driver
@pytest.fixture
def by():
return MobileBy
@pytest.fixture
def wait():
_driver = getattr(Context, "driver")
_wait = WebDriverWait(_driver, 10)
return _wait
@pytest.fixture
def ec():
return expected_conditions
test01.py
import pytest
@pytest.mark.parametrize("data", [
{"data": "测试数据", "assert": {"type": "not in", "value": "测试数据"}},
{"data": "一二三", "assert": {"type": "equal", "value": "一二三"}},
{"data": "四五六", "assert": {"type": "in", "value": "四五六"}}
])
def test_04(assert_data, by, wait, ec, data):
elements = wait.until(ec.visibility_of_element_located((by.ID, 'com.zhao.myreader:id/tv_book_name')))
elements_text = [i.text for i in elements if elements]
assert_data(data["assert"], elements_text)
yield
一个函数的返回使用yield关键字进行返回,此时这个函数就称之为一个生成器,这个函数的调用就称之为迭代器,是一个可迭代对象
def yield_keys():
yield 121
print('**************')
print(yield_keys())
打印
<generator object yield_keys at 0x00000299F8DC4270>
python中有三大系统,生成器、迭代器、装饰器
生成器:生成迭代对象
迭代器:属于迭代对象
所有可以经过for循环的就是迭代对象,迭代器除了可以经过for循环,还可以通过__next__()取值
next()无法对一个对象多次取值
使用for循环取值不会触发异常
在pytest中的使用:
conftest把函数变成一个中间变量,所有在用例中直接调用即可
运行逻辑:用例运行前先执行前置条件 — 执行yield返回值 — 执行用例中代码 — 执行后置处理