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

จากที่ผ่านพบมา ส่วนใหญ่มักเขียนเพื่อเอาไว้ประมวลผล
หรือทำงานตามที่เราต้องการ มากกว่าให้อ่านง่ายๆ

ดังนั้นสิ่งที่ควรเน้นก็คือ Test ควรที่จะต้องมีทั้ง
Readability และ Executability ด้วยกันเสมอ ห้ามลืมหรือยกเว้นโดยเด็ดขาด

แล้วแนวทางที่จะช่วยปรับปรุงล่ะ เป็นอย่างไร ?
แนวทางคือการวางโครงสร้างของ Test ให้ง่ายต่อการอ่านและเขียน

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

ดังนั้นในการเขียน Test หรือ Automate Test ก็เช่นเดียวกัน
จำเป็นต้องมีโครงสร้าง เพื่อให้สามารถอ่านและเขียนได้ง่าย

โดยโครงสร้างที่ใช้สำหรับเขียน Test ที่ขอแนะนำก็คือ
Four-Phase Test ประกอบไปด้วย
1. Setup ทำการกำหนดสถานะเริ่มต้นของสิ่งที่ต้องการทดสอบ
2. Exercice ทำการส่ง message ไปยัง object ที่ต้องการ
3. Verify ทำการตรวจสอบที่ต้องการ ว่าได้ผลลัพธืตามที่คาดหวังไว้หรือไม่
4. Teardown ทำการกำหนดค่าของสิ่งที่ต้องการทดสอบไปยังสถานะเริ่มต้น หรือคืน resource ต่างๆ กลับไป

Screen Shot 2557-04-25 at 10.33.32 PM

มาตัวอย่าง code ของ RSpec กันดีกว่า

describe Stack do
   describe "#push" do
      it "puts an element at the top of the stack" do
         stack = Stack.new
         stack.push(1)
         stack.push(2)
         expect(stack.top).to eq(2)
      end
   end
end

เมื่อดู code ของ RSpec แบบนี้อาจจะทำให้งงนิดหน่อยว่า
จากโครงสร้างที่อธิบายข้างต้น มีอยู่ใน code ตัวอย่างหรือไม่
ดังนั้นลองมาใส่ comment เพื่อแยกส่วนของ code กันหน่อย

describe Stack do
   describe "#push" do
     it "puts an element at the top of the stack" do
        # setup
        stack = Stack.new

        # exercise
        stack.push(1)
        stack.push(2)

        # verify
        expect(stack.top).to eq(2)
      end
   end
end

จะสังเกตได้ว่า code ดูเป็นสัดส่วนขึ้นมา มีโครงสร้างที่สวยงามและชัดเจนขึ้น
ถ้าเรามีโครงสร้างของ Test ที่ชัดเจนแล้ว
สามารถลบ comment ออกได้เลย

describe Stack do
   describe "#push" do
      it "puts an element at the top of the stack" do
         stack = Stack.new

         stack.push(1)
         stack.push(2)

         expect(stack.top).to eq(2)
      end
   end
end

จากตัวอย่างนี้อาจจะเห็นไม่ชัด
เนื่องจากมันแค่ทำการใส่บรรทัดว่างๆ ไป 2 บรรทัดเท่านั้นเอง
แต่นั่นไม่ใช่ประเด็น !!!
ประเด็นคือ มันทำให้ Test อ่านง่ายขึ้นไหม !!!!
รวมทั้งโครงสร้างเป็นไปตามที่เราตกลงกันไว้จากข้างต้นหรือไม่ !!!

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

สรุป
การเขียน Test นั้นไม่ใช่สนใจเพียงแค่ให้มันผ่าน (Green) เท่านั้น
แต่ยังต้องสนใจเรื่อง  Test มันอ่านและทำความเข้าใจง่ายด้วยเช่นกัน

แล้วคุณล่ะ …
…. ทำการปรับปรุงคุณภาพของ Test ของคุณอย่างไร ?
…. ทำการปรับปรุงให้ Test ของคุณอ่านและเข้าใจได้ง่ายอย่างไร ?

Reference Website
http://xunitpatterns.com/Four%20Phase%20Test.html

Tags: