เทคนิคการทดสอบซอฟต์แวร์พร้อมตัวอย่างการออกแบบกรณีทดสอบ

⚡ สรุปอย่างชาญฉลาด

เทคนิคการทดสอบซอฟต์แวร์ช่วยออกแบบกรณีทดสอบที่ดีขึ้น โดยลดความจำเป็นในการดำเนินการ ขณะเดียวกันก็เพิ่มขอบเขตให้สูงสุด ระบุเงื่อนไขที่ยากจะเข้าใจได้ด้วยวิธีการแบบแมนนวลที่มีโครงสร้าง วิธีการแบบกล่องดำเหล่านี้ เช่น การวิเคราะห์ค่าขอบเขต (Boundary Value Analysis) และการแบ่งส่วนความเท่าเทียม (Equivalence Partitioning) จะจัดลำดับความสำคัญของขอบเขตและการแบ่งส่วนเพื่อการตรวจสอบความถูกต้องอย่างมีประสิทธิภาพ เทคนิคเหล่านี้ช่วยเสริมข้อจำกัดในการทดสอบที่ครอบคลุม โดยนำหลักการพื้นฐานมาใช้เพื่อเพิ่มความน่าเชื่อถือ

  • หลักการสำคัญ: เทคนิคการทดสอบซอฟต์แวร์จะเลือกกรณีทดสอบจากโดเมนอินพุตเพื่อให้ได้การครอบคลุมสูงโดยใช้ความพยายามน้อยที่สุด โดยเน้นที่พื้นที่ที่มีแนวโน้มเกิดข้อผิดพลาด
  • การวิเคราะห์มูลค่าขอบเขต: ขอบเขตการทดสอบ (ค่าต่ำสุด, ค่าสูงสุด, เฉพาะด้านใน/ด้านนอก) เนื่องจากมีข้อผิดพลาดกระจุกตัวอยู่ตรงนั้น เช่น สำหรับอินพุต 1-10 ให้ตรวจสอบ 0,1,2,9,10,11
  • การแบ่งพาร์ติชันที่เท่ากัน: แบ่งอินพุตออกเป็นคลาสที่ถูกต้อง/ไม่ถูกต้อง (เช่น <1, 1-10, 11-19, 20-30, >30) โดยทดสอบตัวแทนหนึ่งรายต่อคลาส
  • การทดสอบตารางการตัดสินใจ: แมปการรวมอินพุตกับเอาต์พุตในตารางสาเหตุ-ผล โดยเปิดใช้งานปุ่มส่งเมื่อกรอกข้อมูลทุกฟิลด์ครบถ้วนเท่านั้น
  • การเปลี่ยนสถานะ: การเปลี่ยนแปลงสถานะลำดับแบบจำลองผ่านอินพุต (เช่น ความพยายามในการเข้าสู่ระบบ: PIN ที่ถูกต้องให้สิทธิ์เข้าถึง; บล็อกบัญชีไม่ถูกต้องสามบล็อก)
  • การเดาผิดพลาด: ใช้ประโยชน์จากประสบการณ์เพื่อกำหนดเป้าหมายข้อบกพร่องที่อาจเกิดขึ้น โดยใช้ข้อมูลในประวัติและข้อผิดพลาดทั่วไปสำหรับกรณีทดสอบเฉพาะกิจ

เทคนิคการทดสอบซอฟต์แวร์

เทคนิคการทดสอบซอฟต์แวร์คืออะไร?

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

  • การวิเคราะห์มูลค่าขอบเขต
  • การแบ่งชั้นความเท่าเทียมกัน
  • การทดสอบตามตารางการตัดสินใจ
  • การเปลี่ยนแปลงของรัฐ
  • เกิดข้อผิดพลาดในการคาดเดา

👉 ลงทะเบียนเข้าร่วมโครงการทดสอบซอฟต์แวร์สดฟรี

หลักการ 7 ประการของเทคนิคการทดสอบซอฟต์แวร์

เทคนิคการทดสอบซอฟต์แวร์ปฏิบัติตามหลักการชุดหนึ่งเพื่อดำเนินกระบวนการทดสอบ หลักการทั้ง 7 ประการนี้จะช่วยแนะนำนักทดสอบในการวางแผน ออกแบบ และดำเนินการทดสอบอย่างมีประสิทธิภาพ หลักการเหล่านี้ช่วยให้มั่นใจได้ว่าการทดสอบจะมีจุดมุ่งหมาย มีประสิทธิภาพ และสอดคล้องกับเป้าหมายของโครงการ

