欧美1区2区3区激情无套,两个女人互添下身视频在线观看,久久av无码精品人妻系列,久久精品噜噜噜成人,末发育娇小性色xxxx

針對抖音APP的自動化框架方案設(shè)計(jì)(超詳細(xì)易理解)

哈嘍,大家好,很多同學(xué)在學(xué)習(xí)自動化的時(shí)候苦于找不到一些練手的項(xiàng)目,那么今天的話就出一期如何設(shè)計(jì)自動化框架的教程,主要是提供思路和方案,具體代碼暫時(shí)未公開(后續(xù)完善可能會上), 本方案適用于絕大多數(shù)移動端APP,大部分APP的UI布局都是類似,可采用此方案來設(shè)計(jì),下次面試時(shí)面試官問起如何對一款A(yù)PP設(shè)計(jì)自動化方案,再也不用擔(dān)心沒話可說了,如果本文對你有所幫助的話,感謝點(diǎn)贊,收藏

一.需求背景

抖音APP近期需要上線一個(gè)外賣點(diǎn)餐的新功能,那么對于一些已有的功能,如發(fā)布視頻,點(diǎn)贊,轉(zhuǎn)發(fā),評論,切換Tab視角,下載視頻背景音樂等功能需要進(jìn)行回歸,那么已有的測試用例可能如下:

測試模塊

測試用例編號

測試用例標(biāo)題

測試步驟

預(yù)期結(jié)果

實(shí)際結(jié)果

測試人員

測試時(shí)間

登錄注冊

TC - LR - 01

使用手機(jī)號驗(yàn)證碼登錄

1. 打開抖音APP;2. 點(diǎn)擊登錄按鈕;3. 選擇手機(jī)號登錄方式,輸入正確手機(jī)號;4. 點(diǎn)擊獲取驗(yàn)證碼,輸入正確驗(yàn)證碼;5. 點(diǎn)擊登錄。

成功登錄進(jìn)入抖音主界面,展示個(gè)性化推薦內(nèi)容。

登錄注冊

TC - LR - 02

使用第三方賬號(微信)登錄

1. 打開抖音APP;2. 點(diǎn)擊登錄按鈕;3. 選擇微信登錄方式;4. 確認(rèn)授權(quán)登錄。

成功跳轉(zhuǎn)到抖音主界面,頁面顯示與微信綁定的相關(guān)信息。

登錄注冊

TC - LR - 03

手機(jī)號格式錯(cuò)誤登錄

1. 打開抖音APP;2. 點(diǎn)擊登錄按鈕;3. 選擇手機(jī)號登錄方式,輸入錯(cuò)誤格式手機(jī)號;4. 點(diǎn)擊獲取驗(yàn)證碼。

彈出提示框,提示“手機(jī)號格式不正確”,無法獲取驗(yàn)證碼。

視頻瀏覽

TC - VR - 04

上下滑動瀏覽視頻

1. 成功登錄抖音APP;2. 手指向上滑動屏幕。

視頻向上滾動,切換到下一個(gè)視頻;手指向下滑動屏幕,視頻向下滾動,切換到上一個(gè)視頻。

視頻瀏覽

TC - VR - 05

點(diǎn)贊視頻

1. 成功登錄抖音APP,瀏覽視頻;2. 點(diǎn)擊視頻下方的點(diǎn)贊按鈕。

點(diǎn)贊按鈕顏色改變,視頻點(diǎn)贊數(shù)加1,顯示點(diǎn)贊動畫效果。

抖音要上線外賣功能,這些老的功能每次都需要去回歸,業(yè)務(wù)測試同學(xué)苦不堪言,每次都要去反復(fù)執(zhí)行,于是急于向組內(nèi)測開的同事求救,設(shè)計(jì)自動化腳本來輔助完成這些用例的設(shè)計(jì), 作為一名測開,當(dāng)然是義不容辭替同事分憂,于是,我開始研究如何去設(shè)計(jì)自動化框架.

