การทดสอบระบบอัตโนมัติของ iOS ด้วย Xcode กรอบงาน UI

⚡ สรุปอย่างชาญฉลาด

การทดสอบระบบอัตโนมัติ iOS ด้วย Xcode บันทึกและเล่นซ้ำการกระทำของส่วนติดต่อผู้ใช้กับแอปพลิเคชันที่กำลังทดสอบ โดยทำตามวงจรการพัฒนาแบบทดสอบนำ (test-driven cycle) คือ ออกแบบ ทดสอบ พัฒนา และทดสอบอีกครั้ง จนกว่าทุกกรณีจะผ่าน

  • 🔘 วงจร TDD: ออกแบบ ทดสอบ พัฒนา และทดสอบอีกครั้ง คือสี่ขั้นตอนที่ใช้ในการทดสอบแอปพลิเคชัน iOS
  • ☑️ ที่ต้องการ: เครื่อง Mac ที่ใช้ระบบปฏิบัติการ OS X พร้อมด้วย Xcode ติดตั้ง IDE, เฟรมเวิร์กสำหรับการทำงานอัตโนมัติ และ iOS SDK แล้ว
  • เส้นทางเครื่องดนตรี: เครื่องมืออัตโนมัติจะบันทึกสคริปต์ แสดงผลในบันทึกสคริปต์ และเล่นซ้ำได้ตามต้องการ
  • 🧪 เส้นทาง OCUnit: ชุดเป้าหมายการทดสอบหน่วย (Unit Test Bundle) โครงร่างที่ใช้งานอยู่ กลุ่มทดสอบ และคลาสทดสอบที่เขียนด้วยภาษา Objective-C
  • ⚠️ คำเตือน: เลิกใช้งานแล้ว เครื่องมือ UIAutomation ถูกยกเลิกการใช้งานแล้วในเวอร์ชัน 2.0 Xcode เวอร์ชัน 8 ถูกลบออกแล้ว; XCUITest เป็นเวอร์ชันที่รองรับต่อมา
  • 🛠️ เทียบเท่าในยุคปัจจุบัน: ชุดเป้าหมายสำหรับการทดสอบ UI พร้อมด้วยคำสั่งค้นหา XCUIApplication จะแทนที่สคริปต์ Instruments ที่บันทึกไว้

การทดสอบระบบอัตโนมัติ iOS ด้วย Xcode เฟรมเวิร์ก UI Automation ที่ใช้รันสคริปต์ที่บันทึกไว้กับแอปพลิเคชัน

การทดสอบระบบอัตโนมัติของ iOS โดยใช้ Xcode

เพื่อให้มั่นใจในคุณภาพของแอปพลิเคชัน iOS ของคุณ คุณควรปฏิบัติตามกระบวนการพัฒนาแบบทดสอบนำ (Test-Driven Development) ดังแสดงในรูปด้านล่าง

วงจรการพัฒนาแบบทดสอบนำ (Test-driven development) สำหรับการทดสอบอัตโนมัติบน iOS แสดงให้เห็นถึงขั้นตอนการออกแบบ การทดสอบ การนำไปใช้งาน และการทดสอบซ้ำ

การพัฒนาที่ขับเคลื่อนด้วยการทดสอบ (TDD) คือ การทดสอบ โมเดลที่นำมาใช้ในการทดสอบแอปพลิเคชัน iOS และอยู่ในกรอบแนวทางปฏิบัติที่กว้างขึ้นของ การทดสอบมือถือในแบบจำลองนี้ ผู้ทดสอบจะต้องปฏิบัติตาม 4 ขั้นตอนดังต่อไปนี้:

  • ได้รับการออกแบบ: ระบุสิ่งที่คุณต้องการทดสอบและออกแบบกรณีทดสอบของคุณ
  • การทดสอบ: ทำการทดสอบทั้งหมดและตรวจสอบดูว่ามีกรณีทดสอบใดบ้างที่ล้มเหลว
  • ดำเนินการ: Revทดสอบโค้ดของคุณและแก้ไขข้อผิดพลาดที่ทำให้การทดสอบล้มเหลว
  • ทดสอบอีกครั้ง: หากการทดสอบล้มเหลว ให้ย้อนกลับไปใช้การออกแบบเดิม หากกรณีทดสอบทั้งหมดผ่าน แสดงว่าโค้ดตรงตามข้อกำหนดที่ทดสอบทั้งหมด

