亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

在 UI 自動化測試過程中,面對復(fù)雜的業(yè)務(wù)場景,經(jīng)常會遇到這樣的挑戰(zhàn):

  • 簡單的錄制/回放速度快,但無法適應(yīng)復(fù)雜場景;
  • 編寫自動化測試腳本比較靈活,但工作量大且可維護(hù)性差;
  • 以往的封裝技術(shù)(PageObject)可以適應(yīng)各種 UI 場景,但結(jié)構(gòu)松散,無法在多項(xiàng)目中遷移;

因此,測試團(tuán)隊(duì)通常還需要一種定制測試框架,用以彌補(bǔ)現(xiàn)有框架的缺點(diǎn)。

測試框架封裝思想

由于 UI 自動化測試框架圍繞 UI 界面使用,因此,依舊選用 PageObject 設(shè)計(jì)模式對 UI 及測試進(jìn)行封裝,同時(shí)配合 Pytest 單元測試將腳本能夠有效的組織、連貫應(yīng)用起來,從而提高框架的可維護(hù)性和可讀性。

由于測試框架基于 PageObject 設(shè)計(jì)模式,主要方向?yàn)?PO 改進(jìn),數(shù)據(jù)驅(qū)動,異常處理等,比如:

  • 測試數(shù)據(jù)的數(shù)據(jù)驅(qū)動:將數(shù)據(jù)存儲到外部 yaml 文件中,利用 yaml 工具進(jìn)行數(shù)據(jù)讀取;
  • 數(shù)據(jù)步驟的數(shù)據(jù)驅(qū)動:將操作步驟放到外部 yaml 文件中,利用 yaml 工具對操作步驟進(jìn)行讀取,用專門函數(shù)解析并實(shí)現(xiàn)操作步驟;
  • 自動化異常處理機(jī)制:對元素查找模塊進(jìn)行封裝和改進(jìn),包括如何處理彈窗;

Page_Object 改造

作為通用的 UI 測試框架, PageObjet 不僅適用于 Web 自動化測試,也可適用 Appium 移動自動化測試,其優(yōu)點(diǎn)如下:

  • 減少代碼重復(fù)
  • 提高測試用例可讀性
  • 提高測試用例可維護(hù)性
實(shí)戰(zhàn) | UI 自動化測試框架設(shè)計(jì)與 PageObject 改造

 

PO 改造實(shí)例(基于雪球 App)

本案例將對雪球 App 進(jìn)行 Page Objetct 封裝與改進(jìn)。

當(dāng)啟動雪球 App 時(shí),會進(jìn)入首頁。點(diǎn)擊搜索框進(jìn)入搜索頁,搜索某支股票然后判斷股價(jià)是否大于 200:

實(shí)戰(zhàn) | UI 自動化測試框架設(shè)計(jì)與 PageObject 改造

 

PageObjetct 的模塊關(guān)系如下,所有的模塊要繼承 BasePage , App 實(shí)現(xiàn)啟動,重啟,停止等操作, Main 實(shí)現(xiàn)進(jìn)入搜索頁,進(jìn)入股票頁等操作:

實(shí)戰(zhàn) | UI 自動化測試框架設(shè)計(jì)與 PageObject 改造

 

base_page 模塊是所有 page 類的父類,其中定義了公共方法,比如封裝下面的 find 方法后,可以讓子類調(diào)用 find :

from appium.webdriver.webdriver import WebDriver


class BasePage:
    _driver: WebDriver

    def __init__(self, driver: WebDriver = None):
        self._driver = driver

    def find(self, locator, value: str = None):
        #如果傳進(jìn)來的是tuple,只需使用一個(gè)參數(shù):locator
        if isinstance(locator, tuple):
            return self._driver.find_element(*locator)
        else:
            return self._driver.find_element(locator, value)

App 模塊封裝 app 的啟動,重啟,停止等方法,當(dāng) app 啟動時(shí)會進(jìn)入 main 頁面,因此在下面的 main 方法要 return Main ,Main 類的定義在后面會講解:

from appium import webdriver
from test_appium.page.base_page import BasePage
from test_appium.page.main import Main

class App(BasePage):
    #指定app的包名和activity名
    _package = "com.xueqiu.Android"
    _activity = ".view.WelcomeActivityAlias"

    def start(self):
        #如果driver為空則初始化
        if self._driver is None:
            caps = {}
            caps["platformName"] = "android"
            caps["deviceName"] = "hogwarts"
            caps["appPackage"] = self._package
            caps["appActivity"] = self._activity
            caps["noReset"] = True
            #初始化driver
            self._driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
            self._driver.implicitly_wait(30)
        #如果driver不為空,則直接啟動activity
        else:
            print(self._driver)
            self._driver.start_activity(self._package, self._activity)

        return self

    def restart(self):
        pass

    def stop(self):
        pass

    def main(self) -> Main:
        #當(dāng)app啟動時(shí),跳轉(zhuǎn)到(實(shí)例化)Main
        return Main(self._driver)

Main 模塊是首頁的 PageObject ,其中的方法封裝了首頁的重要功能,比如下面代碼中的 goto_search_page 封裝了點(diǎn)擊搜索并跳轉(zhuǎn)到 Search 頁:

from appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.common.by import By

from test_appium.page.base_page import BasePage
from test_appium.page.profile import Profile
from test_appium.page.search import Search


class Main(BasePage):
    #點(diǎn)擊搜索按鈕后,進(jìn)入搜索頁
    def goto_search_page(self):
        self.find(MobileBy.ID, "tv_search").click()
        #進(jìn)入搜索頁
        return Search(self._driver)

    def goto_stocks(self):
        pass

    def goto_trade(self):
        pass

    def goto_messages(self):
        pass

Search 模塊可以搜索一支股票,還可以獲取股票的價(jià)格,比如下圖:

實(shí)戰(zhàn) | UI 自動化測試框架設(shè)計(jì)與 PageObject 改造

 

封裝代碼如下:

from appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.remote.webdriver import WebDriver


class Search:
    _driver: WebDriver

    def __init__(self, driver):
        self._driver = driver
    #輸入要搜索的內(nèi)容
    def search(self, key: str):
        self._driver.find_element(MobileBy.ID, "search_input_text").send_keys(key)
        self._driver.find_element(MobileBy.ID, "name").click()
        return self
    #獲取股票價(jià)格,用于判斷
    def get_price(self, key: str) -> float:
        return float(self._driver.find_element(MobileBy.ID, "current_price").text)

最后對上述代碼建立測試,新建測試模塊 test_search :

import pytest

from test_appium.page.app import App


class TestSearch:
    def setup(self):
        self.main = App().start().main()

    def test_search(self):
        assert self.main.goto_search_page().search("alibaba").get_price("BABA") > 200

以上,供大家參考,歡迎一起留言探討。

(文章來源于霍格沃茲測試學(xué)院)

分享到:
標(biāo)簽:框架 測試
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定