二.前置環(huán)境

要想對抖音APP設(shè)計(jì)自動化,當(dāng)下主流的移動端自動化框架有Appium,那么本文就采用Appium來設(shè)計(jì)抖音APP的自動化方案.

1.搭建自動化環(huán)境

Pin:自動化環(huán)境搭建極其麻煩,所以前置環(huán)境大家需要自己去克服解決一下,我之前也是搞了半天才好,這一塊還是要耐心一點(diǎn).

1.python3.9(最好不要超過11)

2.pycharm(任意python編譯器即可)

3.JDK1.8

4.SDK 24.4

5.Node.js 18.15

6.appium 1.22

詳細(xì)配置教程看這里: https://blog.csdn.net/qq_45270849/article/details/132133577

2.項(xiàng)目架構(gòu)

項(xiàng)目采用經(jīng)典POM模式來設(shè)計(jì), 什么是POM模式呢,簡單來說就是把APP每個(gè)下方的Tab單獨(dú)作為一個(gè)模塊對象, 封裝對應(yīng)的方法,然后cases層來調(diào)用每個(gè)page的方法,以此來實(shí)現(xiàn)用例層和接口層的分離, 因?yàn)樽詣踊芷饋碇髸婕暗蕉鄠€(gè)頁面的交互,比如你在首頁添加商品進(jìn)入購物車頁面,從購物車頁面下單支付到支付頁面, 從支付頁面付款完成到訂單完成頁,設(shè)計(jì)到多個(gè)頁面的UI變動,我們稱之為聯(lián)動,那么POM模式的設(shè)計(jì)就是為了減少不同頁面接口方法的耦合(理解這個(gè)思想面試的時(shí)候不就可以跟面試官吹一下)

2.1新建一個(gè)項(xiàng)目叫做DouYinTest

python的話很多同學(xué)會使用虛擬環(huán)境, UP還是比較建議采用本地python IDE解釋器較好,虛擬環(huán)境在執(zhí)行自動化可能會有部分問題.

2.2觀察一下抖音APP的各功能分布

我們發(fā)現(xiàn)抖音APP底部分為五個(gè)頁面,有首頁,朋友,發(fā)布入口,消息,我的這幾個(gè)模塊,那么對應(yīng)到我們腳本里面就可以設(shè)計(jì)成如下:

home_page.py | friands_page.py | release_page.py | message_page.py | mine_page.py

OK,那么我們的初步設(shè)計(jì)方案已經(jīng)有了,解釋一下這里的包 elements 主要用來存放每個(gè)頁面對應(yīng)的UI控件元素.

2.3整體結(jié)構(gòu)解讀

cases: 用例層用來存放所有的APP用例,一些專項(xiàng)測試,我們寫用例的目錄都放在這個(gè)包下面.

config: 配置層,我們可以封裝好手機(jī)的sn號, ui驅(qū)動配置,測試版本, APP包信息,測試結(jié)果推送釘釘/飛書群聊等.

src: driver驅(qū)動,封裝APP每個(gè)page的接口,函數(shù),底層的功能寫在這里.

elements: 用來存放元素的控件名,需要用到哪個(gè)從接口page層直接獲取,省去每次都要找控件的時(shí)間.

system_page.py: 封裝手機(jī)本身系統(tǒng)的一些功能,如開關(guān)wifi,數(shù)據(jù),藍(lán)牙,音量等手機(jī)系統(tǒng)功能(輔助測試可能會用到)

tools: 腳本工具,allure|HTML報(bào)告, adb/tidevice 命令的封裝.

workspace: 存放一些測試報(bào)告, allure_reports,一些日志文件log.txt, 一些素材/文件,方便導(dǎo)入到腳本使用等.

requirements.txt: 存放第三方庫以及對應(yīng)版本,方便別的同學(xué)拿到項(xiàng)目可以很快配置好環(huán)境.

pip install -r requirements.txt

2.4解決基礎(chǔ)手機(jī)配置