การตั้งค่า Xcode โครงการทดสอบ UI

ในการสร้างโปรแกรมทดสอบ iOS คุณต้องใช้ Mac โดย Mac ของคุณต้องติดตั้งสิ่งต่อไปนี้ไว้แล้ว:

  • OS X — ระบบปฏิบัติการสำหรับเครื่อง Mac
  • Xcode IDE — เครื่องมือพัฒนาสำหรับ iOS
  • กรอบงานการทดสอบอัตโนมัติ — UI Automation, OCUnit และอื่นๆ
  • iOS SDK 4 หรือสูงกว่า

⚠️ หมายเหตุเกี่ยวกับเวอร์ชัน: ข้อกำหนดเบื้องต้นข้างต้นอธิบายถึงเครื่องมือที่ใช้ในยุคที่เขียนบทแนะนำสองบทต่อไปนี้ บนเครื่อง Mac รุ่นปัจจุบัน Xcode โปรแกรมนี้ได้รวมเฟรมเวิร์ก XCTest และ XCUITest ไว้ในกล่องแล้ว และเครื่องมือ UI Automation แยกต่างหากไม่ได้เป็นส่วนหนึ่งของการติดตั้งอีกต่อไป ขั้นตอนเดิมยังคงเก็บไว้ด้านล่างเนื่องจากเป็นการบันทึกวิธีการทำงานของเฟรมเวิร์ก และขั้นตอนที่เทียบเท่าในปัจจุบันจะอธิบายไว้ในส่วนถัดไป

วิธีสร้าง iOS Automation โดยใช้ UI Automation Framework

ขั้นตอนทั้งแปดด้านล่างนี้จะบันทึกสคริปต์ด้วยเครื่องมือ Automation และเล่นซ้ำกับแอปพลิเคชันที่กำลังทดสอบ

ขั้นตอนที่ 1) เปิดตัวเครื่องมือ

เปิด XCode -> เปิดเครื่องมือสำหรับนักพัฒนา -> เครื่องมือวัด

เครื่องดนตรีเปิดจาก Xcode เปิดเมนูเครื่องมือสำหรับนักพัฒนา

ขั้นตอนที่ 2) เพิ่มเครื่องมืออัตโนมัติ

ในหน้าต่าง Instruments ให้เลือกเครื่องมือ Automation

เลือกเครื่องมืออัตโนมัติในตัวเลือกแม่แบบเครื่องมือ

ในการสร้างสคริปต์ทดสอบ คุณสามารถบันทึกได้สองวิธี คือ สถานการณ์การทดสอบ หรือคุณสามารถตั้งโปรแกรมด้วยตนเองได้

ขั้นตอนที่ 3) กดปุ่มสีแดง

กำลังเริ่มบันทึกเสียงเครื่องดนตรี — หยุดการบันทึกทันที หากต้องการเริ่มบันทึก ให้กดปุ่มสีแดง

ปุ่มบันทึกสีแดงในแถบเครื่องมือเครื่องดนตรี ใช้สำหรับเริ่มและหยุดการบันทึก trace

ขั้นตอนที่ 4) สร้างสคริปต์ใหม่

ในหน้าต่างสคริปต์ ให้คลิก เพิ่ม > สร้าง เพื่อสร้างสคริปต์ใหม่

เมนู "เพิ่มและสร้าง" ในหน้าต่างสคริปต์เครื่องมือ เพื่อสร้างสคริปต์อัตโนมัติใหม่

ขั้นตอนที่ 5) เลือกเป้าหมาย

