June 27, 2016

ทำให้ Helper function ใน XCTest บอกตำแหน่งที่ Fail

หลังจากที่เราเขียนโค้ด test ไปเรื่อยๆ จะพบว่าหลายๆ case ที่ทดสอบนั้นจะมี Assertion ที่คล้าย หรือซ้ำกันเกิดขึ้น ทำให้บางทีเราจำเป็นต้องตัดสินใจแยกออกมาเป็น function ย่อยๆ ให้แต่ละ case ได้เรียกใช้งานร่วมกัน แต่ปัญหาก็คือ เมื่อ Test Fail เกิดขึ้นใน function เหล่านั้น เราไม่สามารถบอกได้ว่า test function ไหน fail เพราะ Xcode ดันไป highlight error ใน helper function แทน แทนที่จะ highlight ใน function test ที่เราเขียน

ยกตัวอย่างเวลาเขียนเขียน test UI แล้วสิ่งหนึ่งที่เรามักต้องทำซ้ำๆ กันก็คือ การทดสอบว่า element นั้นๆ มัน appear ออกมาหรือยัง ซึ่งเราก็สร้างออกมาเป็น function แยกต่างหาก ดังโค้ดต่อไปนี้


โค้ดลักษณะนี้ ที่เรามักเขียนมันซ้ำๆ


เราจึงแยกออกมาเป็น helper function ออกมาแบบนี้


ทีนี้เวลาเราลองใช้งานดู แล้วพบว่า test ที่เราเขียน มัน fail ก็คือ element นั้นๆ มันไม่ appear ตามที่เราตั้งเป้าหมายไว้แบบนี้



ปัญหาที่พบก็คือ ตอนที่ Xcode ฟ้องว่า fail นั้น บรรทัดที่ถูก highlight ดันไปอยู่ใน function ที่เราสร้างแยกขึ้นมาซะอย่างนั้น ไม่ได้อยู่ใน function test ที่เราสร้างขั้น นั่นก็แปลว่า เราไม่สามารถระบุได้ทันทีเลยว่า สรุปแล้ว test case ไหนกันแน่ที่ fail

วิธีแก้ไขให้ error message มันถูกอ่านได้ง่ายขึ้นก็คือเพิ่ม parameter ดังนี้


จากโค้ดจะเห็นว่าเรา implement closure handler ให้กับ waitForExpectationsWithTimeout เพิ่มกรณีที่เกิด error ขึ้น โดย override recordFailureWithDescription ด้วย parameter ที่ถูกส่งเข้ามาใน function นั่นเอง ซึ่งการที่เรากำหนด parameter พวก file, line เป็น optional นั้น ทำให้เราไม่จำเป็นต้องระบุตอนที่เราเรียก function waitForElementToAppear ก็ได้ ค่าเหล่านี้จะถูก capture ณ จุดที่เราเรียก function เลยอัตโนมัติ!

ลองทดสอบรันดูใหม่ จะเห็นว่า error message ไป highlight ที่บรรทัดที่เรียก function waitForElementToAppear แล้วใน test function จริงๆ... เจ๋งไปเลย!


ขอบใจนายมาก: http://masilotti.com/xctest-helpers/