หลักการ 7 ประการของเทคนิคการทดสอบซอฟต์แวร์ ได้แก่ การทดสอบแสดงให้เห็นถึงการมีอยู่ของข้อบกพร่อง การทดสอบอย่างละเอียดเป็นไปไม่ได้ การทดสอบในระยะเริ่มต้นช่วยประหยัดเวลาและต้นทุน ข้อบกพร่อง Clusterความขัดแย้งของยาฆ่าแมลง การทดสอบขึ้นอยู่กับบริบท และความเข้าใจผิดว่าไม่มีข้อผิดพลาด คุณสามารถคลิกตามนี้ ลิงค์ เพื่อเรียนรู้เพิ่มเติม

AI กำลังเปลี่ยนแปลงเทคนิคการทดสอบซอฟต์แวร์แบบดั้งเดิมอย่างไร

AI กำลังปฏิวัติการทดสอบซอฟต์แวร์ด้วยการแนะนำ ระบบอัตโนมัติ การคาดการณ์ และความสามารถในการปรับตัว มันเปิดใช้งาน การสร้างกรณีทดสอบอัตโนมัติ จากภาษาธรรมชาติโดยใช้ LLMs สคริปต์การรักษาตัวเอง ที่ปรับให้เข้ากับการเปลี่ยนแปลง UI และ การวิเคราะห์ข้อบกพร่องเชิงคาดการณ์ โดยอิงจากข้อมูลในอดีต AI ยังรองรับ การจัดลำดับความสำคัญตามความเสี่ยง การทดสอบภาพ และ การดำเนินการทดสอบแบบอัตโนมัติ ภายในท่อ CI/CD ผ่าน อินเทอร์เฟซภาษาธรรมชาติ นักทดสอบสามารถสร้างเคสแบบสนทนาได้ ซึ่งจะช่วยเร่งกระบวนการทำงานให้เร็วขึ้น โดยพื้นฐานแล้ว AI ช่วยให้การทดสอบ ฉลาดกว่า เร็วกว่า และยืดหยุ่นกว่า ลดความพยายามด้วยตนเองพร้อมทั้งปรับปรุงความแม่นยำและการครอบคลุมในแอปพลิเคชันที่ทันสมัยและมีการเปลี่ยนแปลงอยู่ตลอดเวลา

เทคนิคการทดสอบซอฟต์แวร์

การวิเคราะห์มูลค่าขอบเขต (BVA)

การวิเคราะห์ค่าขอบเขต (Boundary Value Analysis) อาศัยการทดสอบที่ขอบเขตระหว่างพาร์ติชัน ซึ่งประกอบด้วยค่าสูงสุด ค่าต่ำสุด ค่าภายในหรือภายนอกขอบเขต ค่าทั่วไป และค่าความคลาดเคลื่อน

หลักฐานเชิงประจักษ์แสดงให้เห็นว่าข้อบกพร่องจำนวนมากเกิดขึ้นใกล้กับเงื่อนไขขอบเขต มากกว่าค่าช่วงกลาง ข้อบกพร่องนี้รู้จักกันในชื่อ BVA และให้กรณีทดสอบที่เลือกไว้ซึ่งใช้ค่าขอบเขต

เทคนิคการทดสอบแบบกล่องดำนี้ช่วยเสริมการแบ่งพาร์ติชันแบบเท่าเทียม (Equivalence Partitioning) โดยมุ่งเน้นไปที่กรณีขอบ (edge ​​case) ของช่วงอินพุตเดียวกัน เทคนิคการทดสอบซอฟต์แวร์นี้ยึดหลักการที่ว่า หากระบบทำงานได้อย่างถูกต้องสำหรับค่าขอบเขต ก็มีแนวโน้มที่จะทำงานได้กับค่าทั้งหมดภายในช่วงนั้น

แนวทางการวิเคราะห์ค่าขอบเขต

  • หากเงื่อนไขอินพุตถูกจำกัดไว้ระหว่างค่า x และ y ดังนั้นควรออกแบบเคสทดสอบโดยใช้ค่า x และ y รวมถึงค่าที่อยู่เหนือและใต้ x และ y
  • หากเงื่อนไขอินพุตมีค่าจำนวนมาก ควรพัฒนากรณีทดสอบเพื่อใช้ค่าต่ำสุดและค่าสูงสุด ในกรณีนี้ ค่าที่สูงกว่าและต่ำกว่าค่าต่ำสุดและค่าสูงสุดก็จะถูกทดสอบด้วย
  • ใช้แนวทาง 1 และ 2 กับเงื่อนไขผลลัพธ์ ซึ่งจะให้ผลลัพธ์ที่สะท้อนค่าต่ำสุดและค่าสูงสุดที่คาดหวัง นอกจากนี้ยังทดสอบค่าที่ต่ำกว่าหรือสูงกว่าค่าที่กำหนดอีกด้วย

ตัวอย่าง:

Input condition is valid between 1 to 10

Boundary values 0,1,2 and 9,10,11

การแบ่งชั้นความเท่าเทียมกัน

การแบ่งพาร์ติชันคลาสความเท่าเทียม (Equivalence Class Partitioning) จะแบ่งชุดเงื่อนไขอินพุตออกเป็นกลุ่มที่คาดว่าจะทำให้เกิดพฤติกรรมที่คล้ายคลึงกัน วิธีการทดสอบซอฟต์แวร์นี้จะแบ่งโดเมนอินพุตของโปรแกรมออกเป็นคลาสข้อมูลที่ควรออกแบบกรณีทดสอบ

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

ตัวอย่าง:

เงื่อนไขอินพุตถูกต้องระหว่าง

 1 to 10 and 20 to 30

ดังนั้นจึงมีคลาสความเท่าเทียมกันห้าคลาส

--- to 0 (invalid)
1 to 10 (valid)
11 to 19 (invalid)
20 to 30 (valid)
31 to --- (invalid)

คุณเลือกค่าจากแต่ละคลาส เช่น

-2, 3, 15, 25, 45

อ่านเพิ่มเติมเกี่ยวกับ – การวิเคราะห์ค่าขอบเขตและการทดสอบการแบ่งส่วนความเท่าเทียมกัน

การทดสอบตามตารางการตัดสินใจ

ตารางการตัดสินใจ หรือที่รู้จักกันในชื่อตารางสาเหตุ-ผล เทคนิคการทดสอบซอฟต์แวร์นี้ใช้สำหรับฟังก์ชันที่ตอบสนองต่อข้อมูลอินพุตหรือเหตุการณ์ต่างๆ ร่วมกัน ตัวอย่างเช่น ในสถานการณ์การตรวจสอบความถูกต้องของแบบฟอร์ม ปุ่ม "ส่ง" จะทำงานหลังจากกรอกข้อมูลที่จำเป็นครบถ้วนแล้วเท่านั้น

งานแรกคือการระบุฟังก์ชันการทำงานที่ผลลัพธ์ขึ้นอยู่กับชุดข้อมูลอินพุตรวมกัน หากมีชุดข้อมูลอินพุตรวมกันจำนวนมาก ให้แบ่งชุดข้อมูลนั้นออกเป็นกลุ่มย่อยที่เล็กลง ซึ่งจะเป็นประโยชน์ในการจัดการตารางการตัดสินใจ

สำหรับทุกฟังก์ชัน คุณต้องสร้างตารางและแสดงรายการชุดค่าผสมของอินพุตและเอาต์พุตที่เกี่ยวข้องทั้งหมด วิธีนี้จะช่วยระบุเงื่อนไขที่ผู้ทดสอบมองข้าม

ต่อไปนี้เป็นขั้นตอนในการสร้างตารางการตัดสินใจ:

  • เกณฑ์อินพุตเป็นแถว
  • ป้อนกฎทั้งหมดในคอลัมน์
  • เติมตารางด้วยการผสมผสานอินพุตที่แตกต่างกัน
  • ในแถวสุดท้าย ให้จดบันทึกเอาต์พุตเทียบกับชุดอินพุต

ตัวอย่าง:ปุ่มส่งในแบบฟอร์มติดต่อจะเปิดใช้งานเมื่อผู้ใช้ป้อนข้อมูลทั้งหมดแล้วเท่านั้น

การทดสอบตามตารางการตัดสินใจ

การเปลี่ยนแปลงของรัฐ

ในเทคนิคการเปลี่ยนสถานะ การเปลี่ยนแปลงเงื่อนไขอินพุตจะเปลี่ยนสถานะของแอปพลิเคชันที่กำลังทดสอบ (AUT) เทคนิคการทดสอบนี้ช่วยให้ผู้ทดสอบสามารถทดสอบพฤติกรรมของ AUT ได้ ผู้ทดสอบสามารถดำเนินการนี้ได้โดยป้อนเงื่อนไขอินพุตต่างๆ ตามลำดับ ในเทคนิคการเปลี่ยนสถานะ ทีมทดสอบจะให้ค่าทดสอบอินพุตทั้งบวกและลบเพื่อประเมินพฤติกรรมของระบบ