คุณอยู่ใน... Tracหน้าต่าง e ใช้ปุ่ม เลือก Target เลื่อนลงเพื่อไปยังเวอร์ชันดีบักของแอปของคุณ

Choose Target เมนูแบบดรอปดาวน์ในเครื่องมือ Tracหน้าต่างที่ชี้ไปยังเวอร์ชันดีบัก

ในกรณีนี้คือตัวอย่างของแอปเปิล SimpleDrillDown แอปนี้ใช้เป็นแอปพลิเคชันที่กำลังทดสอบ โดยมีส่วนติดต่อผู้ใช้แบบกราฟิก (GUI) ดังแสดงด้านล่าง

อินเทอร์เฟซแอปพลิเคชันตัวอย่าง SimpleDrillDown ถูกใช้เป็นแอปพลิเคชันที่กำลังทดสอบ

ขั้นตอนที่ 6) เริ่มบันทึกสคริปต์ของคุณ

บันทึกสคริปต์ของคุณโดยกดปุ่มบันทึกที่ด้านบนหรือด้านล่างของเครื่องมือ

ปุ่มบันทึกที่ขอบหน้าต่าง Instruments ซึ่งจะเริ่มการบันทึกสคริปต์

ตอนนี้คุณสามารถดำเนินการบางอย่างกับส่วนติดต่อผู้ใช้ (UI) ของแอปพลิเคชันที่คุณกำลังทดสอบได้แล้ว และสคริปต์ของคุณจะถูกบันทึกไว้

ขั้นตอนที่ 7) ดูสคริปต์ของคุณ

หากต้องการดูสคริปต์ของคุณ ให้กดที่ Tracเลือกเมนูแบบเลื่อนลง e Log / Editor Log แล้วสลับไปที่มุมมองบันทึกสคริปต์

Tracเมนูแบบดรอปดาวน์ e Log และ Editor Log ใช้สำหรับสลับไปยังมุมมองบันทึกสคริปต์

คุณจะเห็นสคริปต์ที่บันทึกไว้

สคริปต์ UI Automation ที่บันทึกไว้จะแสดงในมุมมองบันทึกสคริปต์ของ Instruments

ขั้นตอนที่ 8) เล่นสคริปต์ของคุณ

กดปุ่มเล่น สคริปต์จะเริ่มทำงาน และคุณสามารถหยุดได้หลังจากที่บันทึกปรากฏขึ้น

เล่นสคริปต์การทำงานอัตโนมัติที่บันทึกไว้พร้อมแสดงผลลัพธ์ในหน้าต่าง Instruments

⚠️ หมายเหตุทางประวัติศาสตร์: เครื่องมืออัตโนมัติที่ใช้ในแปดขั้นตอนเหล่านี้ถูกยกเลิกการใช้งานแล้วใน Xcode เวอร์ชัน 8 และเวอร์ชันต่อมาได้ถูกลบออกไปแล้ว ดังนั้นจึงไม่มีอยู่ในเวอร์ชันปัจจุบันอีกต่อไป Xcode ขั้นตอนการติดตั้งต่างๆ ถูกบันทึกไว้ที่นี่เพื่อเป็นวิธีการทำงานของเฟรมเวิร์ก สำหรับงานใหม่ โปรดใช้คำแนะนำการใช้งาน XCUITest ที่อยู่ด้านล่างของหน้านี้

วิธีสร้าง iOS Automation โดยใช้เฟรมเวิร์ก OCUnit

เส้นทางที่สองวางการทดสอบไว้ภายใน Xcode โปรเจ็กต์นั้นเอง ไม่ได้อยู่ภายในเครื่องมือ

ขั้นตอนที่ 1) เริ่มต้น Xcode IDE, เพิ่มเป้าหมาย Unit Test Bundle

การเพิ่มเป้าหมาย Unit Test Bundle ลงในชุดทดสอบที่มีอยู่แล้ว Xcode โครงการ

ขั้นตอนที่ 2) เขียนชื่อของชุดทดสอบหน่วยใหม่ ตามที่แสดงในรูปด้านบน จากนั้นคลิก เสร็จสิ้น

