Fortgeschrittene Verwendung von Wettbewerben
Idee: Wir importieren normalerweise viele Pakete und verwenden oft einen bestimmten Codeabschnitt. Im Allgemeinen verwenden wir die Idee der Kapselung zur Optimierung. Das conftest-Modul in pytest bietet eine effizientere Methode
Sie können jeden Code, den Sie kapseln möchten, auf einmal hinzufügen. Lassen Sie den Code hier zu einer Variablen werden. Wenn Sie ihn verwenden müssen, deklarieren und rufen Sie ihn einfach in der Funktion auf
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)
Ertrag
Die Rückkehr einer Funktion verwendet das yield- Schlüsselwort to return. Zu diesem Zeitpunkt wird diese Funktion als Generator bezeichnet , und der Aufruf dieser Funktion wird als Iterator bezeichnet , was ein iterierbares Objekt ist.
def yield_keys():
yield 121
print('**************')
print(yield_keys())
<generator object yield_keys at 0x00000299F8DC4270>
Es gibt drei Hauptsysteme in Python, Generator, Iterator und Decorator.
Generator: Iterierbare Objekte erzeugen.
Iterator:
Alle Objekte, die zu iterierbaren Objekten gehören, die For-Schleifen durchlaufen können, sind iterative Objekte. Zusätzlich zum Durchlaufen von For-Schleifen können Iteratoren dies auch __next__( )-Wert übergeben
next () kann nicht mehrere Werte für ein Objekt annehmen
Die Verwendung einer for-Schleife zum Abrufen eines Werts löst keine Ausnahme aus
Verwendung in pytest:
conftest verwandelt die Funktion in eine Zwischenvariable, alle können direkt im Anwendungsfall aufgerufen werden
Operationslogik: Vorbedingung ausführen, bevor der Anwendungsfall läuft – Rückgabewert ausführen – Code im Anwendungsfall ausführen – wird bearbeitet