แนวปฏิบัติสำหรับการเปลี่ยนสถานะ:

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

ตัวอย่าง:

ในตัวอย่างต่อไปนี้ ผู้ใช้สามารถเข้าสู่ระบบได้สำเร็จเมื่อป้อนรหัสผ่านที่ถูกต้องภายในสามครั้ง หากผู้ใช้ป้อนรหัสผ่านไม่ถูกต้องในครั้งแรกหรือครั้งที่สอง ระบบจะแจ้งให้ผู้ใช้ป้อนรหัสผ่านอีกครั้ง หากผู้ใช้ป้อนรหัสผ่านไม่ถูกต้อง 3 ครั้งrd เมื่อดำเนินการเสร็จสิ้นบัญชีจะถูกบล็อค

แผนภาพการเปลี่ยนสถานะ

แผนภาพการเปลี่ยนสถานะ

ในแผนภาพนี้ เมื่อผู้ใช้ระบุหมายเลข PIN ที่ถูกต้อง ผู้ใช้จะถูกย้ายไปยังสถานะที่ได้รับสิทธิ์การเข้าถึง ตารางต่อไปนี้สร้างขึ้นจากแผนภาพด้านบน

ตารางการเปลี่ยนสถานะ

รหัส PIN ที่ถูกต้อง PIN ไม่ถูกต้อง
S1) เริ่มต้น S5 S2
ส2) 1st ความพยายาม S5 S3
ส3) 2nd ความพยายาม S5 S4
ส4) 3rd ความพยายาม S5 S6
S5) ให้สิทธิ์การเข้าถึงแล้ว - -
S6) บัญชีถูกบล็อก - -

ในตารางข้างต้น เมื่อผู้ใช้ป้อนรหัส PIN ที่ถูกต้อง สถานะจะเปลี่ยนเป็น "สิทธิ์การเข้าถึง" และหากผู้ใช้ป้อนรหัสผ่านไม่ถูกต้อง ผู้ใช้จะถูกย้ายไปยังสถานะถัดไป หากผู้ใช้ทำแบบเดียวกัน 3rd เวลาเขาจะเข้าสู่สถานะถูกบล็อกบัญชี

เกิดข้อผิดพลาดในการคาดเดา

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

เทคนิคนี้จะนับรายการข้อผิดพลาดที่อาจเกิดขึ้นหรือสถานการณ์ที่มีแนวโน้มเกิดข้อผิดพลาด จากนั้นผู้ทดสอบจะเขียน กรณีทดสอบ เพื่อเปิดเผยข้อผิดพลาดเหล่านั้น ในการออกแบบกรณีทดสอบโดยอิงตามเทคนิคการทดสอบซอฟต์แวร์นี้ นักวิเคราะห์สามารถใช้ประสบการณ์ที่ผ่านมาเพื่อระบุเงื่อนไขต่างๆ ได้

แนวทางการคาดเดาข้อผิดพลาด:

  • การทดสอบควรใช้ประสบการณ์ก่อนหน้าในการทดสอบแอปพลิเคชันที่คล้ายกัน
  • ความเข้าใจในระบบที่ทดสอบ
  • ความรู้เกี่ยวกับข้อผิดพลาดในการใช้งานทั่วไป
  • จำพื้นที่ที่มีปัญหาก่อนหน้านี้
  • ประเมินข้อมูลประวัติและผลการทดสอบ

ข้อดีและข้อจำกัดของเทคนิคการทดสอบ

ข้อดี:

  • ปรับปรุงการครอบคลุมการทดสอบและรับรองการตรวจสอบการทำงานของซอฟต์แวร์ที่กว้างขึ้น
  • เพิ่มประสิทธิภาพการตรวจจับข้อบกพร่องโดยกำหนดเป้าหมายไปที่พื้นที่ที่มีความเสี่ยงสูงหรือมีแนวโน้มเกิดข้อผิดพลาด
  • Promoการออกแบบการทดสอบอย่างเป็นระบบ ช่วยลดความซ้ำซ้อนและการทับซ้อน
  • ช่วยระบุปัญหาในระยะเริ่มต้นของ SDLC ซึ่งจะช่วยลดต้นทุนโครงการโดยรวม
  • ลดความซับซ้อนของการทดสอบด้วยวิธีการเช่น BVA และ Equivalence Partitioning
  • เพิ่มความน่าเชื่อถือของซอฟต์แวร์และความเชื่อมั่นของผู้มีส่วนได้ส่วนเสียต่อคุณภาพผลิตภัณฑ์