ขั้นตอนที่ 3) กำหนดให้ Unit Test เป็นเป้าหมายที่ใช้งานอยู่

การเลือกชุดทดสอบหน่วยเป็นเป้าหมายที่ใช้งานอยู่ Xcode

ขั้นตอนที่ 4) เพิ่มกลุ่มสำหรับชั้นเรียนทดสอบ

การสร้างกลุ่มโปรเจ็กต์เพื่อจัดเก็บคลาสการทดสอบหน่วยของ iOS

ขั้นตอนที่ 5) เพิ่มคลาสการทดสอบหน่วย

การเพิ่มไฟล์คลาสทดสอบหน่วยใหม่ภายในกลุ่มทดสอบใน Xcode

ขั้นตอนที่ 6) เริ่มดำเนินการได้เลย

คลาสทดสอบหน่วยว่างเปล่าใน Xcode บรรณาธิการพร้อมสำหรับการทดสอบการใช้งาน

OCUnit ใช้ภาษา Objective-C ในการสร้างโปรแกรมทดสอบ ดังนั้นผู้พัฒนาจึงต้องมีความรู้ในภาษานั้น (Modern) Xcode การจัดส่งเวอร์ชัน การทดสอบหน่วย ผ่านทาง XCTest แทน ซึ่งรองรับทั้ง Objective-C และ Swiftแต่โครงสร้างเป้าหมายและคลาสที่แสดงในหกขั้นตอนเหล่านี้ยังคงไม่เปลี่ยนแปลง

UIAutomation กับ XCUITest: มีอะไรเปลี่ยนแปลงบ้าง

เนื่องจากเฟรมเวิร์กทั้งสองที่กล่าวถึงข้างต้นเป็นของชุดเครื่องมือรุ่นก่อนๆ ของ Apple จึงควรระบุให้ชัดเจนว่าอะไรมาแทนที่ และเพราะเหตุใด

แง่มุม การทำงานอัตโนมัติของ UI (เครื่องมือ) เอ็กซ์คิวเทสต์
สถานะ เลิกใช้แล้วใน Xcode 8 และถูกลบออกจากเวอร์ชันที่ออกในภายหลัง เฟรมเวิร์กการทดสอบ UI ที่ Apple รองรับ
ที่ที่การทดสอบอยู่ สคริปต์ภายในเครื่องดนตรี tracเอกสารอิเล็กทรอนิกส์ เป้าหมาย UI Testing Bundle ภายใน Xcode โครงการ
ภาษาที่ใช้ Javaต้นฉบับ Swift หรือออบเจกทีฟซี
นักวิ่งทดสอบ เครื่องมืออัตโนมัติ XCTest คือตัวรันเดียวกับที่ใช้รันการทดสอบหน่วย
บูรณาการอย่างต่อเนื่อง น่าอึดอัดใจ — ขับเคลื่อนผ่านเครื่องดนตรี รันจากบรรทัดคำสั่งพร้อมกับการทดสอบหน่วย
การบันทึก ปุ่มบันทึกในแถบเครื่องมือเครื่องดนตรี ปุ่มบันทึกใน Xcode บรรณาธิการ ซึ่งปล่อยออกมา Swift

ผลที่ตามมาในทางปฏิบัติก็คือ ชุดทดสอบ XCUITest ก็คือซอร์สโค้ดของโปรเจ็กต์ทั่วไปนั่นเอง มันจะถูกตรวจสอบ กำหนดเวอร์ชัน และเรียกใช้งานเหมือนกับโค้ดเบสส่วนอื่นๆ ซึ่งเป็นเหตุผลหลักที่ทำให้มีการบันทึกไว้tracโมเดล e หายไปแล้ว

วิธีการเขียน UI Test สำหรับ iOS ด้วย XCUITest

