iOS:使用命令行在设备上进行UI测试!

Devากที่ได้รับหน้าที่เป็นMobile Dev.。 ฝั่งiOSก็ได้ทำCIบนJenkinsทั้ง单元测试และUi Testingผ่านFastlane…。 ก็สะดวกดี

runาคือหลายครั้งที่เมื่อrun ui testบนเครื่องjenkinsมันไม่เสถียร

iา ที่มั ผ่านบ้างแล้วแต่ดวง(พูดเล่นนะ) UiTestที่มันมากับ fastlane ui-testingเนี่ยโดย默认默认รันบน模拟器ที่ใช้ทรัพยากรของเครื่อื่

มีอมี工作ื่รๆนพร้อมกันก็ทำให้เครื่องช้า(Mac miniรันUi,单元测试ของทั้งAndroidและiOS)

iางทีมก็เริ่มอยากรันUi TestingบนDeviceเพราะเชื่อว่ามันจะดีกว่าที่รันผ่าน仿真器

และมันก็เป็นอย่างนั้นจริงๆราะโดยปกติ

UIา ที่รัน UI TestจะบนJenkinsด้วfastlane(simulator)ใช้เวลา〜20分钟 ีกอาจจะพังใช้เวลาหาสาเหตุอีก〜10分钟ลองรันบนเครื่องตัวเองอีก〜7分钟โถ่ววชีวิต

DeviceอลองรันบนDeviceกลับใช้เวลา〜8分钟แล้วTesterก็เห็นscreenของdeviceตอนrunด้วยดี้ดีย์

ขี้เกียจเล่าแล้วมาลองกันเถอะ…

สร้าง项目ง่ายๆเพื่อลอง

เหมือนทำแอพเปิดปิดอะไรสักอย่าง…

เมื่อเริ่มต้น应用

ให้状态เป็น关闭

วนไป上的และเมื่อกดปุ่มON / OFFให้状态เปลี่ยนไปเป็น…。

codeนcodeนั้นอยู่ด้านล่างจย้า

设置方案Ui测试设置项目ให้รันได้นDeviceได้นะครับ

provisionานการเพิ่มเครื่องเข้าไปใน供应配置文件เซ็ทApps IDให้โปรเจค

ส่วนนี้ค่อนข้างยาว

ViewController.swift

 导入UIKit 
类ViewController:UIViewController {
@IBOutlet弱var lightStatusLabel:UILabel!
@IBOutlet弱var lightSwitcherButton:UIButton!
var isLightOn = false
覆盖func viewDidLoad(){
super.viewDidLoad()
lightStatusLabel.text =“关闭”
isLightOn =假
lightSwitcherButton.setTitle(“ ON / OFF”,用于:.normal)
}
@IBAction func onTouchSwitcher(_ sender:UIButton){
推迟{
isLightOn =!isLightOn
}
如果isLightOn {
lightStatusLabel.text =“关闭”
}其他{
lightStatusLabel.text =“开启”
}
}
}

SampleUITests.swift

 导入XCTest 
class SampleUITests:XCTestCase {
func testSwitchLightStatus(){
让app = XCUIApplication()
app.launch()
让onOffButton = app.buttons [“ ON / OFF”]
//ก่อนเลย的เข้ามาให้เจอ状态
XCTAssertTrue(app.staticTexts [“ off”]。exists)
onOffButton.tap()//แตะ1ครั้งถ้วนเพื่อเปลี่ยน
XCTAssertTrue(app.staticTexts [“ on”]。exists)//ต้องเห็นon
onOffButton.tap()//แตะอีกครั้งก็ควรจะเห็นoffเนาะ
XCTAssertTrue(app.staticTexts [“ off”]。exists)
}
}

codeาiนบนก็ลองรันโดยใช้xcodeรUนUi Testบนscheme Ui Testsประมาณนี้

อรันผ่านsimก็จะประมาณนี้บนเครื่องก็เช่นกัน..

enามันอยู่บนเครื่องjenkinsหละ?? codeราคงไม่นั่งมาไล่กดxcodeเลือกschmeกดรันใช่ไหมใช่ไหม

งนที่สำคัญที่สุดของ博客นี้ก็คือบรรทัดนี้

uiนบรารันui测试บน设备โดยไม่ผ่านXcode GUI

enราสร้างjenkins工作เพื่อรันUiTestบนdeviceได้

  xcodebuild 
项目Project.xcodeproj
-方案“ SampleUITests”
-destination'platform = iOS,id = xxxxxxxaaaaxxxxxaaaaxxxxx'
测试

参数ก็ตามตัวเลย

专案-> xcode专案档案的路径/工作区ก็] -workspace xx.xcworkspace

scheme-> Schemeที่เซ็ทไว้เพื่อรันUiTests

目的地->กอก目标ของ设备/ idคือuuidของเครื่องที่จะรันUiTest

และมันก็รันหลายเครื่องพร้อมกันได้โคตรคูล!! หร้างฟาร์มได้เลยหรือจะแยก

ๆนกล่องๆ(工作)บนjenkinsก็ย่อมได้ใส่ยใส่目的地ไปอีก…

  xcodebuild 
项目Project.xcodeproj
-方案“ SampleUITests”
-destination'platform = iOS,id = {uuid设备#1}'
-destination'platform = iOS,id = {uuid设备#2}'
测试

iานี้ก็เป็นอันเสร็จสิ้นหวังว่าจะเป็นประโยชน์กับคนที่ทำUiTestนะครับ🍻

สรุป

  • UiTest DeviceรDeviceใร็วกว่า模拟器ในบางกรณี(ต้องเป็นเครื่องที่เร็วอยู่แล้วด้วยนะอาจจะต้องclearเครื่องก่อน)แล้วก็ไม่กินเครื่องที่ไว้ทำCI
  • scriptารรันผ่าน脚本ทำให้การรันบนDeviceง่ายขึ้นและทำหลายๆเครื่องพร้อมกันได้

谢谢:Chokchai Phatharamalai Joe Chavintron