การทดสอบคืออะไร

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

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

ตัวอย่างบางส่วนของลักษณะการทำงานบนเว็บที่คุณอาจต้องการทดสอบมีดังนี้

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

การทดสอบอัตโนมัติเทียบกับการทดสอบด้วยตนเอง

คุณสามารถทดสอบซอฟต์แวร์ได้ 2 วิธีทั่วไป ได้แก่ การทดสอบอัตโนมัติและการทดสอบด้วยตนเอง การทดสอบ

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

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

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

ข้อมูลพื้นฐานเกี่ยวกับตัวอย่าง

สำหรับเราในฐานะนักพัฒนาเว็บที่เขียน JavaScript หรือภาษาที่เกี่ยวข้อง กระชับ การทดสอบอัตโนมัติอาจเป็นสคริปต์คล้ายๆ กันนี้ ซึ่งคุณเรียกใช้ทุกวัน ผ่านโหนด หรือโหลดในเบราว์เซอร์

import { fibonacci } from "../src/math.js";

if (fibonacci(0) !== 0) {
  throw new Error("Invalid 0th fibonacci result");
}
const fib13 = fibonacci(13);
if (fib13 !== 233) {
  throw new Error("Invalid 13th fibonacci result, was=${fib13} wanted=233");
}

นี่คือตัวอย่างง่ายๆ ที่ให้ข้อมูลเชิงลึกต่อไปนี้

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

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

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

การทดสอบไลบรารีในทางปฏิบัติ

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

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

import { fibonacci } from "../src/math.js";
import { assert } from "a-made-up-testing-library";

assert.equal(fibonacci(0), 0, "Invalid 0th fibonacci result");
assert.equal(fibonacci(13), 233, "Invalid 13th fibonacci result");

คุณสามารถปรับปรุงการทดสอบนี้เพิ่มเติมได้ โดยกำหนด การทดสอบ อิสระ (ไม่บังคับ) จัดกลุ่มเป็นห้องสวีท ชุดโปรแกรมต่อไปนี้ทดสอบ Fibonacci แบบอิสระ และฟังก์ชันภาษาคาตาลัน

import { fibonacci, catalan } from "../src/math.js";
import { assert, test, suite } from "a-made-up-testing-library";

suite("math tests", () => {
  test("fibonacci function", () => {
    assert.equal(fibonacci(0), 0, "Invalid 0th fibonacci result");
    assert.equal(fibonacci(13), 233, "Invalid 13th fibonacci result");
  });
  test("relationship between sequences", () => {
    const numberToCheck = 4;
    const fib = fibonacci(numberToCheck);
    const cat = catalan(numberToCheck);
    assert.isAbove(fib, cat);
  });
});

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

การทดสอบที่มีชื่อเป็นรายบุคคลมีประโยชน์สำหรับงานต่อไปนี้ รวมถึงการทำงานอื่นๆ ด้วย

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

วิธีหนึ่งในการมองกรอบการทดสอบคือการใช้ "หลัก 3 ประการ" ของการทดสอบ 1 หน่วย: จัดเรียง ดำเนินการ และยืนยัน แก่นแท้ของกรอบการทดสอบแต่ละกรณีจะ

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

ระดับของการทดสอบ

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

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

ขนาดของการทดสอบเดี่ยวสามารถวางการทดสอบภายในแนวคิดที่มักอ้างอิงถึง "พีระมิดทดสอบ" ซึ่งอาจจะเป็นกฎทั่วไปที่ดีในการทดสอบ ตรวจสอบและวิธีทำงาน

วันที่ พีระมิดที่ใช้ทดสอบ
    โดยมีการทดสอบจากต้นทางถึงปลายทาง (E2E) ที่ด้านบนสุด การทดสอบการผสานรวมที่ช่วงกลาง และ
    หน่วยโฆษณาที่ด้านล่าง
พีระมิดที่ใช้ทดสอบ

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

เราจะขยายประเภทเหล่านี้ไปยังประเภทการทํางานอัตโนมัติ การทดสอบ

ตรวจสอบความเข้าใจ

ไลบรารีและเฟรมเวิร์กการทดสอบส่วนใหญ่มีปัจจัยพื้นฐานใดบ้าง

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