โครงสร้างที่เทียบเท่ากับขั้นตอนทั้งแปดของเครื่องดนตรีในยุคปัจจุบันนั้นสั้นกว่า โครงสร้างด้านล่างสะท้อนแนวคิดการบันทึกแล้วเล่นซ้ำแบบเดียวกัน แต่ผลลัพธ์ที่ได้คือไฟล์ต้นฉบับแทนที่จะเป็นไฟล์เสียง trace.

  1. เพิ่มเป้าหมาย In Xcode เลือก ไฟล์ > สร้างใหม่ > Target และเลือกเทมเพลต UI Testing Bundle หรือติ๊กตัวเลือกเพื่อรวมการทดสอบเมื่อสร้างโปรเจ็กต์ใหม่
  2. เปิดคลาสทดสอบที่สร้างขึ้น Xcode สร้างคลาสย่อย XCTestCase ที่มีเมธอด setup และ test ว่างเปล่า
  3. เปิดใช้งานแอปพลิเคชันที่กำลังทดสอบ สร้างอินสแตนซ์ของ XCUIApplication แล้วเรียกใช้เมธอด launch เพื่อเริ่มแอปในกระบวนการแยกต่างหาก
  4. สอบถามและดำเนินการ เข้าถึงองค์ประกอบต่างๆ ผ่านการค้นหาองค์ประกอบ เช่น ปุ่ม ตาราง ข้อความคงที่ และเรียกใช้ฟังก์ชันแตะ พิมพ์ข้อความ หรือปัดนิ้วบนองค์ประกอบเหล่านั้น
  5. ยืนยัน. ใช้ XCTAssert เพื่อตรวจสอบว่าองค์ประกอบที่คาดหวังนั้นมีอยู่จริงหลังจากดำเนินการแล้ว
  6. วิ่ง. ดำเนินการทดสอบจาก Xcode ใช้ตัวนำทางทดสอบ หรือจากบรรทัดคำสั่ง เพื่อให้ชุดทดสอบเดียวกันทำงานในระบบการรวมอย่างต่อเนื่อง

การทดสอบแบบง่ายที่สุดมีรูปแบบดังนี้:

import XCTest

final class AppUITests: XCTestCase {

    func testTappingFirstRowShowsDetail() {
        let app = XCUIApplication()
        app.launch()

        // act on the first row of the list
        app.tables.cells.element(boundBy: 0).tap()

        // verify that the next screen appeared
        XCTAssertTrue(app.staticTexts.firstMatch.waitForExistence(timeout: 5))
    }
}

ตัวบันทึกยังคงมีอยู่: การวางเคอร์เซอร์ไว้ภายในเมธอดทดสอบและกดปุ่มบันทึกในเอดิเตอร์จะสร้างแบบสอบถามเหล่านี้โดยอัตโนมัติ ซึ่งเป็นผลสืบเนื่องโดยตรงจากขั้นตอนที่ 6 ข้างต้น หลักการที่กว้างขึ้นของ การทดสอบอัตโนมัติ นำไปใช้โดยไม่เปลี่ยนแปลง

ตัวอย่างการทำงานอัตโนมัติของ UI Code

บทความนี้มีตัวอย่างโค้ดบางส่วน ซึ่งจะช่วยให้คุณเข้าใจบทเรียนได้ชัดเจนและรวดเร็วยิ่งขึ้น

ตัวอย่างการทำงานอัตโนมัติของ UI — สคริปต์ทดสอบสำหรับสาธิตการทำงานอัตโนมัติของ UI

คำถามที่พบบ่อย

ลำดับ Xcode และโปรแกรมจำลอง iOS ทำงานได้เฉพาะบน macOSดังนั้นจึงจำเป็นต้องใช้ Mac ไม่ว่าจะใช้งานในเครื่องเองหรือเป็นเครื่องสร้างซอฟต์แวร์แบบโฮสต์ ฟาร์มอุปกรณ์คลาวด์และผู้ให้บริการ CI แบบโฮสต์มีอยู่เพื่อให้ทีมที่ไม่มีฮาร์ดแวร์ Mac ยังคงสามารถใช้งานชุดซอฟต์แวร์ได้