輸入以下命令查看抖音的包名:

adb shell pm list packages -f -3

我剛開始還不知道這個(gè)是抖音的包名哈哈, 還是問的豆包告訴我的,害我找了半天, 還得是AI好用.

有了包名之后,我們開始配置手機(jī)信息驅(qū)動driver,appium的機(jī)型配置如下(注本文使用Android手機(jī),IOS用戶暫時(shí)不支持)

from appium import webdriver

desired_caps = {
    "platformName": "iOS",
    "platformVersion": "你的系統(tǒng)版本",
    "deviceName": "你的設(shè)備名稱",
    "bundleId": "應(yīng)用 Bundle ID"
}

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

# 通過 iOS Predicate 定位元素
element = driver.find_element_by_ios_predicate('name == "元素名稱"')

driver.quit()

其中bundleId就是我們剛才查找的包名, 其他幾項(xiàng)大家根據(jù)自己手機(jī)來選擇即可,這里不做過多贅述.

三. 實(shí)現(xiàn)自動化用例

解決完基礎(chǔ)的環(huán)境配置之后,我們來完成一條功能用例轉(zhuǎn)自動化用例的編寫,腳本用例剛才有提到我們放在cases層里面

3.1需求文檔

實(shí)現(xiàn)啟動抖音APP,處理系統(tǒng)的彈窗授權(quán),對首頁的第一個(gè)視頻點(diǎn)紅心按鈕點(diǎn)贊,評論,收藏,向下滑動,對第二個(gè)視頻雙擊點(diǎn)贊,長按進(jìn)入倍速播放,點(diǎn)擊轉(zhuǎn)發(fā)按鈕,把視頻分享給自己的一個(gè)好友.

3.2方案設(shè)計(jì)

那么我們開始寫自動化用例的時(shí)候,需要注意低耦合,低耦合的意思就是我們盡量做好分層,分模塊來寫,那么就可以利用Python這里的包,文件,模塊的概念來對用例進(jìn)行分層管理, 比如我這里可以寫成 demo_case | smoke_case | special_case 分別代表本地調(diào)試模塊,冒煙用例模塊,專項(xiàng)測試用例模塊, 每個(gè)文件下面分別對應(yīng)不同的用例類型,這樣的好處就是可以根據(jù)需求來區(qū)分,也方便我們后續(xù)新加用例的填入. 注意模塊的開頭一定要以為 test_ 或者 _test 開頭,這是 pytest 編寫用例的規(guī)則.

需求文檔提出要針對首頁的視頻做一系列的點(diǎn)贊,評論等操作,那么像這種單點(diǎn)的方法就不建議封裝好一個(gè)單獨(dú)的接口來實(shí)現(xiàn),因?yàn)橛美淖兓M合條件是很多的,比如我可以先點(diǎn)贊,收藏,評論, 也可以先評論, 收藏, 點(diǎn)贊, 還可以 評論, 收藏, 點(diǎn)贊, 寫過測試用例的同學(xué)都知道用例的組合變化是多種多樣的, 所以要么就是限制好用例, 實(shí)現(xiàn)一個(gè)單獨(dú)的接口在home_page.py里面, 要么就是按照步驟來寫用例直接寫在cases層里面.

這里為了方便展示,那么我們就直接寫在cases層里面好了,方便大家觀察,學(xué)習(xí)之前我們先認(rèn)識一下appium的一些常見操作方法.

import time
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.actions import interaction
from selenium.webdriver.common.actions.action_builder import ActionBuilder
from selenium.webdriver.common.actions.pointer_input import PointerInput

# 配置 Appium 連接參數(shù)
desired_caps = {
    "platformName": "Android",
    "platformVersion": "你的系統(tǒng)版本",
    "deviceName": "你的設(shè)備名稱",
    "appPackage": "com.ss.android.ugc.aweme",
    "appActivity": ".main.MainActivity",
    "noReset": True
}

# 連接 Appium 服務(wù)器
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

