UnitTest: XCTest Beginner’s Guide
การเขียน Test เป็นสิ่งสำคัญในการพัฒนาซอฟต์แวร์เป็นอย่างมากเพื่อให้แน่ใจว่า code ที่เราเขียนสามารถทำงานได้ดีและเชื่อถือได้ ใน Swift, XCTest คือ Framework ที่คนส่วนมากมักเลือกมาใช้ในการเขียนและ run test ถ้าคุณยังไม่คุ้นกับ XCTest หรือการเขียน test หวังว่าบทความนี้จะทำให้ทุกคนมีความเข้าใจใน XCTest และวิธีใช้มันในการพัฒนาโปรเจค Swift มากขึ้นนะครับ!
Why Test Matters?
ก่อนที่เราจะลงรายละเอียดในเรื่อง XCTest มาพูดถึงว่าทำไมต้องมี test กันก่อนดีกว่าครับ
- Quality Assurance: test ช่วยหาและป้องกัน bug ที่อาจจะเกิดขึ้น หรือข้อผิดพลาดใน code ก่อนที่จะเอาไปใช้งานจริง ทำให้ product ที่เรา implement มีคุณภาพและมีประสิทธิภาพมากขึ้น
- Code Maintenance: test เปรียบเสมือนเป็น document ของ code ที่จะทำให้ code อ่านง่ายและง่ายต่อความเข้าใจ แก้ไข และดูแลคุณภาพของ code ในระยะยาว
- Confidence: การเขียน test ทำให้คุณมั่นใจได้ว่า code ที่คุณเขียนได้ทำงานตามที่คาดหวังไว้ แม้ว่าคุณจะทำการเปลี่ยนแปลงหรือ เพิ่มหรือลด feature ใหม่ในอนาคต็ตาม
ตอนนี้ที่เราเห็นถึงความสำคัญของการ test กันแล้ว เรามาทำความเข้าใจกับ XCTest กันเลย!
What is XCTest?
XCTest คือ built-in testing framework ที่ทาง Apple สร้างมาให้ใช้กับ Swift และ Objective-C มาพร้อมกับ tools กับ feature ครบครันให้เขียนและ run test สำหรับแอปลิเคชั่นต่างๆ อาทิเช่น iOS, macOS, tvOS และ watchOS ที่คุณได้ทำการพัฒนาขึ้น และยังสามารถสร้าง test cases ต่างๆ หรือทำ performance tests ที่สามารถช่วยให้คุณภาพและประสิทธิภาพของ code ดีขึ้นได้
ตัวอย่าง Key Aspect ของ XCTest:
- Unit Testing: XCTest ช่วยให้ swift developer สามารถเขียน unit tests สำหรับโค้ด Swift ที่ developer เขียนได้, unit tests จะ test เป็น unit เล็กๆ focus ที่การกระทำของแต่ละ function หรือ method ของ code ที่เขียนขึ้นมาเพื่อเช็คว่าผลลัพธ์เป็นไปตามที่คาดหวังหรือไม่
- Integration Testing: XCTest ยัง support integration test อีกด้วย สามารถ test การโต้ตอบ ระหว่าง component หรือ module ต่างๆ ในระบบหรือแอปพลิเคชันต่างๆของ developer ได้
- Tests Cases: ในแต่ละ test ของ XCTest จะถูกแบ่งออกเป็น tests cases ต่างๆ ซึ่งจะเป็น class ที่ชื่อว่า XCTestCase class ละส่วนมากนิยมตั้งชื่อ method หรือ function ที่ใช้ test เริ่มต้นด้วยคำว่า “test” เพื่อจะได้รู้ว่านี่คือ method หรือ function test
- Assertions: XCTest ยังมี assertion function เพื่อใช้ในการตรวจสอบความถูกต้องของ result กับ ผลลัพธ์ที่หวังไว้ของ code มี function อาทิเช่น XCTAssertEqual ที่เป็นการเปรียบเทียบระหว่างผลลัพธ์ที่เราาดว่าจะเป็น กับผลลัพธ์ที่ function output ออกมา ว่าตรงกันมั้ย, XCTAssertTrue ที่เป็นการเช็คว่าผลลัพธ์ที่ได้เป็นจริงใช่มั้ย, XCTAssertFalse ที่เป็นการเช็คว่าผลลัพธ์ที่ได้ไม่เป็นจริงใช่มั้ย, และ อื่นๆ
- Test Lifecycle Methods: XCTest มี method ที่ช่วยให้เราสามารถติดตั้งค่า และลบหรือทำลายทรัพยากรเครื่องได้ ก่อนและหลังของการทดสอบ method (setUp() และ TearDown()) คือ สอง method ที่ช่วยทำสิ่งนี้ method เหล่านี้จะช่วยรักษาสถานะที่สะอาดและสม่ำเสมอสำหรับการทดสอบแต่ละครั้ง
- UI Testing: นอกจาก unit testing แล้ว XCTest ยังรองรับการทำ UI Testing ของ iOS แอพพลิเคชั่นด้วย UI test จะจำลองการใช้งานของ user กับ UI ของแอพ และจะตรวจสอบการทำงานของแอพว่าทำงานถูกต้องหรือไม่
- Xcode Integration: XCTest เป็น Framework ที่พัฒนาการขึ้นกับ Apple’s Development, Xcode เพราะฉะนั้น Dev สามารถทำการเท็สได้โดยตรงผ่าน Xcode และดูผลการทดสอบใน XCode test navigator และสามารถวิเคราะห์การครอบคลุมของโค็ดได้ เพื่อให้แน่ใจว่า test ครอบคลุมอย่างละเอียด
XCTest มีบทบาทสำคัญในการสนับสนุนหลักการของการพัฒนาที่ขับเคลื่อนด้วยการทดสอบ (TDD, Test-Driven Development) และการรวบรวมให้เข้ากันในระบบนิเวศของ Apple
Setting Up XCTest
ก่อนที่จะเริ่มเขียน test เราจะต้องไปตั้งค่า test target ใน Xcode ก่อนสะก่อน ลองทำตามขั้นตอนเหล่านี้:
- ให้เปิด project ใน Xcode
- เข้าไปเลือกที่ “File” แล้วเลือก “New” แล้วเลือก “Target”
- ให้เลือก “iOS Unit Testing Bundle” หรือ “macOS Unit Testing Bundle” ขึ้นอยู่กับ project ของคุณ
- จากนั้นคลิกที่ “Next” และเพิ่ม target ไปที่ project
ตอนนี้คุณจะมี test target และสามารถเริ่มเพิ่ม test class และ method ได้แล้ว!
Writing XCTest
มาเริ่มด้วยตัวอย่างฟังก์ชันง่ายๆ สมมติว่าคุณมีฟังก์ชัน Swift ที่เป็นผลบวกของสองเลขเข้าด้วยกัน:
ถ้าต้องการเขียน test สำหรับฟังก์ชันนี้ ลองสร้างไฟล์ Swift ใหม่ใน test target ของคุณและเขียน test case ต่อไปนี้:
สิ่งที่ test case นี้ทำ:
- import XCTest มาใช้เพื่อช่วยในการ test
- สร้าง test class ชื่อ MyTests ที่มาจาก XCTestCase
- ใน class มันกำหนด method ที่จะทำการเท็สชื่อ test_add()
- กำหนดค่า input constant ของ function ที่เราจะทำกาน test โดยในที่นี้ ให้ค่า a = 2 และ b = 3
- จากนั้น ให้ method สร้าง constant (ในที่นี้คือ result) ที่เรียกใช้ function add()
- สุดท้ายเราจะใช้ assertion function ที่ชื่อว่า XCTAssertEqual() เพื่อตรวจสอบว่าผลลัพธ์ของ constant result เท่ากับ ผลบวกของ a กับ b จะเท่ากับ 5 (a + b = 5) หรือไม่ ถ้าไม่เท่า test จะ fail ด้วยข้อความ “Addition Failed”
- ถ้า test ผ่าน XCTest จะมี เครื่องหมายถูกต้องสีเขียวข้างๆ method test ของเรา แต่ถ้า fail เป็นเครื่องหมายกากบาทสีแดงข้างๆ method test ของเรา
How to Run Tests
เพื่อ run test ทำตามขั้นตอนเหล่านี้:
- คลิกที่ไอคอนรูปทรง Diamond ข้างๆ test class (test ทั้ง class) หรือ method (test เฉพาะ แต่ละ method)
- หรือจะเลือกที่ “Product” แล้วเลือก “Test” ในเมนู XCode ข้างบนสุด
- หรือจะรูป Diamond ที่มีเครื่องหมายถูกต้อง ข้างซ้ายบนของ XCode จากนั้นให้เลือก class หรือ method ที่เราจะทำการ test ได้เลย
Xcode จะ run test และจะเห็นผลลัพธ์ใน test navigator
ยินดีด้วยครับ! คุณได้รู้จักพื้นฐานของ XCTest มาขึ้นแล้ว Test อาจจะเป็นการทำขั้นตอนเพิ่มขึ้น แต่มั้นจะคุ้มค่าในระยะยาวด้วยการให้ความมั่นใจในโค้ดเบสของคุณ การเขียน Test เป็นทักษะที่สำคัญสำหรับ developer มากๆ และ XCTest ที่ทำร่วม XCode ทำให้มันง่ายขึ้นในการให้คุณมั่นใจในคุณภาพ code ของคุณ
เมื่อไรที่ทำ project โดยใช้ Swift อย่าลืมเขียน test สำหรับ function และ class กันนะครับ จะได้ไม่เจอ bug กันบ่อยๆ ครับ! ><