Testing strategies - SilverSky9/DevToolNo1 GitHub Wiki

# Unit test

Unit test คืออะไร

Unit testing เป็นวิธีการทดสอบการทำงานของซอฟแวร์ในแต่ละหน่วยในส่วนของ code ที่เล็กที่สุดใน application ที่สามารถทดสอบได้โดยตรวจสอบ behavior และ functionality ของ code ว่าทำงานได้อย่างถูกต้องหรือไม่ ใช้วิธีการทดสอบแบบ White Box Testing โดยถ้าเขียนซอฟแวร์ในรูปแบบเชิงวัตถุ (Object-Oriented Software) หน่วยที่ทดสอบอาจจะเป็น method function หรือ module ก็ได้ โดยทั่วไปการทำงานของหน่วยที่นำมาทดสอบจะมีการรับค่าเข้าไปเพื่อประมวลผลแล้วส่งผลลัพท์ออกมา และจะตรวจสอบกระบวนการดังกล่าวว่าเป็นไปตามที่ออกแบบไว้หรือไม่

เทคนิคการทำ Unit testing

  • ควรทำเป็นลำดับแรกของการทดสอบและจะดำเนินการก่อนที่จะไปขั้นตอน Integration testing
  • หาเครื่องมือ หรือ Framework สำหรับภาษาที่พัฒนา
  • ไม่จำเป็นต้องสร้าง Unit testing ทุกหน่วย แต่มุ่งเน้นส่วนที่มีผลกระทบต่อระบบ
  • ใช้ข้อมูลทดสอบที่มีความใกล้เคียงกับการใช้งานจริง
  • ครอบคลุมทุกเส้นทางการทำงานส่วนที่เป็นเงื่อนไขและวนลูป
  • ดำเนินการอย่างต่อเนื่องและสม่ำเสมอ
  • ควรเขียน test จะแยกออกเป็นอิสระจากตัว code จริงๆ
  • การเขียน unit tests ที่ดี แต่ละ test cases ต้องทำงานอย่างเป็นอิสระและการทำงานของแต่ละ test cases ต้องไม่ขึ้นอยู่กับลำดับในการ run ของ test cases

การเขียน Unit testing ที่ผิดวิธี

  • การเขียน Unit Test ที่ต่อ Database
  • การเขียน Unit Test ที่ต้องติดต่อกับ service อื่น
  • การเขียน Unit Test ที่ต้อง start web server กรณีที่เราพัฒนาเว็บไซต์
  • ประกอบ object ให้กับ class อื่นที่ไม่ใช่ class ที่กำลังเทส เช่น เราจะเทส class A แต่ class A ต้องการ class B และ class B ก็ต้องการ class C เราจึงต้องประกอบ class A, B และ C เข้าด้วยกัน

ประโยชน์ของ Unit testing

  • ช่วยค้นหาและลด Bug หรือ Defect ที่จะก่อให้เกิดปัญหาลง
  • เพิ่มความมั่นใจปรับหรือแก้ไขโค้ด หากทำ Unit testing ไว้ดีข้อผิดพลาดที่เกิดจากการแก้ไขโค้ดจะถูกดักจับได้ทันที
  • พัฒนาซอฟแวร์ได้เร็วขึ้น ถ้าคิดในระยะยาวการทำ Unit testing จะดีกว่า
  • เป็นคู่มือทำให้ทราบการทำงานของแต่ละส่วน ต้องใส่ข้อมูลอะไรเข้าไปและจะออกมาเป็นอะไร
  • เพิ่มความน่าเชื่อถือและคุณภาพให้กับซอฟแวร์
  • Program ทำงานได้ตรงตาม Requirement ของลูกค้ามากยิ่งขึ้น
    ผู้ที่มีหน้าที่ทำ Unit test Developer / Programmer หรือ นักพัฒนา Software

เครื่องมือที่ใช้

  • NUnit
  • JMockit
  • Emma
  • Quilt HTTP
  • HtmlUnit
  • Embunit
  • SimpleTest
  • ABAP Unit
  • Typemock -LDRA
  • Microsoft unit testing Framework
  • Unity Test Tools
  • Cantata
  • Karma
  • Jasmine
  • Mocha
  • Parasoft
  • JUnit
  • TestNG
  • JTest

Integration test

Integration Testing คืออะไร

