Python+App (4)

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

Bildbeschreibung hier einfügen
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())

Drucken

<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

Bildbeschreibung hier einfügen

next () kann nicht mehrere Werte für ein Objekt annehmen

Bildbeschreibung hier einfügen

Die Verwendung einer for-Schleife zum Abrufen eines Werts löst keine Ausnahme aus

Bildbeschreibung hier einfügen

Verwendung in pytest:
conftest verwandelt die Funktion in eine Zwischenvariable, alle können direkt im Anwendungsfall aufgerufen werden
Bildbeschreibung hier einfügen
Operationslogik: Vorbedingung ausführen, bevor der Anwendungsfall läuft – Rückgabewert ausführen – Code im Anwendungsfall ausführen – wird bearbeitet

Supongo que te gusta

Origin blog.csdn.net/qq_36562656/article/details/128387128
Recomendado
Clasificación