เมื่อเขียนซอฟต์แวร์ คุณตรวจสอบได้ว่าซอฟต์แวร์ทำงานได้อย่างถูกต้องผ่านการทดสอบ การทดสอบสามารถอธิบายอย่างกว้างๆ ได้ว่าเป็นกระบวนการของการเรียกใช้ซอฟต์แวร์ใน วิธีที่จะทำให้โฆษณาทำงานตามที่ควรจะเป็น
การทดสอบที่ประสบความสำเร็จจะทำให้คุณมั่นใจว่า เมื่อคุณเพิ่มโค้ดใหม่ คุณลักษณะ หรือ แม้กระทั่งอัปเกรดทรัพยากร 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 หน่วยแล้ว ตัวอย่างบางส่วนของการทดสอบประเภทอื่นๆ ได้แก่ คอมโพเนนต์ การทดสอบ การทดสอบภาพ และการทดสอบการผสานรวม ไม่มีชื่อเหล่านี้ ที่มีความเข้มงวดมากที่สุด และอาจมีความหมายแตกต่างกันโดยขึ้นอยู่กับ ฐานของโค้ด ดังนั้น อย่าลืมใช้โค้ดเหล่านั้นเป็นแนวทางและคิดหาคำจำกัดความ ที่ทำงานให้คุณ ตัวอย่างเช่น คอมโพเนนต์ที่อยู่ระหว่างการทดสอบในระบบคืออะไร สำหรับ รีแอ็กชันนักพัฒนาซอฟต์แวร์ ซึ่งอาจจับคู่กับ "คอมโพเนนต์รีแอ็กชัน" ตรงตัว แต่อาจ มีความหมายที่ต่างจากนักพัฒนาซอฟต์แวร์ในบริบทอื่นๆ
ขนาดของการทดสอบเดี่ยวสามารถวางการทดสอบภายในแนวคิดที่มักอ้างอิงถึง "พีระมิดทดสอบ" ซึ่งอาจจะเป็นกฎทั่วไปที่ดีในการทดสอบ ตรวจสอบและวิธีทำงาน
ความคิดนี้ได้รับการทำซ้ำ และรูปร่างอื่นๆ มากมายได้ถูกพัฒนา เป็นที่นิยม เช่น เพชรทดสอบ หรือ กำลังทดสอบน้ำแข็ง ลำดับความสำคัญในการเขียนทดสอบของคุณจะเป็นเอกลักษณ์เฉพาะสำหรับ ฐานของโค้ด อย่างไรก็ตาม ฟีเจอร์ทั่วไปคือการทดสอบที่ง่ายกว่า เช่น การทดสอบ 1 หน่วย มีแนวโน้มที่จะเรียกใช้ได้เร็วกว่าและเขียนง่ายขึ้น (คุณจึงจะมีเส้นเหล่านี้เพิ่มขึ้น) และ ทดสอบในขอบเขตที่จำกัด ในขณะที่การทดสอบที่ซับซ้อน เช่น การทดสอบแบบเอนด์ทูเอนด์ เขียนยาก แต่สามารถทดสอบขอบเขตได้กว้างกว่า อันที่จริงแล้ว ชั้นบนสุดจาก ทดสอบ "รูปร่าง" มักจะเป็นการทดสอบด้วยตนเอง เพราะการโต้ตอบของผู้ใช้ ซับซ้อนเกินกว่าจะจัดรหัสให้เป็นการทดสอบอัตโนมัติได้
เราจะขยายประเภทเหล่านี้ไปยังประเภทการทํางานอัตโนมัติ การทดสอบ
ตรวจสอบความเข้าใจ
ไลบรารีและเฟรมเวิร์กการทดสอบส่วนใหญ่มีปัจจัยพื้นฐานใดบ้าง
assert()
และรูปแบบต่างๆ ของรูปแบบมีแนวโน้มที่จะรวมอยู่ในผลการค้นหา เนื่องจากทำให้การตรวจสอบง่ายขึ้น
เพื่อเขียนtest()
รวมอยู่ในการทดสอบเกือบทั้งหมด
นักวิ่ง มีความสำคัญเนื่องจากโค้ดทดสอบไม่ทำงานที่ระดับบนสุด
ซึ่งทำให้ผู้ดำเนินการทดสอบถือว่าแต่ละกรอบการทดสอบเป็น
หน่วยอิสระ