ข้อ จำกัด :

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

จะเลือกเทคนิคการทดสอบอย่างไรให้เหมาะสม?

การเลือกเทคนิคการทดสอบซอฟต์แวร์ที่เหมาะสมต้องสอดคล้องกับรายละเอียดเฉพาะของโครงการเพื่อให้มั่นใจถึงประสิทธิภาพและความครอบคลุม ปัจจัยต่างๆ เช่น รูปแบบการพัฒนา ความเสี่ยง และทรัพยากร ล้วนเป็นแนวทางในการเลือกสรร ในฐานะผู้เชี่ยวชาญด้านการทดสอบซอฟต์แวร์ ผมจึงแนะนำให้ผสมผสานเทคนิคต่างๆ เข้าด้วยกันเพื่อผลลัพธ์ที่ดีที่สุด วิธีนี้จะช่วยป้องกันไม่ให้เกิดการพึ่งพาวิธีการเดียวมากเกินไป

  • สอดคล้องกับวัตถุประสงค์: จับคู่เทคนิคกับเป้าหมาย เช่น ฟังก์ชัน ประสิทธิภาพการทำงาน หรือความต้องการด้านความปลอดภัย
  • ประเมินความเสี่ยง: ให้ความสำคัญกับพื้นที่ที่มีความเสี่ยงสูงด้วยวิธีการตามความเสี่ยงเพื่อการตรวจสอบที่ตรงเป้าหมาย
  • เหมาะกับสถาปัตยกรรมและโมเดล: เลือกใช้แนวทางที่เป็นมิตรต่อความคล่องตัวในระบบแบบวนซ้ำหรือแบบหลายชั้น
  • ข้อจำกัดความสมดุล: พิจารณาเวลา งบประมาณ ทักษะ และเครื่องมือสำหรับการดำเนินการที่เป็นไปได้

คำถามที่พบบ่อย

เทคนิคการทดสอบซอฟต์แวร์เป็นวิธีการที่มีโครงสร้างสำหรับตรวจสอบว่าซอฟต์แวร์ตรงตามข้อกำหนดและทำงานได้อย่างถูกต้อง เทคนิคทั่วไป ได้แก่ การวิเคราะห์ค่าขอบเขต การแบ่งพาร์ติชันคลาสความเท่าเทียม การทดสอบตามตารางการตัดสินใจ การเปลี่ยนสถานะ และการคาดเดาข้อผิดพลาด ซึ่งแต่ละเทคนิคจะมุ่งเน้นไปที่ลักษณะการทำงานและตรรกะของโค้ดที่แตกต่างกัน

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

Generative AI แนะนำสถานการณ์สำรวจที่มีผลกระทบสูงโดยจำลองการโต้ตอบของผู้ใช้ที่หลากหลายและใช้ประโยชน์จากข้อมูลข้อบกพร่องในอดีต จึงเปิดเผยข้อบกพร่องด้านการใช้งานและการรวมระบบที่พลาดไปจากการทดสอบสคริปต์

เทคนิคการประกันคุณภาพประกอบด้วยการตรวจสอบโค้ด การเขียนโปรแกรมแบบคู่ การวิเคราะห์แบบคงที่ การทดสอบการถดถอย และการเปรียบเทียบประสิทธิภาพ วิธีการเหล่านี้ช่วยรักษาความสอดคล้อง ตรวจจับความเบี่ยงเบนได้ตั้งแต่เนิ่นๆ และรับรองการปฏิบัติตามมาตรฐานคุณภาพที่กำหนดไว้

การทดสอบอัตโนมัติช่วยเร่งกระบวนการทดสอบ เพิ่มความครอบคลุม และลดข้อผิดพลาดของมนุษย์ ช่วยให้สามารถบูรณาการและส่งมอบข้อมูลได้อย่างต่อเนื่อง ด้วยการทดสอบที่ทำซ้ำได้และปรับขนาดได้อย่างมีประสิทธิภาพในสภาพแวดล้อมและแพลตฟอร์มที่หลากหลาย

สรุปโพสต์นี้ด้วย: