
สวัสดียามค่ำของวันเสาร์ที่ 13 มีนาคม 2553 ครับ เปิดหัวเรื่องของวันนี้ด้วยคำว่า Case Study เนื่องด้วยเรื่องที่จะแบ่งปันในค่ำคืนนี้เป็น Case ที่เกิดขึ้นจริง หรือที่ฝรั่งมักจะใช้คำว่า Base on True Story ครับ และเกิดขึ้นใน ห้องน้ำ อ้าว งง งง งง กันเลยทีเดียวครับ ถ้าอยากรู้ว่า Software Testing ไปเกี่ยวข้องอะไรกับ ห้องน้ำ อ่านกันต่อไปครับ
Case Study นี้เกิดขึ้นเมื่อเกือบจะ 2 ปีแล้วครับ และติดตึงอยู่ในสมองน้อยๆ ของผมมานานเลยทีเดียว ว่าจะเขียน ว่าจะเขียน และว่าจะเขียน ลง welovebug มานานสองนาน แต่จนแล้วจนรอดก็ไม่ได้เขียนสักที ค่ำคืนนี้เลยตั้งใจว่าจะเขียนมันออกมา เผื่อจะได้เป้นประโยชน์ไม่มากก็น้อยสำหรับเพื่อนพ้องน้องพี่ทั้ง Software Tester, Programmer และ Developer ครับ
เพื่อนพ้องน้องพี่ทั้งหลายน่าจะคุ้นเคยกับการ Vote ให้คะแนนบน website ต่างๆ ไม่ว่าจะ Vote ให้คะแนนรูปที่ชอบ หรือ ช่วย Vote ให้เพื่อนๆ ที่ประกวดโน้นนี่นั่นบน website หรือ แสดงความคิดเห็น หรือ Comment บน Webboard หรือ Forum หรือ Discussion ที่มีอยู่เยอะแยะมากมายตาม website ต่างๆ ซึ่งเจ้า Vote และ Comment นี่แหละ ที่ทำให้ผมถึงกับต้องนอนเอา ตีx ก่ายหน้าผาก อยู่นานหลายเดือน
โจทย์ที่ได้รับมาเป็น Project ที่จะต้องทำการทดสอบ Function การ Vote ให้คะแนนกับบทความที่เขียน และมี Business Requirement หลักคือ
1 IP Address สามารถ Vote ได้ 1 ครั้ง ทุกๆ 1 ชั่วโมง
หลายคนอาจจะทำหน้า งง งง ว่า แค่ Business Requirement ข้อเดียว ถึงกับทำให้ผมต้องนอนเอา ตีx ก่ายหน้าผาก ได้อย่างไร?
ก่อนที่จะเริ่มเล่าถึงเรื่องของปัญหาที่เจอตอนออกแบบการทดสอบ (Test Design) ผมขอแนะนำให้เพื่อนพ้องน้องพี่ได้รู้จักกับ 2 คำที่จะถูกอ้างถึงต่อไปในบทความนี้ครับ เผื่อว่าหลายๆ ท่านอาจจะยังไม่คุ้นเคยกับเจ้า 2 คำนี้ จะได้ทำความรู้จักกันซะก่อน ผมจะเขียนอธิบายแบบง่ายๆ ให้เห็นภาพว่าคืออะไรครับ
IP Address พูดกันแบบเห็นภาพง่ายๆ คือ เป็นหมายเลขประจำเครื่อง Computer ที่ถูกเชื่อมต่อเข้ากับ Internet ซึ่งแต่ละเครื่อง Computer จะมี IP Address ที่ไม่ซ้ำกัน สำหรับรายละเอียดลึกๆ หากมีเพื่อนเป็น System Administrator ก็ถามเลยครับ หรือไม่ก็ไปอ่านได้ที่ Wikipedia ตาม Link นี้เลยครับ http://en.wikipedia.org/wiki/IP_address
IP Address แบ่งออกได้เป็น 2 แบบ คือ
NAT หรือ Network Address Translation เป็นมาตรฐานหนึ่งของ RFC ถูกเขียนขึ้นในปี 1994 โดยสามารถแปลง (Translation) IP Address หลายๆ ตัวที่ใช้ภายในเครือข่ายให้ติดต่อกับเครือข่ายอื่นโดยใช้ IP Address เดียวกัน เช่น แปลง Private IP หลายๆ IP ให้เป็น Public IP เดียวก่อนออกไปยัง Internet
รูปจาก Thaicert
จากรูปด้านบน IP Address 192.168.1.20 เป็น Private IP ภายในองค์กร ซึ่งเมื่อเชื่อมต่อไปสู่ Internet จะถูกแปลงให้เป็น IP Address 203.154.207.76 หรือที่เรียกว่า Public IP
เพื่อนพ้องน้องพี่ที่สนใจเรื่อง NAT สามารถอ่านเพิ่มเติมได้จากบทความเรื่อง Network Address Translation (NAT) เรียบเรียงโดย คุณภูวดล ด่านระหาญ (http://www.addmoremem.com)
คิดกันง่ายๆ ว่าผมจะต้องทดสอบอะไรบ้างกับ Business Requirement ของ Function Vote
อันเนื่องด้วยแผนก IT ที่ผมทำงานอยู่ถูกทำ NAT เป็น IP Public 1 IP Address ไปยัง Test Environment ไม่ว่าผมจะใช้เครื่อง PC หรือ Laptop ของใครในแผนก IT ก็จะได้แค่ 1 IP Address ดังนั้น
ผมจะสามารถทดสอบได้แค่ ข้อ 1, ข้อ 2 และต้องนั่งรอให้เวลาผ่านไปเกิน 1 ชั่วโมงจึงทดสอบข้อที่ 4 และก่อนหน้านั้นก็ทำการทดสอบได้เพียงเท่านั้น บวกกับให้ Developer ช่วยปรับแก้ค่าของเวลาจาก 1 ชั่วโมง เป็น 5 นาที
สำหรับข้อที่ 3 ผมจะต้องเดินไปขอใช้เครื่อง PC หรือ Laptop ของแผนกอื่นๆ ที่ทำถูกทำ NAT ออกไปเป็น IP Public อีก 1 IP Address ที่ไม่ซ้ำกับของแผนก IT
หลายๆ คนอาจจะมองว่าแค่นั้นก็น่าจะเพียงพอแล้ว แต่เอาจริงๆ มันไม่เพียงพอครับ เพราะมันมีอะไรที่ซับซ้อนกว่านั้น ฮึฮึ
ปัญหานั้นเกาะกินใจผมมานานหลายเดือน จนกระทั่งเช้าวันหนึ่งขณะที่อาบน้ำก่อนจะไปทำงาน ผมก็ยืนคิด คิด คิด และคิด จนนึกย้อนกลับไปสมัยที่ยังเขียน Program อยู่ (ภาษา C) ระลึกได้ว่าผมสามารถที่จะรู้ค่าของ IP Address ได้จาก Function (แต่ตอนนั้น และตอนนี้ จำไม่ได้แล้วว่า Function อะไร) ซึ่ง PHP ก็เป็นเช่นนั้นเหมือนกัน
เมื่อถึงที่ทำงานผมก็เดินดิ่งไปหา Developer เพื่อพุดคุยเรื่องการดึงค่า IP Address ของ PHP ซึ่งสรุปได้ดังนี้
PHP สามารถดึงค่า IP Address โดยใช้ PHP function - $REMOTE_ADDR
ผมถามต่อ
เราสามารถ Comment Code ส่วนนั้น แล้วเปลี่ยนการรับค่า IP Address ผ่านทาง Address Bar ของ Browser ได้ใช่ไหม?
คำตอบ
สามารถรับค่า IP Address ผ่านตัวแปรที่มาจาก Address Bar ของ Browser ได้
แบบนั้นก็แจ่มเลยซิครับ ![]()
อธิบายเพิ่มเติมนิดนึง: การรับค่าตัวแปรผ่านทาง Address Bar ศัพท์อย่างเป็นทางการเรียกว่า GET Method ตามตัวอย่างด้านล่าง
http://www.test.com/test.php?variable1=value1&variable2=value2
ดังนั้นผมจึงขอให้ Developer ช่วยแก้ไข Code ของ Software 3 จุด คือ
ผลที่ได้คือ
http://www.test.com/vote.php?picid=1234&ip=123.123.123.123
จากตัวอย่าง URL ด้านบน ผมสามารถทดสอบได้ทั้ง 4 ข้อข้างต้นได้ โดยสามารถที่จะเปลี่ยนค่าของ IP Address ของตัวแปร ip ได้ทันทีตามที่ได้ออกแบบการทดสอบไว้
หลังจากจบ Project ดังกล่าวแล้วนั้นผมสรุป Lesson Learns ที่ได้ดังนี้
สำหรับ Case Study นี้ผมก็หวังว่าน่าจะเป็นประโยชน์ไม่มากก็น้อยสำหรับเพื่อนพ้องน้องพี่ไม่ว่าจะเป็น Software Tester, Developer และ Programmer เผื่อจะสามารถนำไปประยุกต์ใช้ได้นะครับ แล้วพบกันใหม่ใน Case Study อื่นๆ ครับ
4 Responses to Case Study: สู้รบปรบมือกับการทดสอบที่มี IP Address มาเกี่ยวข้อง
icez
March 15th, 2010 at 8:48 am
ปิดื register globals เมื่อไหร่ก็ระเบิด
ใช้ $_SERVER['REMOTE_ADDR'] แทนดีกว่าครับ
Zyracuze
March 15th, 2010 at 8:53 am
ขอบคุณครับน้อง icez
พิชัย
March 17th, 2010 at 7:26 pm
ไม่รู้นะ ผมอาจจะผิดก็ได้ แต่ เท่าที่อ่านดู…
ผมว่า มันก็คือเป็นการเทสโดยการใช้ stub and driver technique นะครับ
อยากจะเสริมอีกนิดนะครับ หลังจากเทสโดยการดัดแปลงสามอย่างข้างต้นแล้ว จนเกิดความมั่นใจแล้ว ควรที่จะสร้างเทสเคส แล้วเทสต่อโดยการไม่มีการดัดแปลง เข้าไปด้วย เพื่อลดความเสี่ยง และเพิ่มความมั่นใจ
Zyracuze
March 17th, 2010 at 7:30 pm
ไม่ผิดหรอกครับ วิธีการแบบที่คุณพิชัยบอกก็ได้
ส่วนใน case study ที่ผมเขียนไว้นั่น ผมทำในส่วนของ system testing ซึ่งทีม development ที่ผมทำงานอยู่ด้วยไม่ค่อยจะทำ unit testing และ integration testing มา ดังนั้น Tester แบบผมเลยต้องหาวิธีการในการทดสอบเพื่อตรวจสอบว่าเป็นไปตาม Business Requirement หรือไม่ครับ
เมื่อ Deploy ขึ้น Production แล้ว เรามีการทำ Sanity Testing กันอีกครั้งจาก IP จริงๆ จาก ADSL โดยกลับไปใช้ Logic เดิมที่ได้ทำการ Comment ใน Coding ไว้ครับ