Intro to fun automate testing

เชื่อว่าทุกคนคงมีความเห็นตรงกัน ว่าการที่โปรแกรมที่เขียนขึ้น จะมีคุณภาพได้นั้น จะต้องผ่านการ test

แต่ test มันมีต้นทุน การจะเขียน test มันต้องลงทุนลงแรง เหนื่อยมากขึ้น เปลืองเวลามากขึ้น จะทำไงดี จะไม่ test ก็คงไม่ได้ (เอ๊ะ หรือว่าได้ อันนี้แล้วแต่มุมมองนะครับ)

สิ่งที่เราพอจะทำได้คือ ทำให้ test มัน สนุกขึ้น เหนื่อยน้อยลง ใช้พลังงานและทรัพยากรน้อยลงในการดูแลมัน

จากข้อต่างๆ ที่กล่าวมานั้นหลีกเลี่ยงไม่ได้ที่เราจะต้องทำการ test แบบ automate ไม่อย่างนั้นคิดง่ายๆ test มือ ซ้ำๆ ที่เดิม 2 รอบก็ไม่สนุกแล้ว

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

  1. ต้องเขียนง่าย
  2. ต้องแก้ง่าย
  3. ต้องสั้น
  4. ต้องอ่านรู้เรื่อง
  5. ต้องรันง่าย
  6. ต้องรันได้เร็ว
  7. ต้องพังในจังหวะที่ควรจะพัง

โดย concept นึงที่ เป็นส่วนหนึ่งที่ทำให้เกิดข้อ 1,2,3,4,6,7 ได้ คือ เรื่อง testability

ลิงค์ต่อไปนี้ คือ ส่วนหนึ่งที่ผมใช้ศึกษาเรื่องนี้

youtube , pdf , youtube2 , youtube3

Concept หลักๆเลย คือ ต้องทำให้เราสามารถ test เฉพาะส่วนที่ต้องการเป็นส่วนๆได้ โดยไม่ต้องไปผูกพันธ์ test ส่วนอื่นไปด้วย จาก link ด้านบน ดึงออกมาเป็น guideline ดังนี้

  1. ใน code ส่วนสร้าง object ใดๆ จะต้องไม่มีโลจิค เพราะว่า ไม่อย่างนั้นในทุกการทดสอบแปลว่าเรา ทดสอบ code ส่วนนั้นด้วยเสมอ ถ้า code ส่วนนั้นพัง test พังหมด ถ้า​ code ส่วนนั้นช้า test ช้าหมด
  2. ใน code ไม่ควรมีการสร้าง object อื่นปะปนอยู่กับโลจิค เพราะว่า เราต้องควบคุมสภาพแวดล้อมรอบ code กลุ่มที่เราจะ test และลดการ test ซ้ำซ้อน ในบางครั้งเราจึงต้องมีการเปลี่ยน object อื่นๆที่เกี่ยวข้องไปอยู่ในสภาพที่เราควบคุมให้มัน return ผลลัพธ์ตามที่ต้องการ, ทำงานได้เร็วขึ้น ตามอ่านได้ที่ Test Double
  3. ใน code จะต้องไม่มีส่วนที่เรียกใช้งาน ไลบรารี global ที่เมื่อเรียกแต่ละครั้งอาจได้ค่ากลับคืนไม่เท่ากัน (Global State) โดยตรง เช่น เวลา, ส่ง e-mail, database สิ่งเหล่านี้มีผลต่อการ test ของเรา เช่น ระบบที่รันเดือนละครั้ง, ส่ง e-mail ทุกคร้ังที่ test, database access ช้า สิ่งเหล่านี้ต้องถูกกำจัดออกไปด้วย Test Double เช่นกัน
  4. ใน code ต้องไม่มีการเรียก property ของ object ที่เกี่ยวภายใน (Violate laws of demeter) เพราะไม่เช่นนั้น เวลาจะเขียน test ทีต้อง setup ยาวมาก
  5. code ส่วนที่ test ต้องไม่ทำอะไรมากเกินไป ไม่อย่างงั้น test จะพังง่าย และอ่านเข้าใจยาก เนื่องจากต้อง test หลายเรื่อง อาจจะทำให้ไม่ชัดเจนว่าจะ test เรื่องใด

ถ้าอยากจะทำสิ่งเหล่านี้ได้โดยอัตโนมัติ ลองศึกษาการทำ TDD แบบถูกวิธีดูครับ มีโพสที่เคยเขียนเรื่อง TDD ไว้หน่อย อันนี้

 

สิ่งที่เขียนมาข้างต้นมีผลกระทบโดยตรงกับภาษาที่เป็น static และ strong typing

สำหรับภาษา dynamic typing บางภาษา ความสามารถในการเปิด class/function ออกมาแก้ไขได้ ทำให้สามารถสร้างสภาพแวดล้อมที่เหมาะสมกับการ test ถึงแม้จะมีการละเมิดข้อด้านบนก็ตาม

ด้านภาษา functional language จะกังวลเรื่องเหล่านี้น้อยหน่อย เพราะเขียนให้ละเมิดสิ่งด้านบนได้ยาก

 

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

 

เขียนไปเขียนมา รู้สึกว่า organize ไม่ดีเลย และมีรายละเอียดที่ข้ามไปอีกเยอะมาก ไว้นานๆไป มีแรง จะกลับมาเขียนใหม่ลึกๆ แบ่งแยกดีๆ แล้วกันครับ

Happy testing สวัสดีครับ

Advertisements

7 thoughts on “Intro to fun automate testing

  1. m3rlinez

    สงสัยอยู่อย่าง เหมือนหลายเรื่องที่เขียนมามัน apply ได้เฉพาะ unit test ป่าวปล. อ่านรู้เรื่องนะ แต่คนไม่มีพื้นมาอาจจะยังไม่เห็นภาพ 5 ข้อนั้นเท่าไหร่ (:

    Reply
  2. Nuttanart Pornprasitsakul

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

    Reply
  3. Nuttanart Pornprasitsakul

    มันก็แค่ รู้/ไม่รู้ สนใจ/ไม่สนใจ ป่าวว่ะรุต

    Reply
  4. Rutz Bewilder

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

    Reply
  5. Pingback: ย้อนกลับไปมองความคิดในเรื่องการพัฒนาซอฟแวร์ | Tap

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s