try:
    # 等待應(yīng)用加載
    time.sleep(10)

    # 1. ID 定位
    try:
        element_by_id = driver.find_element(AppiumBy.ID, "com.ss.android.ugc.aweme:id/your_id")
        print("通過 ID 定位成功")
    except Exception as e:
        print(f"通過 ID 定位失敗: {e}")

    # 2. 類名定位
    try:
        elements_by_class = driver.find_elements(AppiumBy.CLASS_NAME, "android.widget.TextView")
        print(f"通過類名定位到 {len(elements_by_class)} 個(gè)元素")
    except Exception as e:
        print(f"通過類名定位失敗: {e}")

    # 3. XPath 定位
    try:
        element_by_xpath = driver.find_element(AppiumBy.XPATH, '//android.widget.TextView[@text="你的文本"]')
        print("通過 XPath 定位成功")
    except Exception as e:
        print(f"通過 XPath 定位失敗: {e}")

    # 4. Accessibility ID 定位
    try:
        element_by_accessibility_id = driver.find_element(AppiumBy.ACCESSIBILITY_ID, "your_accessibility_id")
        print("通過 Accessibility ID 定位成功")
    except Exception as e:
        print(f"通過 Accessibility ID 定位失敗: {e}")

    # 5. UIAutomator 定位(Android)
    try:
        element_by_uiautomator = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("你的文本")')
        print("通過 UIAutomator 定位成功")
    except Exception as e:
        print(f"通過 UIAutomator 定位失敗: {e}")

    # 常見操作

    # 輸入文本
    try:
        input_element = driver.find_element(AppiumBy.ID, "com.ss.android.ugc.aweme:id/input_id")
        input_element.send_keys("這是輸入的文本")
        print("輸入文本成功")
    except Exception as e:
        print(f"輸入文本失敗: {e}")

    # 點(diǎn)擊操作
    try:
        click_element = driver.find_element(AppiumBy.ID, "com.ss.android.ugc.aweme:id/click_id")
        click_element.click()
        print("點(diǎn)擊操作成功")
    except Exception as e:
        print(f"點(diǎn)擊操作失敗: {e}")

    # 雙擊操作(Android)
    try:
        double_click_element = driver.find_element(AppiumBy.ID, "com.ss.android.ugc.aweme:id/double_click_id")
        actions = ActionChains(driver)
        actions.w3c_actions = ActionBuilder(driver, mouse=PointerInput(interaction.POINTER_TOUCH, "touch"))
        actions.w3c_actions.pointer_action.click(double_click_element)
        actions.w3c_actions.pointer_action.click(double_click_element)
        actions.perform()
        print("雙擊操作成功")
    except Exception as e:
        print(f"雙擊操作失敗: {e}")

    # 長按操作
    try:
        long_press_element = driver.find_element(AppiumBy.ID, "com.ss.android.ugc.aweme:id/long_press_id")
        action = TouchAction(driver)
        action.long_press(long_press_element).perform()
        print("長按操作成功")
    except Exception as e:
        print(f"長按操作失敗: {e}")

    # 滑動操作
    try:
        start_x = 500
        start_y = 1500
        end_x = 500
        end_y = 500
        driver.swipe(start_x, start_y, end_x, end_y, duration=800)
        print("滑動操作成功")
    except Exception as e:
        print(f"滑動操作失敗: {e}")

except Exception as e:
    print(f"發(fā)生異常: {e}")
finally:
    # 關(guān)閉應(yīng)用
    driver.quit()    

那么,學(xué)會了以上的操作方法之后, 對于抖音APP的絕大部分功能我們都可以來做自動化了,比如我們實(shí)現(xiàn)點(diǎn)贊,收藏,評論的功能.

首先,我們借助元素定位工具來查看一下這些控件(APP上面的一些按鈕簡稱):

我們發(fā)現(xiàn),抖音APP的點(diǎn)贊,評論,收藏都是一些imageView,就是一些圖片logo,通過id/Xpath的方式就可以定位到,那么就很簡單了.