โมเดลแมชชีนเลิร์นนิงจะแนะนำการสอบถามองค์ประกอบทดแทนเมื่อหน้าจอเปลี่ยนแปลง จัดกลุ่มความล้มเหลวที่ไม่เสถียรตามสาเหตุหลัก และจัดอันดับว่าการทำงานที่ล้มเหลวใดเป็นการถดถอยที่แท้จริง สิ่งนี้มีความสำคัญสำหรับชุด UI เนื่องจากหากไม่ทำเช่นนั้น การแก้ไขเค้าโครงเล็กน้อยอาจทำให้ตัวเลือกจำนวนมากเสียหายพร้อมกัน

มันจัดการส่วนที่ซ้ำซากได้ดี เช่น การสร้างโครงร่างคลาสทดสอบ อาร์กิวเมนต์การเปิดใช้งาน ตัวห่อออบเจ็กต์เพจ และโค้ดพื้นฐานสำหรับการตรวจสอบความถูกต้อง ตัวระบุองค์ประกอบยังคงต้องตรงกับแอปจริง ดังนั้นทุกคำสั่งค้นหาที่สร้างขึ้นจึงต้องได้รับการตรวจสอบกับบิลด์ที่กำลังทำงานอยู่ก่อนที่จะเชื่อถือได้

Appium ใช้ไดรเวอร์ XCUITest ในการทดสอบ iOS ซึ่งเข้ามาแทนที่ไดรเวอร์ UIAutomation เดิม ข้อดีคือมีภาษาทดสอบแบบข้ามแพลตฟอร์มเพียงภาษาเดียวสำหรับ iOS และ Androidข้อเสียคือจะมีชั้นเพิ่มเติมระหว่างการทดสอบและตัวรันของ Apple เอง

การทดสอบแบบ Unit Test จะทำงานภายในกระบวนการของแอปและเรียกใช้โค้ดของคุณโดยตรง ในขณะที่การทดสอบแบบ UI Test จะเปิดแอปเป็นกระบวนการแยกต่างหากและโต้ตอบผ่านทางอินเทอร์เฟซเท่านั้น ดังนั้นจึงช้ากว่า แต่จะตรวจสอบสิ่งที่ผู้ใช้ได้รับประสบการณ์จริง

โปรแกรมจำลองทำงานได้เร็วกว่าและเหมาะสมสำหรับขั้นตอนการทำงานส่วนใหญ่ในกระบวนการพัฒนาซอฟต์แวร์ ส่วนอุปกรณ์จริงนั้นจำเป็นสำหรับการใช้งานกล้อง การตรวจสอบไบโอเมตริก การแจ้งเตือนแบบพุช ประสิทธิภาพ และสิ่งใดก็ตามที่เกี่ยวข้องกับเซ็นเซอร์ฮาร์ดแวร์ ดังนั้นทีมส่วนใหญ่จึงใช้งานทั้งสองแบบในจุดต่างๆ ของวงจรการพัฒนา

การทดสอบแต่ละครั้งจะรีสตาร์ทแอปและรอให้แอนิเมชันเสร็จสิ้น ความเสถียรจะดีขึ้นเมื่อคุณตั้งค่าตัวระบุการเข้าถึงแทนการจับคู่กับป้ายกำกับ และรอการมีอยู่ขององค์ประกอบแทนที่จะรอpingรีเซ็ตสถานะระหว่างการทดสอบ และให้แต่ละกรณีมุ่งเน้นไปที่การเดินทางเพียงครั้งเดียว

ไม่โดยตรง เพราะภาษาและโมเดลองค์ประกอบแตกต่างกัน วิธีปกติคือการเก็บสคริปต์เก่าไว้เป็นเอกสารแสดงความครอบคลุมที่ตั้งใจไว้ จากนั้นเขียนสถานการณ์แต่ละอย่างใหม่เป็นกรณี XCUITest โดยเริ่มจากเส้นทางที่ล้มเหลวบ่อยที่สุดในสภาพแวดล้อมการใช้งานจริง

สรุปโพสต์นี้ด้วย: