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返回值 — 执行用例中代码 — 执行后置处理
![Android APP 自动化测试搭建:Appium + Genymotion + [Robot Framework] Open Application](https://img-blog.csdnimg.cn/4929c6c368464a32bb91283b327651eb.png)








![[第十三届蓝桥杯/java/算法]A——排列字母](https://img-blog.csdnimg.cn/c43108f329d2443c91238e84c26e41a2.png)