其實(shí)可以看到我這邊用的都是通過ID的方式來定位的,因?yàn)镮D比較快,使用Xpath的話需要逐層查找速度受限, 除非當(dāng)前元素/控件沒有ID/name, xpath的優(yōu)先級是最后的, 不過有一點(diǎn), Xpath定位的元素是最準(zhǔn)確的.

# 連接 Appium 服務(wù)器
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

def test_home_case1(self):
	with step("1.啟動抖音APP"):
	  self.driver.launch_app("com.ss.android.ugc.aweme")

	with step("2.處理授權(quán)問題"):
	  pass

	with step("抓取APP日志"):
	  #這里我們可以封裝一個(gè)adb方法,直接發(fā)送指令抓取APP日志
	  f'adb -s {self.sn} logcat -G 10M'

	with step("3.點(diǎn)贊,評論,收藏"):
	  logging.info("開始點(diǎn)贊")
	  element_by_id1 = driver.find_element(AppiumBy.ID, "com.ss.android.ugc.aweme:id/f1r")
	  element_by_id.click()
	  time.sleep(1)
	  logging.info("開始評論")
	  element_by_id2 = driver.find_element(AppiumBy.ID, "com.ss.android.ugc.aweme:id/d6x")
	  element_by_id2.send_keys("哈哈哈,這個(gè)視頻好搞笑啊!!!")
	  time.sleep(1)
	  logging.info("點(diǎn)擊收藏")
	  element_by_id3 = driver.find_element(AppiumBy.ID, "com.ss.android.ugc.aweme:id/dy0")
	  element_by_id3.click()

	  # 截圖記錄是否正確點(diǎn)擊到對應(yīng)按鈕, 保存在workspace目錄下
	  element_screenshot_path = os.path.join(GlobalVar.workspace(),  f"{case['用例標(biāo)題']}_{formatted_time}.png")
	  element_by_id3.screenshot(element_screenshot_path)

	#這里可以通過圖像識別的方式去檢查對比是否正確點(diǎn)擊到控件, 方法大家自己研究, 這里不過多贅述
	#同時(shí)可以增加一些斷言操作如 assert False | True
	
	with step("測試結(jié)束,停止抓取日志,殺掉APP進(jìn)程"):
	  self.driver.terminate_app("com.ss.android.ugc.aweme")

那么到這里,我們的一條自動化用例就寫好了,當(dāng)然,這里博客只做演示,具體到企業(yè)里面可能與我當(dāng)前給到的方案有所差異,這是很正常的,因?yàn)槭忻嫔祥_源的教程都是這些,關(guān)于用例當(dāng)中提到的一些技術(shù)棧,這里做一個(gè)簡單的補(bǔ)充.

3.3技術(shù)棧補(bǔ)充

1.pytest測試框架

該框架會幫助我們更好的管理用例,可以想象一下用例一旦多了起來,如何批量執(zhí)行,選擇執(zhí)行,單獨(dú)執(zhí)行等都是很頭疼的一件事情,那么pytest是你需要學(xué)習(xí)掌握的內(nèi)容.

2.paddlepaddle(飛槳)

pip install paddlepaddle

paddlepaddle?是百度自主研發(fā)的開源深度學(xué)習(xí)平臺,也是中國首個(gè)自主研發(fā)、功能豐富、技術(shù)領(lǐng)先的產(chǎn)業(yè)級深度學(xué)習(xí)框架,在用例當(dāng)中有提到如何驗(yàn)證我們的腳本每一步操作是有效的,那么可以借助該庫當(dāng)中的一些方法來做輔助判斷.

3.adb|tidevice

adb|tidevice分別對應(yīng)操作Android和IOS手機(jī)的一些命令,adb需要SDK+JDK+Node.js環(huán)境, IOS通過pip命令來安裝即可.

pip install tidevice

4.Python第三方庫

