網(wǎng)站開發(fā)多少錢電子商務(wù)網(wǎng)站設(shè)計方案
由于公司的產(chǎn)品坐落于不同的平臺,如ios、mac、Android、windows、web。因此每次有新需求的時候,開發(fā)結(jié)束后,留給測試的時間也不多。此外,一些新的功能實現(xiàn),偶爾會影響其他的模塊功能正常的使用。
網(wǎng)上的ios自動化方面的內(nèi)容也是少之又少。由于本人對ios自動化初次接觸,花了兩天的時間到處找文章,才逐漸入了門。本文也是站在小白的角度,從0到1搭建ios自動化測試環(huán)境。
框架選型
查了很多資料,關(guān)于iOS自動化的框架有很多。但是支持Python的沒有幾個。
如:
UIAutomation 是蘋果提供的 UI 自動化測試框架,使用 JavaScript 編寫。
XCTest 是一個可以提供各個層次的測試的框架,比如單元測試,自動化測試,性能測試等。
KIF 使用未公開的 Apple API(私有 API),這對于測試目的而言是安全的,基于第三方 iOS UI 的單元測試框架,所以可以做項目的單元測試,也可以做 UI 集成測試。但缺點是運行較慢。且需要掌握Objective-C 語言。
Frank 是IOS 開發(fā)環(huán)境下一款實現(xiàn)自動測試的工具,Xcode 環(huán)境下開發(fā)完成后,通過 Frank 實現(xiàn)結(jié)構(gòu)化的測試用例,其底層語言為 Ruby,作為一款開源的 iOS 測試工具,在國外已經(jīng)有廣泛的應(yīng)用。但是國內(nèi)相關(guān)資料卻比較少。其最大的優(yōu)點是允許我們用熟悉的自然語言實現(xiàn)實際的操作邏輯。
還有一些云測試平臺,因為都是收費的,這里也就不說了。
綜上所述,appium框架支持多種語言編寫自動化測試用例,且我之前使用過。因此我選擇了它。
appium驅(qū)動iOS測試原理
XCUITest是蘋果開發(fā)的一個做IOS自動化測試的框架,需要了解些Swift等iOS編程知識;WebDriverAgent是Facebook開發(fā)的一個iOS自動化測試工具,先來看下面的這張原理圖:
WDA在Client創(chuàng)建了一個Server,在手機端安裝了一個叫作WebDriverAgentRunner 的一個應(yīng)用;這個應(yīng)用會接收來自 Server 的指令,并連接底層的XCTest.framwork,讓 XCTest.framwork 調(diào)用蘋果API來操作手機進行自動化
而appium是把WebDriverAgentRunner 給集成進去了,因此實現(xiàn)了appium的跨平臺能力
通過上圖我們了解到 Appium 很粗暴的把整個 WebDriverAgent 直接集成到自己的項目里,然后通信機制就走 WebDriverAgent,Appium 其實就提供了一個 Client 端的作用。所以 iOS 9.3 系統(tǒng)之后自動化測試核心是 WebDriverAgent,Appium 就提供了一個 Client 端來寫腳本和發(fā)送指令。
Appium 自動化架構(gòu)模式可以用一個抽象的架構(gòu)表示,就是下面這樣的:
從圖中可以看出:
Client 端是 Appium 之前本身提供的;
Server 端是:WebDriverAgent 和 Instruments;( Appium 直接把 WebDriverAgent 整個集成進來,Instruments 是為了支持 iOS 9.3 之前的系統(tǒng))
最右邊是一個手機
之前 Server 是和 bootstrap.jar 通信,這里 WebDriverAgent 提供了 WebDriverAgentRunner (類似 bootstrap.jar 的功能),WebDriverAgent與之通信;
WebDriverAgentRunner 是一個應(yīng)用,Client 和 server 運行了之后,WebDriverAgentRunner 會被裝到手機上,這個應(yīng)用會接收來自 Server 的指令,并連接底層的 XCTest.framwork,并告訴 XCTest.framwork 操作手機進行自動化。
關(guān)于 WebDriverAgent
實現(xiàn)了一個 server,通過 server 可以遠程控制 iOS 設(shè)備:啟動應(yīng)用、關(guān)閉應(yīng)用、點擊、滾動等操作;
通過連接 XCTest.framework 調(diào)用蘋果的 API 執(zhí)行動作;
支持多個設(shè)備同時進行自動化;
Appium、Macaca 已經(jīng)集成。
但是 WebDriverAgent 僅僅只提供了一個 server(和 inspect 進行元素定位),并沒有像 Appium 一樣提供 java 或 python 的 Client 端去寫腳本,腳本執(zhí)行的時候發(fā)送指令給 server,然后去運行。WebDriverAgent 要求你自己去實現(xiàn) Client 端,即拿 Java/ Python 的 WebDriver 庫進行封裝,然后發(fā)送指令。所以 WebDriverAgent 其實就類似于 Appium server,就只是一個 server。
環(huán)境搭建
硬件環(huán)境
一臺Mac、一部iphone(真機或虛擬機)、一條數(shù)據(jù)線
實際測試都是在真機上完成的,所以整篇文章都以真機為準。
自動化開發(fā)環(huán)境
開發(fā)環(huán)境:xcode, Command Line Tools, ,Pycharm, Python3, pip, setuptools
其他環(huán)境:homebrew, node, npm, carthage, appium, python-client, appium-doctor,
xcode,
電腦打開App Store搜索即可下載安裝,
Command Line Tools
為了配置appium環(huán)境,我們需要安裝Xcode Command Line Tools。
下載完成后,雙擊已下載的 .dmg 進行安裝,檢驗 Command Line Tools 是否安裝成功。
xcode-select --install # 查看是否安裝
xcode-select: error: command line tools are already installed, use "Software Update" to install updates(錯誤:命令行工具已經(jīng)安裝,請使用“軟件更新”安裝更新)
Python,
官網(wǎng)下載一步下一步安裝即可,
pip & setuptools,
下載setuptools
https://pypi.python.org/pypi/setuptools
https://pypi.python.org/pypi/pip
打開cmd 進入setuptools解壓目錄,輸入:python setup.py install
進入pip解壓目錄,輸入:python setup.py install
安裝好后,打開終端,輸入pip,如提示不是內(nèi)部命令,則將python安裝目錄下Scripts目錄添加到環(huán)境變量Path中。
Homebrew,
Homebrew是一個包管理軟件,它可以使我們更容易地安裝其他一些軟件終端輸入安裝:
/usr/bin/ruby -e "$(curl –fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
檢查homebrew是否安裝
brew -v //檢查homebrew是否安裝
brew list //查看已安裝列表
brew update //更新Homebrew
Node & NPM,
安裝
brew install node@14
查看node版本
node -v
配置國內(nèi)源
npm config set registry https://registry.npm.taobao.org/
Carthage,
Carthage項目依賴管理, 類似于 java 的 maven; 主要是 WebDriverAgent 使用,WebDriverAgent 是用它做項目依賴的
終端輸入:
brew install carthage
更新carthage : brew upgrade carthage
重新安裝 : brew reinstall carthage
安裝完成后檢查一下是否安裝成功
carthage version
Appium,
安裝appium-server
https://github.com/appium/appium-desktop
Appium-Doctor,
檢查appium安裝是否成功的工具集指令
安裝 appium-doctor
npm install appium-doctor -g
檢查 iOS環(huán)境是否安裝成功
appium-doctor --ios
iOS 真機調(diào)試環(huán)境配置
webdriverAgent,
在github上下載最新webdriverAgent代碼
https://github.com/appium/WebDriverAgent
下載依賴(暫時可跳過,下面操作沒報錯,可忽略)
cd WebDriverAgent
mkdir -p Resources/WebDriverAgent.bundle
sh ./Scripts/build.sh
執(zhí)行完成后,打開WebDriverAgent.xcodeproj文件。
配置開發(fā)者賬號,所有target建議都配置一遍。
連接并選擇自己的ios設(shè)備
窗口欄-Product-Destination-Device
選擇WebDriverAgentRunner,
窗口欄-Product-Test
如果有這個報錯,前往手機設(shè)置-通用-描述文件與設(shè)置管理,授信一下APP就OK了。
然后再次運行Test,就可以在Xcode控制臺看到下面的輸出信息:
瀏覽器打開,訪問上面的地址+/status,網(wǎng)頁返回以下內(nèi)容,說明OK了。
有些iphone手機通過手機的IP和端口號還不能訪問,此時需要將手機的端口轉(zhuǎn)發(fā)到mac上,終端運行以下命令
iproxy 8100 8100
將手機的8100端口,映射到電腦的8100端口上。這樣我們就能通過訪問電腦的8100端口來訪問到手機了。
網(wǎng)上查到說“為了持續(xù)集成”,使用如下方法,在代碼中啟動wda,不需要在xcode啟動。
desiredCapabilities.setCapability("useNewWDA", true);
這種方法,我暫時沒有試過,特此記錄,有空再試。
appium-desktop (server)
打開下載的appium desktop
點擊 start server
因為新版本的 inspector 和 appium-desktop 分離了,我們需要去github下載inspector。
下載地址
安裝后,打開。在 Desired Capabilities 中輸入相關(guān)的參數(shù)后點擊Start Session
{
? "platformName": "ios",
? "appium:deviceName": "我的iPhone",
? "appium:platformVersion": "15.7.1",
? "appium:bundleId": "com.safety.authon",
? "appium:udid": "0a1386121527af8447cb5ac06de1d35cec8ea798"
}
以上信息,可通過xcode-菜單欄-Window-Devices and Simulator,獲取。
運行成功后,會彈出一個控制界面,在該界面中可以看到手機運行程序的布局元素。
自動化用例編寫
打開pycharm,新建一個項目。
安裝依賴,
pip install selenium
pip install Appium-Python-Client
編寫自動化測試用例代碼,
#! /usr/bin/env pyhton
# -*- coding:utf-8 -*-
# author:jeff.xie
# datetime:2023/11/22 16:23
# software:PyCharm# iphone app 啟動成功實戰(zhàn)測試用例from appium import webdriver
from time import sleepfrom appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.common.by import Bydriver = webdriver.Remote(command_executor = 'http://127.0.0.1:4723/wd/hub',
desired_capabilities = {
"platformName": "ios",
"appium:deviceName": "iPhone Jeff",
"appium:platformVersion": "16.5.1",
"appium:bundleId": "welab.bank.mobile.stage",
"appium:udid": "00008030-000A09C81A43802E"
})
sleep(10)ele = driver.find_element(AppiumBy.IOS_PREDICATE,"name == '用戶名稱'")
ele.send_keys("qatest101")
driver.find_element(By.ID,"")
sleep(2)# 參考 External Libraries.site-packages.appium.webdriver.common.appiumby
class AppiumBy(By):IOS_PREDICATE = '-ios predicate string'IOS_UIAUTOMATION = '-ios uiautomation'IOS_CLASS_CHAIN = '-ios class chain'ANDROID_UIAUTOMATOR = '-android uiautomator'ANDROID_VIEWTAG = '-android viewtag'ANDROID_DATA_MATCHER = '-android datamatcher'ANDROID_VIEW_MATCHER = '-android viewmatcher'# DeprecatedWINDOWS_UI_AUTOMATION = '-windows uiautomation'ACCESSIBILITY_ID = 'accessibility id'IMAGE = '-image'CUSTOM = '-custom'#參考seleniumclass By:"""Set of supported locator strategies."""ID = "id"XPATH = "xpath"LINK_TEXT = "link text"PARTIAL_LINK_TEXT = "partial link text"NAME = "name"TAG_NAME = "tag name"CLASS_NAME = "class name"CSS_SELECTOR = "css selector"
import unittest
import os
from appium import webdriver
from time ?import sleep
class ?appiumSimpleTezt (unittest.TestCase):
?? ?def ?setUp(self):
?? ??? ?app_path = '/Users/jx/appiumSimpleDemo/build/Release-iphoneos/appiumSimpleDemo.app'
?? ??? ?app = os.path.abspath(app_path)
?? ??? ?self.driver = webdriver.Remote(
?? ??? ??? ?command_executor = 'http://127.0.0.1:4723/wd/hub',
?? ??? ??? ?desired_capabilities = {
? "platformName": "ios",
? "appium:deviceName": "我的iPhone",
? "appium:platformVersion": "15.7.1",
? "appium:bundleId": "com.safety.authon",
? "appium:udid": "0a1386121527af8447cb5ac06de1d35cec8ea798"
}
?? ?def test_push_view(self):
?? ??? ?next_view_button = self.driver.find_element_by_accessibility_id("entry next view")
?? ??? ?next_view_button.click()
?? ??? ?sleep(2)
?? ??? ?back_view_button = self.driver.find_element_by_accessibility_id("Back")
?? ??? ?back_view_button.click()
?? ?def tearDown(self):
?? ??? ?sleep(1)
?? ??? ?# self.driver.quit()
if __name__ == '__main__':
?? ?suite = unittest.TestLoader().loadTestsFromTestCase(appiumSimpleTezt)
?? ?unittest.TextTestRunner(verbosity=2).run(suite)
以上就是ios自動化環(huán)境的過程,記錄下來。也方便自己回頭來看,也方便新人學(xué)習(xí)少走彎路。
以上內(nèi)容參考了如下網(wǎng)站:
https://github.com/zhshijie/appiumSimpleDemo
http://appium.io/docs/en/about-appium/getting-started/
https://www.cnblogs.com/crstyl/p/14690895.html
https://github.com/appium/WebDriverAgent
?