บล็อก describe และ it
จัดโครงสร้างชุดการทดสอบ
บล็อก describe และ it เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
โครงสร้างของข้อกำหนดการทดสอบ
busted จัดระเบียบการทดสอบด้วยฟังก์ชันหลักสองอย่าง ได้แก่ describe และ it บล็อก describe ใช้จัดกลุ่มการทดสอบที่เกี่ยวข้องกัน ส่วนบล็อก it แต่ละบล็อกคือกรณีทดสอบหนึ่งกรณี
โครงสร้างนี้มาจากการพัฒนาที่ขับเคลื่อนด้วยพฤติกรรม และอ่านได้เหมือนภาษาเขียนทั่วไป
describe("Stack", function()
it("starts empty", function()
assert.are.equal(0, Stack.new():size())
end)
end)บล็อก describe
describe รับสตริงชื่อและฟังก์ชัน ชื่อควรระบุหน่วยหรือคุณลักษณะที่กำลังทดสอบ เช่น โมดูลหรือคลาส
ทุกสิ่งภายในฟังก์ชันจะอยู่ในกลุ่มนั้น ชื่อจะแสดงในผลลัพธ์การทดสอบเพื่อจัดระเบียบผลลัพธ์
describe("calculator", function()
-- tests live here
end)บล็อก it
บล็อก it แต่ละบล็อกอธิบายพฤติกรรมเฉพาะอย่างหนึ่ง สตริงควรเติมประโยคที่เริ่มต้นด้วย describe ให้สมบูรณ์
เมื่ออ่านร่วมกัน "เครื่องคำนวณ" กับ "บวกตัวเลขสองจำนวน" จะกลายเป็นข้อกำหนดเจตนาที่ชัดเจน
describe("calculator", function()
it("adds two numbers", function()
assert.are.equal(5, calc.add(2, 3))
end)
end)การซ้อนบล็อก describe
คุณสามารถซ้อนบล็อก describe เพื่อแสดงบริบทได้ บล็อกด้านในอาจอธิบายเมธอดเฉพาะหรือเงื่อนไขพิเศษ
การซ้อนบล็อกช่วยให้กรณีที่เกี่ยวข้องกันอยู่รวมกัน และสร้างผลลัพธ์ที่อ่านง่ายโดยเยื้องบรรทัด
describe("List", function()
describe("push", function()
it("adds an item", function()
assert.are.equal(1, list:push("a"):size())
end)
end)
end)การเตรียมการด้วย before_each
before_each จะเรียกใช้ฟังก์ชันก่อน it ทุกบล็อกภายในบล็อกของมัน ใช้สร้างข้อมูลการทดสอบใหม่เพื่อไม่ให้การทดสอบใช้สถานะร่วมกัน
วิธีนี้ทำให้การทดสอบแต่ละครั้งแยกเป็นอิสระ การเปลี่ยนแปลงในการทดสอบหนึ่งครั้งจะไม่รั่วไหลไปยังครั้งถัดไป
describe("Stack", function()
local s
before_each(function()
s = Stack.new()
end)
it("pushes", function()
s:push(1)
assert.are.equal(1, s:size())
end)
end)การเก็บกวาดด้วย after_each
after_each จะทำงานหลังการทดสอบแต่ละครั้ง ใช้ล้างทรัพยากร เช่น ไฟล์ชั่วคราว การเชื่อมต่อที่เปิดอยู่ หรือสถานะส่วนกลาง
การจับคู่การเตรียมการกับการเก็บกวาดช่วยให้สภาพแวดล้อมถูกรีเซ็ตระหว่างการทดสอบ
after_each(function()
os.remove("temp.db")
end)การเตรียมการและการเก็บกวาด
busted ยังมี setup และ teardown ซึ่งทำงานครั้งเดียวต่อบล็อก describe แทนที่จะทำงานครั้งเดียวต่อการทดสอบ
ใช้สิ่งเหล่านี้กับงานที่ใช้เวลามากและทำเพียงครั้งเดียว เช่น การเปิดการเชื่อมต่อร่วม เมื่อการเตรียมการต่อการทดสอบจะสิ้นเปลืองเกินไป
describe("db", function()
setup(function()
db = connect()
end)
teardown(function()
db:close()
end)
end)การทดสอบที่รอดำเนินการ
บางครั้งคุณต้องการจดบันทึกการทดสอบที่ยังไม่ได้เขียน ให้เรียกใช้ pending พร้อมคำอธิบาย หรือเขียนบล็อก it โดยไม่ใส่ฟังก์ชัน
busted จะรายงานการทดสอบเหล่านี้ว่าอยู่ระหว่างรอดำเนินการ แทนที่จะรายงานว่าผ่านหรือล้มเหลว เพื่อเตือนให้คุณทำให้เสร็จ
it("handles unicode", function()
pending("not implemented yet")
end)การเน้นและการยกเว้น
ขณะดีบัก คุณสามารถเน้นการทดสอบเพียงบางส่วนได้ การติดแท็กด้วย --tags ในบรรทัดคำสั่ง หรือการใช้ตัวช่วยของ busted จะทำให้คุณเรียกใช้เฉพาะสิ่งที่สำคัญได้
วิธีนี้ช่วยหลีกเลี่ยงการเรียกใช้ชุดการทดสอบทั้งหมดขณะที่คุณปรับแก้ส่วนที่ล้มเหลวส่วนหนึ่ง
-- run only tests tagged 'fast'
-- busted --tags=fastหลักการตั้งชื่อ
ชื่อที่ดีทำให้เข้าใจสาเหตุของความล้มเหลวได้ด้วยตนเอง เริ่ม describe ด้วยหัวข้อ และเริ่ม it ด้วยคำกริยาที่อธิบายพฤติกรรม
หลีกเลี่ยงชื่อคลุมเครืออย่าง "ทำงาน" หรือ "การทดสอบ1" การทดสอบที่ล้มเหลวควรอ่านแล้วเหมือนรายงานข้อผิดพลาดที่คุณนำไปดำเนินการแก้ไขได้
describe("parser", function()
it("rejects malformed input", function()
assert.has_error(function() parser.parse("{") end)
end)
end)นำทุกอย่างมาประกอบกัน
ข้อกำหนดการทดสอบที่สมบูรณ์จะรวมกลุ่ม describe การเตรียมการด้วย before_each และกรณี it ที่เน้นเฉพาะจุด โครงร่างนี้ขยายจากการทดสอบหนึ่งครั้งไปเป็นหลายร้อยครั้งได้
รักษาให้บล็อกมีขนาดเล็ก และให้ it แต่ละรายการเน้นพฤติกรรมเดียว เพื่อให้ผลลัพธ์ชัดเจนที่สุด
describe("Account", function()
local acc
before_each(function() acc = Account.new(100) end)
it("withdraws funds", function()
acc:withdraw(40)
assert.are.equal(60, acc.balance)
end)
end)ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับโครงสร้างบล็อกของ busted
ทบทวน
describe จัดกลุ่มการทดสอบที่เกี่ยวข้องกัน และ it กำหนดกรณีเดียว โดยอ่านได้เหมือนข้อกำหนดการทดสอบ ซ้อนบล็อก describe เพื่อแสดงบริบท
ใช้ before_each และ after_each เพื่อแยกการทดสอบแต่ละครั้งออกจากกัน และใช้ setup กับ teardown สำหรับงานที่ทำครั้งเดียวต่อบล็อก กำกับงานที่ยังไม่เสร็จด้วย pending
คำถามที่พบบ่อย
บทเรียน “บล็อก describe และ it” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “บล็อก describe และ it” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “บล็อก describe และ it”
จัดโครงสร้างชุดการทดสอบ คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “บล็อก describe และ it” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุใดจึงต้องทดสอบ
- บล็อก describe และ it
- การยืนยัน
- ม็อกและสปาย