掌握常見Python第三方庫如os,datatime,PyTorch,BeautifulSoup,Requests,json,yaml,HTML等的基本使用.

Appium-Python-Client
ffmpeg-python
pytest-html
pytest-metadata
pytest-ordering
pytest-reportportal
pytest-dependency
pytest-rerunfailures
allure-pytest
allure-python-commons
celery 
urllib3

5.CI/CD

想要執(zhí)行完這些用例并且看到可視化的報(bào)告如何做呢? 我們可以借助常見CI/CD工具jenkins來實(shí)現(xiàn), 通過allure+jenkins的方式實(shí)現(xiàn)持續(xù)集成是絕大部分的方案,em... jenkins的環(huán)境搭建也較為麻煩,感興趣的同學(xué)可以自己了解一下,這里簡單提一下,不過多贅述.

四.完善和補(bǔ)充

4.1其他模塊自動化設(shè)計(jì)

對于整個(gè)大的抖音APP來說,功能太多了,通過自動化來完成可以轉(zhuǎn)化不少功能用例,這樣也可以極大提高測試效率,但是同時(shí)抖音這種toC的業(yè)務(wù)APP,每天的各種消息,彈窗也是不斷的,這樣會影響到自動化腳本的執(zhí)行. 不知道抖音內(nèi)部的debug包是不是做了很多的處理,在debug包里面可以開關(guān)很多功能,比如斃掉某個(gè)模塊的功能,抖音商城新功能的上線,造測試環(huán)境數(shù)據(jù)等,都是可以在debug的抖音包來設(shè)置處理的.

同時(shí)我們也可以發(fā)現(xiàn),抖音頂部的幾個(gè)模塊功能,我是沒有放在接口層處理的,因?yàn)檫@幾個(gè)Tab是在首頁page下的,這樣的話其實(shí)可以針對首頁page進(jìn)行二次封裝處理,將這幾個(gè)tab二次分層,那么又有新的問題來了,大家用抖音商城會發(fā)現(xiàn),一個(gè)商城有這么多的功能,可以下單.瀏覽商品等,一個(gè)抖音商城的功能甚至可以抵得上一個(gè)購物APP如京東,淘寶,得物等, 那么是否可以針對抖音商城單獨(dú)再創(chuàng)建一個(gè)新的項(xiàng)目來單獨(dú)設(shè)計(jì)自動化用例呢?

4.2專項(xiàng)模塊自動化測試

需求文檔: 近期有用戶反饋,針對抖音的長視頻(一些影視解說,紀(jì)錄片等),時(shí)長高達(dá)2h-5h不等, 對于長視頻的播放部分用戶反饋有卡頓,loading時(shí)間過長,播放畫質(zhì)|音質(zhì)的問題同時(shí)手機(jī)發(fā)熱嚴(yán)重,那么針對這一塊內(nèi)容,需要做針對性測試,我們稱之為 "專項(xiàng)測試".

這些都是可以去嘗試自動化做的內(nèi)容,相信抖音內(nèi)部的話專項(xiàng)測試會很多,可惜沒有能力進(jìn)去

由于本篇博客內(nèi)容也已經(jīng)較長了,后續(xù)的話會陸續(xù)更新一些新的測試方案設(shè)計(jì),如果本文對你有所幫助,感謝您的點(diǎn)贊,轉(zhuǎn)發(fā).

更好的方案和想法可以提出,歡迎交流,探討技術(shù).

#Python##軟件測試方案##測試開發(fā)##自動化測試##自動化測試方案設(shè)計(jì)#
測試開發(fā)之路 文章被收錄于專欄

主要分享一些測試開發(fā)方向提效,提質(zhì)內(nèi)容:測開進(jìn)階,測試工具開發(fā),測試平臺開發(fā),錄制回放,測試報(bào)告,精準(zhǔn)測試研究等.

全部評論

相關(guān)推薦

評論
10
16
分享

創(chuàng)作者周榜

更多
牛客網(wǎng)
??推髽I(yè)服務(wù)