สืบเนื่องจาก blog ที่แล้ว Software Tester/QA 100.1 วันนี้มายกตัวอย่างการเป็น tester เก่งๆในหัวข้อที่ (2) ของ blog นั้นละกันนะ ให้เห็นภาพว่าการเป็น tester เก่งๆที่ใช้ test technique ในการออกแบบ test case เนี่ยมันคืออะไร เตือนไว้ก่อน อันนี้ยาว ย๊าว ยาววว นะ ใครไม่ชอบอ่านเยอะๆอนุญาตให้ข้ามไปได้ 555
อันว่า test technique นั้นมีมากมายหลากหลายประเภท วันนี้ยก technique ที่โดยส่วนตัวใช้บ่อยสุด หรือเกือบบ่อยสุด และเข้าถึงได้ง่ายที่ชื่อว่า Equivalence Partitioning (EP) Technique มาพูดให้ฟังละกันนะ
EP มาจากศัพท์สองคำคือ Equivalence ที่แปลว่า เท่ากัน กับคำว่า Partition ที่แปลว่า การแบ่งกั้นเป็นส่วนๆ แปลแยกกันก็จะงงๆนิดนึง ไหนลองแปลรวมซิ สรุปง่ายๆแบบรวบรัด EP คือ technique ที่บอกว่า แต่ละกลุ่มแต่ละส่วน มีค่าเท่ากัน …. เอ้าาา งงหนักเข้าไปอี๊ก! แฮร่ เอาเป็นว่า มาเริ่มดูตัวอย่างกันก่อนละกัน
ตัวอย่างคือ software ตัวนึง มี text box ไว้รับ input กับมีปุ่ม submit แล้วตัว input เนี่ยสามารถมีค่าเป็น integer ได้ตั้งแต่ 0–100 ให้ลองจำลองตัวเองเป็น tester ที่ต้อง sign off software ตัวนี้นะ แล้วอันนี้มีมูลค่า 50 ล้าน ถ้าเจอบั๊ก โดนปรับ 10 ล้าน อ่ะ จงมโน ว่าถ้าเราเป็น tester ชั้นจะ test อะไรบ้างดีน้าาา “1” ก็น่าเทส “2” ก็ควรเทส หรือจะลองเทส “10” ด้วยดี เอ๊ะ โดนปรับตั้ง 10 ล้าน เทสมันตั้งแต่ 1–100 เลยดีกว่า ค่อยๆไล่กดไปเรื่อยๆ เซฟๆ รอดแน่ตรู 10 ล้าน

คิดแบบนี้ ขอเรียกว่า วิธีลูกทุ่งละกันนะ คือมันก็อาจจะรอดแหล่ะ แต่โอกาสไม่รอดมันก็สูง มาลองดูวิถี tester เจ๋งๆ หน้าตาดีหล่อสวย คิดกันมั่ง ถ้าจะลองเอา Technique EP มาจับ ขั้นแรก ต้องแยกออกมาก่อน Input มีอะไรได้มั่ง อ่ะ อันนี้ง่าย มีอันเดียวคือ text box ที่ใส่ตัวเลข หลังจากนั้น step ต่อมาให้ดูว่า input นั้น สามารถแบ่งเป็น partition ต่างๆได้มั๊ย จากโจทย์นี้ ถ้าย้อนระลึกถึงวัยเรียน มันก็จะมีสิ่งที่คุณครูสอนเราไว้ คุ้นๆ คลับคล้ายคลับคลา ว่ามีสิ่งที่เรียกว่า เส้นจำนวน อยู่ในเซลสมองส่วนลึก อ่ะ ไหนลองวาดเส้นจำนวนออกมาดูซิ

หน้าตามันก็ประมาณนี้ สรุปด่วนๆว่า 1–100 สามารถแบ่งออกมาได้เป็น 3 partitions ซึ่ง Partition แรก คือ 1–100 เรียกว่า Valid Partition (แทนด้วย V1 ละกัน) Partition ที่สอง คือ ส่วนที่น้อยกว่า 1 เรียกว่า Invalid Partition ส่วนที่หนึ่ง (แทนด้วย I1) และ ส่วนที่มากกว่า 100 เรียกว่า Invalid Partition ส่วนที่สอง (แทนด้วย I2)
ได้ Partition มาแล้วเรียบร้อย ทีนี้ ตามหลักของ Equivalence Partition เนี่ย เค้าก็กล่าวไว้ว่า
Each value in partition can be representative for the whole partition (if one work, all value will work) แต่ละค่าใน Partition สามารถเป็นตัวแทนได้ของทั้ง Partition ถ้าค่านึงใช้งานได้ ค่าที่เหลือก็จะใช้งานได้เช่นกัน
นอกจากนี้ หลักการสำคัญของ technique นี้คือ
Test one from each partition better than test all value from one partition หมายความว่า แต่ละ Partition เนี่ย เลือกมาค่าเดียวพอ แต่ให้เลือกมาเทสให้ครบทุก Partition ดีกว่า การเลือก Test ทุกค่าใน Partition เดียวนะจ๊ะ
อันหลังนี่ฟังดูคุ้นๆ เหมือนตอนแรกที่เราอาจจะเลือกเทส 1–100 นั่นแหล่ะคือ all from one partition โดยแท้จริงโดยที่ไม่ได้เทส partition ที่เป็น invalid เลย
ดังนั้นจากตัวอย่างข้างบน ถ้า apply EP technique เข้าไปเนี่ย tester หล่อสวย จะเทสแค่ 3 ค่าเอง คือตัวแทนจากแต่ละ partition ยกตัวอย่างเช่นเทส 3 ค่านี้
-20 (I1), 25 (V1), 235 (I2) ก็จะ cover ตามหลักเทคนิคนี้
จนถึงจุดนี้ ที่ยกมาเป็นตัวอย่าง super simple ให้เห็นภาพก่อน มาลองดูของจริงที่ดูจะเข้าใกล้ชีวิตการทำงานจริงกันมั่งละกันนะ ก็จะยาวๆ อธิบายยากหน่อย ลองค่อยๆคิดตามไปกันนะ
โจทย์คือ Module ในการ validate new password ของ user ก็ประมาณว่า จะ setup password ใหม่ และมีกติกาของ password ที่ set ได้ตามนี้
- Password length = 6–10 characters ก็คือต้องมีความยาว 6–10 ตัวอักษร
- First and Last character must be “a-z” or “0–9” or “?” ก็คือ ตัวแรกกับตัวสุดท้ายของพาสเวิร์ดเนี่ย เป็นได้แค่ ตัวอักษร ตัวเลข หรือ เครื่องหมาย ? เท่านั้น
- Remaining character could be anything except “+” ตัวที่เหลือของ password จะเป็นอะไรก็ได้ยกเว้นเครื่องหมาย +
- Password cannot have meaning in dictionary ก็คือ พาสเวิร์ดที่ตั้งเนี่ย ห้ามมีความหมายใน dictionary นั่นเอง
เจอแบบนี้เอาจริงๆก็ไม่ง่าย ให้ลองมโนก่อน ถ้าเราเป็น tester ของตัวนี้ จะเทส input กี่แบบดี 30 ข้อพอมั๊ย ลองใส่ password แบบต่างๆ เทสไป 50 ข้อแล้ว ชั้นจะสบายใจสามารถ sign off ได้รึยังนะ ส่วนใหญ่ก็จะพยายามเทสแล้วก็ sign off แบบหวิวๆ ไม่แน่ใจว่าตัวเอง test ดีพอรึยัง
ทีนี้มาลองให้ EP technique กัน พอเจอโจทย์ที่เริ่มซับซ้อนแบบนี้ EP เค้าก็มีตัวช่วยที่ชื่อว่า Equivalence Partition table (EP table) หน้าตามันก็จะประมาณนี้

เอ้าาา งง มายังไงได้อย่างงี้! ค่อยๆตามมานะ เขียนอธิบายนี่ก็ยากเหลือเกิน ครั้งหน้าเดี๋ยวลองทำ VDO สอนแทนละกัน ^__^
ตารางนี้เริ่มจาก column แรกที่ชื่อว่า Condition ก็คือ Condition ของ input เรานี่แหล่ะ ตามโจทย์เลยอันนี้แต่พี่แยก First กับ Last ออกมา ซึ่งบางคนทำรวม จำนวน test case ก็จะลดลง แต่ coverage ก็จะลดลงหน่อยด้วย ถ้ารวมเนี่ย test case ของเรา first กับ last จะต้องเป็นตัวเดียวกันเสมอ (งงๆไปก่อน เดี๋ยวตอนหลังน่าจะเข้าใจ)
Column ถัดมาคือ Valid Partition ก็ตรงตัว ใส่ค่าที่ valid ของแต่ละ condition เข้าไปในนี้ อันไหนไม่ใช่ตัวเลขก็ไม่ต้องไปพยายามทำเส้นจำนวนให้มันนะ บางทีชีวิตเรามันก็ไม่ยากขนาดนั้น ก็ใส่ตรงๆตัวไปเลยเช่น “?” คือค่า valid งิ
Column ถัดมากับ Column สุดท้ายคือ Tag ของ Valid กับ Invalid Partition อันนี้ง่ายๆ ใส่ idให้มันนั่นเอง ต้องไล่ไปเรื่อยๆนะ Valid กับ Invalid tag แยกการเรียงลำดับกัน
สุดท้ายคือ Invalid Partition ก็ใส่ส่วนที่ Invalid ไปนั่นแหล่ะ แล้วแต่ละกันก็ใส่ tag ให้มันใน column สุดท้ายด้วย
ลองค่อยๆดู condition กับดูตามแต่ละส่วนในตารางกันไปนะครับ (พอมีคนทำมาให้ก็น่าจะตามง่ายนิดนึง แต่การลองทำเองครั้งแรกนี่ก็ยากเอาเรื่องเกาหัวแกร่กๆผมร่วงครึ่งหัวได้อยู่นะ) ตัวตาราง EP table อันนี้เราเรียกว่า Test Condition ขั้นต่อมาก็ต้องแปลง Test condition นี้ให้เป็น Test case กันหล่ะ มีกติกาอยู่สองสามอย่างให้ทำตาม
- เลือก Valid มาใช้ให้หมดก่อน โดย เอา Valid ของแต่ละ Condition มาอยู่ด้วยกัน ถ้า condition ไหนใช้ V ตัวเองหมดแล้ว แต่ V ของ Partition อื่นยังไม่หมดให้ใช้ V เดิมซ้ำได้ ดังนั้น 3 ข้อแรกของ Test case พี่จะได้ดังนี้
ข้อ 1. V1, V2, V5, V8, V9
ข้อ 2. V1, V3, V6, V8, V9
ข้อ 3. V1, V4, V7, V8, V9
หลังจาก 3 ข้อแรกนี้ จะเห็นว่าเราเก็บ V ของทุกตัวหมดแล้ว ทีนี้ ได้เวลาเก็บ I (Invalid) กันหล่ะ กติกาคือ แต่ละข้อ ให้มี I ได้แค่ตัวเดียวเท่านั้นที่เหลือต้องอยู่กับ V ยกตัวอย่าง ข้อ 4. เราก็เลือก I แรกมาจาก condition แรกก็ได้ I1 มา ทีนี้ก็จับมันไปอยู่กับ V อะไรก็ได้ของ condition อื่น เช่น ข้อ 4. ก็จะได้ test case เป็น I1, V2, V6, V8, V9 หลังจากนั้นก็ทยอยเก็บ I ที่เหลือโดย การเอาไปอยู่กับ V ของ condition อื่นดังนี้
ข้อ 4. I1, V2, V6, V8, V9
ข้อ 5. I2, V3, V7, V8, V9
ข้อ 6. V1, I3, V5, V8, V9
ไล่ไปเรื่อยๆจนครบทุก I ดังนั้นถ้าจะคิดง่ายๆ จาก EP table ตัวอย่างก็สามารถคำนวนจำนวน test case ได้ดังนี้
จำนวน test case ทั้งหมด = จำนวน V ที่มากที่สุดในแต่ละ condition (ในที่นี้คือ 3) + จำนวน I ทั้งหมด
จริงๆมันมีวิธีทำตาราง cross test case ง่ายๆนะ หน้าตาก็ประมาณนี้ ไม่อธิบายละกันนะ ให้ไปลองแกะกันเอาเอง ^_____^

มาถึง step สุดท้ายหล่ะ คือการเอา test case มาแปลงเป็น test script ใส่ data จริงๆที่ต้องใช้ test เข้าไป เอาตัวอย่างข้อที่ Valid มาหนึ่งข้อ กับข้อที่ Invalid มาหนึ่งข้อละกันนะ
Valid ข้อ 2. V1, V3, V6, V8, V9 -> ตาม condition นี้ก็ต้อง length 6–10 ตัวอักษร ตัวแรกเป็น 0–9 ตัวสุดท้ายเป็น 0–9 เหมือนกัน แล้วตัวที่เหลือเป็นอะไรก็ได้ที่ไม่ใช่ + แล้วก็เป็นคำที่ไม่มีความหมายใน Dictionary ประกอบร่าง test data ข้อ 2 ออกมาได้ดังนี้ “5aaa8www2”
Invalid ข้อ 4. I1, V2, V6, V8, V9 -> ตาม condition นี้ length <6 ตัวแรกเป็น “a-z” ตัวสุดท้ายเป็น “0–9” ตัวที่เหลือไม่ใช่ + และไม่มีความหมายใน dictionary ประกอบร่างออกมาได้ดังนี้ “b2ee5” ซึ่ง อย่างข้อนี้ เวลาเทสเนี่ย expect result ก็ควรจะเป็นแบบว่า software return error message ออกมาให้ user รู้เช่น มี popup ข้อความขึ้นมาบอกว่า “ขอโทษนะจ๊ะคุณผู้ใช้ password ต้องมีขนาดระหว่าง 6–10 ตัวอักษรนะจ๊ะ ช่วย set password ใหม่อีกครั้งนะจ๊ะ”
อธิบายเสริมนิดนึง ว่าการที่เราต้อง test invalid ตัวเดียวในแต่ละข้อเนี่ย เพื่อว่า ในบางกรณีที่ error message หรือ error handling ของ software เป็นแบบ generic เช่น show popup มาว่า “invalid input” แบบเนี้ย ถ้าเราใส่ invalid สองตัวเข้าไปในข้อเดียว เราจะไม่รู้ว่ามันเป็น error handling ของตัวไหนหน่ะนะ
ข้อจำกัดสำคัญของ Equivalent Partition ที่ควรรู้ไว้อีกอย่างคือ Technique นี้ใช้กับ input ที่ independent กันเท่านั้น เช่น password จะยาวเท่าไหร่ก็ไม่มีผลกับ ตัวแรกหรือตัวสุดท้าย เป็น condition ที่มีอิสระต่อกัน ไว้ค่อยเขียน technique ที่ condition dependent กันวันหลัง น่าจะเห็นภาพมากขึ้น
สรุป EP เป็น Technique ที่ช่วยให้เรา optimise number of test case ได้ดีมากเลยหล่ะ Test น้อย coverage เยอะ สามารถนำไปใช้คู่กับ technique อื่นๆได้ด้วยเช่น Boundary Value Analysis (BVA) ที่เจ๋งสุดคือ มันบังคับให้เรานึกถึงสิ่งที่เรียกว่า Negative test ความยากคือ การฝึกคิด condition กับ partition ให้ถูกต้อง เช่น ถ้าต้อง test search box ของ website จองโรงแรมของประเทศญี่ปุ่นเนี่ย Valid partition สามารถแบ่งได้ ระดับ ภูมิภาค หรือย่อย ลงมาจังหวัด หรือย่อยลงมาเขต อันนี้แล้วแต่ requirement ของ product เลยควรจะแบ่ง partition ยังไง ส่วน invalid partition แบบหยาบสุดคือ ชื่อเมืองนอกประเทศญี่ปุ่น ถ้าอยากจะลองแบ่ง invalid partition ซอยย่อยให้มากขึ้นก็อาจจะเป็น ชื่อเมืองนอกญี่ปุ่นในทวีปเอเซีย กับชื่อเมืองนอกญี่ปุ่นในยุโรป บลาๆ
ก่อนถึงบทจบ ให้ลองมโนกันดูนะ ถ้าเราเป็น tester แล้วใช้ technique แบบนี้ โชว์ตาราง EP ให้คนดูแล้วอธิบายได้ด้วยว่ามันมีที่มาที่ไปยังไง แล้วทำไมชั้นถึงมั่นใจในการ test ของชั้น มันจะเจ๋งขนาดไหน
จบจ้า นี่น่าจะเป็น blog ยาวสุดที่เคยเขียนใช้เวลาไปชั่วโมงครึ่ง (พิมพ์จนปวดมือ) ไว้วันหลังลองทำเป็น VDO น่าจะง่ายกว่า ถ้าอ่านแล้วไม่รู้เรื่องก็ขออภัยมา ณ ที่นี้ ถ้างงและมีคำถามก็ไปปิงถามกันในเพจ Doppio Tech ใน link ด้านล่างนี่ได้นาจา ฝากกด like กด ติดตาม กด subscribe ด้วยนาจาาาา
แต่ถ้าอยากเรียนให้หมดทุกอัน เอ้าาา มาทำงานกับเราสิครับ สอนฟรี ฝึกให้ใช้จนเก่งกันทุก technique เลยนาจา ไว้เจอกันใหม่ใน technique หน้าเน้อ