เป็นการทดสอบการทำงานของ Module โปรแกรมทั้งหมดหรือฟังก์ชันต่างๆ ที่สัมพันธ์กันภายในระบบย่อยของโปรแกรม โดยทำการทดสอบในแต่ละ Function/Module ว่าสามารถทำงานได้หรือไม่ มีผลกระทบอะไรหรือไม่ ในส่วนนี้จะใช้วิธีการทดสอบที่หลายหลายวิธีในการทดสอบ โดยทดสอบว่าสามารถไปเชื่อมต่อกับ Network, Database, Other Service หรือ Party ได้สมบูรณ์หรือไม่

ประโยชน์ของ Integration Testing

รูปแบบการ test ใกล้เคียงกับการทำงานจริงๆของระบบ ทำให้มั่นใจได้ว่า application ของเราทำงานได้อย่างถูกต้อง

ข้อเสียของ Integration Testing

ทำงานได้ช้ากว่า unit testing หลายเท่า และยังยุ่งยากในการหา errors และสุดท้ายความเปราะบางและพังง่ายและยากต่อการ maintenance อีกด้วย เมื่อส่วนไหนพัง จะไม่สามารถระบุได้แน่นอน เพราะเป็นการทดสอบที่เกี่ยวข้องกับหลายระบบ

ผู้ที่มีหน้าที่ทำ Integration Testing

ผู้ที่ทำคือ Tester

เครื่องมือที่ใช้

Component test

  • VectorCAST/C++
  • VectorCAST/Ada
  • Citrus Integration Testing
  • LDRA
  • SMART INTEGRATION TEST ACCELERATOR (SITA)
  • FitNesse
  • Rational Integration Tester
  • Protractor
  • TESSY
  • Validate MSG
  • Steam
  • Jasmine
  • eZscript
  • Spock for JAVA
  • Pioneerjs

Component test

Component Testing คืออะไร?

ในการพัฒนา Web Application ในปัจจุบันส่วนใหญ่นักพัฒนาก็มักจะนิยมนำแนวคิดของการสร้าง “Web Components” มาใช้ในการพัฒนาเป็นส่วนใหญ่ และรวมถึง Web Frameworks ต่างๆที่มีความนิยมในปัจจุบันซึ่งได้มีการนำแนวคิดนี้มาใส่อยู่ด้วยเช่นกัน เนื่องจากเราจะสามารถ reuse components ได้ ดังนั้น Components testing ก็คือการทดสอบแต่ละ Component ที่สร้างขึ้นมานั่นเอง

เครื่องมือที่ใช้ช่วยในการทดสอบ

  • jsdom
  • Cypress
  • Node.js testing framework
    • jest
    • mocha

Contract test

Contract Testing คืออะไร?

การทดสอบในส่วนที่มีการต่อไปยัง external service หรือ Component อื่นๆ เพื่อทำการตรวจสอบ และ ทำให้มั่นใจว่า ส่วนที่เชื่อมต่อกันมันยังทำงานด้วยกันได้

เครื่องมือที่ใช้ช่วยในการทดสอบ

  • Pact
  • Pacto
  • Janus
  • Stubby

End-to-end test

e2e(End-to-end) Tests หรือบางทีก็รู้จักในชื่อ UI Tests เป็นวิธีในการทดสอบโปรแกรมตั้งแต่ต้นจนจบ flow เพื่อดูว่าส่วนประกอบต่างๆ ที่เชื่อมต่อกันนั้นสามารถทำงานร่วมกันได้ดีหรือไม่

เทคนิคการทำ

สามารถทำแบบ manual ก็ได้ แต่ก็มีเครื่องมือที่สามารถช่วยทดสอบแบบอัตโนมัติ

เครื่องมือที่ใช้ช่วยในการทดสอบ

  • Selenium
  • PhantomJS
  • Protractor
  • Cypress
  • Avo Assure
  • testRigor

ผู้ที่มีหน้าที่ทำ e2e(End-to-end) Tests

Enduser หรือ Developers, Testers

ประโยชน์ของการทดสอบ e2e(End-to-end) Tests

  • ตรวจสอบความถูกต้องของการทำงาน
  • ลดต้นทุน
  • ลดการเกิดบัค
  • ตรวจสอบการทำงานของ Flow

End-to-End Testing Lifecycle

  • Test planning : ระบุงานหลัก กำหนดการที่เกี่ยวข้อง และ resources
  • Test design : Test specifications, การสร้าง Test cases, การวิเคราะห์ความเสี่ยง, วิเคราะห์การใช้งาน, การกำหนดเวลา
  • Test execution : ทำการทดสอบด้วย Test cases และบันทึกผลการทดสอบลงเอกสาร
  • Results analysis : วิเคราะห์ผลการทดสอบ, ประเมินการทดสอบ และดำเนินการทดสอบเพิ่มเติมหากจำเป็น
⚠️ **GitHub.com Fallback** ⚠️