วิธีที่ฉันเห็นคุณทั้งสองมีข้อได้เปรียบและคุณอยู่ที่ "เสียเปรียบ" (sic)
ข้อดีคือคุณมีระบบที่คุณรู้สึกสะดวกสบายและเหมาะกับคุณ คุณยินดีที่จะยืนยันความถูกต้องของผลิตภัณฑ์ของคุณและคุณอาจพบว่าไม่มีคุณค่าทางธุรกิจในการพยายามเปลี่ยนการทดสอบทั้งหมดของคุณสำหรับสิ่งที่ใช้กรอบงานที่แตกต่างกัน หากคุณสามารถ refactor รหัสของคุณและการทดสอบของคุณรับการเปลี่ยนแปลง - หรือดีกว่าถ้าคุณสามารถแก้ไขการทดสอบของคุณและรหัสที่มีอยู่ของคุณล้มเหลวในการทดสอบจนกว่าจะมีการ refactored แล้วคุณมีฐานทั้งหมดของคุณครอบคลุม อย่างไรก็ตาม ...
ข้อดีอย่างหนึ่งของการมี API ทดสอบหน่วยที่ออกแบบมาอย่างดีคือมีการสนับสนุนดั้งเดิมมากมายใน IDE ที่ทันสมัยที่สุด สิ่งนี้จะไม่ส่งผลกระทบต่อผู้ใช้ hard-core VI และ emacs ที่มีผู้ใช้ Visual Studio แต่ผู้ใช้ที่ใช้ IDE ที่ดีคุณสามารถดีบักการทดสอบและดำเนินการภายใน IDE เอง สิ่งนี้เป็นสิ่งที่ดี แต่มีข้อได้เปรียบที่ยิ่งใหญ่กว่าขึ้นอยู่กับกรอบงานที่คุณใช้และเป็นภาษาที่ใช้ในการทดสอบรหัสของคุณ
เมื่อฉันพูดภาษาฉันไม่ได้พูดถึงภาษาการเขียนโปรแกรม แต่ฉันกำลังพูดถึงชุดคำที่เต็มไปด้วยไวยากรณ์ที่คล่องแคล่วซึ่งทำให้การทดสอบรหัสอ่านเหมือนเรื่องราว โดยเฉพาะอย่างยิ่งฉันได้กลายเป็นผู้สนับสนุนการใช้งานของกรอบBDD DotNet BDD API โปรดของฉันคือStoryQแต่มีคนอื่นอีกหลายคนที่มีจุดประสงค์พื้นฐานเดียวกันซึ่งก็คือการนำแนวคิดออกมาจากเอกสารข้อกำหนดและเขียนมันเป็นรหัสในลักษณะที่คล้ายคลึงกับที่เขียนไว้ในสเป็ค API ที่ดีจริง ๆ ยังคงดำเนินต่อไปโดยการดักคำสั่งแต่ละคำสั่งในการทดสอบและระบุว่าคำสั่งนั้นดำเนินการสำเร็จหรือล้มเหลว สิ่งนี้มีประโยชน์อย่างไม่น่าเชื่อเนื่องจากคุณได้เห็นการทดสอบทั้งหมดที่ดำเนินการโดยไม่กลับมาเร็วซึ่งหมายความว่าความพยายามในการดีบักของคุณมีประสิทธิภาพอย่างไม่น่าเชื่อเพราะคุณจะต้องให้ความสำคัญกับส่วนการทดสอบที่ล้มเหลวโดยไม่จำเป็นต้องถอดรหัส ลำดับ. ข้อดีอีกอย่างคือผลลัพธ์การทดสอบแสดงข้อมูลทั้งหมดนี้ให้คุณทราบ
เป็นตัวอย่างของสิ่งที่ฉันพูดถึงเปรียบเทียบสิ่งต่อไปนี้
ใช้การยืนยัน:
Assert(variable_A == expected_value_1); // if this fails...
Assert(variable_B == expected_value_2); // ...this will not execute
Assert(variable_C == expected_value_3); // ...and nor will this!
การใช้ BDD API ที่คล่องแคล่ว:
(ลองจินตนาการว่าบิตตัวเอียงเป็นวิธีตัวชี้)
WithScenario("Test Scenario")
.Given(*AConfiguration*) // each method
.When(*MyMethodToTestIsCalledWith*, variable_A, variable_B, variable_C) // in the
.Then(*ExpectVariableAEquals*, expected_value_1) // Scenario will
.And(*ExpectVariableBEquals*, expected_value_2) // indicate if it has
.And(*ExpectVariableCEquals*, expected_value_3) // passed or failed execution.
.Execute();
ขณะนี้การอนุญาตให้ใช้ไวยากรณ์ BDD นั้นยาวขึ้นและใช้ถ้อยคำมากขึ้นและตัวอย่างเหล่านี้ถูกประดิษฐ์ขึ้นอย่างมากอย่างไรก็ตามสำหรับสถานการณ์การทดสอบที่ซับซ้อนมากซึ่งมีสิ่งต่าง ๆ มากมายกำลังเปลี่ยนแปลงในระบบซึ่งเป็นผลมาจากพฤติกรรมของระบบที่กำหนด คำอธิบายเกี่ยวกับสิ่งที่คุณกำลังทดสอบและวิธีกำหนดค่าการทดสอบของคุณและคุณสามารถแสดงรหัสนี้ให้กับผู้ที่ไม่ใช่โปรแกรมเมอร์และพวกเขาจะเข้าใจสิ่งที่เกิดขึ้นทันที นอกจากนี้หาก "variable_A" ล้มเหลวในการทดสอบในทั้งสองกรณีตัวอย่าง Asserts จะไม่ดำเนินการผ่านการยืนยันครั้งแรกจนกว่าคุณจะแก้ไขปัญหาได้ในขณะที่ BDD API จะดำเนินการทุกวิธีที่เรียกว่าในการเชื่อมโยงในทางกลับกันและระบุว่า แต่ละส่วนของข้อความมีข้อผิดพลาด
โดยส่วนตัวแล้วฉันพบว่าวิธีการนี้ใช้งานได้ดีกว่ากรอบ xUnit แบบดั้งเดิมมากขึ้นในแง่ที่ว่าภาษาของการทดสอบเป็นภาษาเดียวกับที่ลูกค้าของคุณจะพูดถึงข้อกำหนดเชิงตรรกะของพวกเขา ถึงกระนั้นฉันก็สามารถใช้กรอบ xUnit ในรูปแบบที่คล้ายกันโดยไม่จำเป็นต้องคิดค้น API การทดสอบที่สมบูรณ์เพื่อสนับสนุนความพยายามของฉันและในขณะที่การยืนยันจะยังคงลัดวงจรตัวเองอย่างมีประสิทธิภาพ ตัวอย่างเช่น
ใช้Nunit :
[Test]
void TestMyMethod()
{
const int theExpectedValue = someValue;
GivenASetupToTestMyMethod();
var theActualValue = WhenIExecuteMyMethodToTest();
Assert.That(theActualValue, Is.EqualTo(theExpectedValue)); // nice, but it's not BDD
}
หากคุณตัดสินใจที่จะสำรวจโดยใช้ API การทดสอบหน่วยคำแนะนำของฉันคือการทดสอบกับ API ที่แตกต่างกันจำนวนมากชั่วขณะหนึ่งและเพื่อให้ทราบและเปิดกว้างเกี่ยวกับวิธีการของคุณ ในขณะที่ฉันสนับสนุน BDD เป็นการส่วนตัวความต้องการทางธุรกิจของคุณเองอาจต้องการบางสิ่งที่แตกต่างสำหรับสถานการณ์ของทีม กุญแจสำคัญคือการหลีกเลี่ยงการเดาระบบที่มีอยู่ของคุณเป็นครั้งที่สอง คุณสามารถสนับสนุนการทดสอบที่มีอยู่ของคุณด้วยการทดสอบสองสามครั้งโดยใช้ API อื่นหากจำเป็น แต่แน่นอนว่าฉันจะไม่แนะนำให้เขียนการทดสอบขนาดใหญ่อีกครั้งเพื่อให้ทุกอย่างเหมือนกัน เมื่อรหัสดั้งเดิมตกอยู่ในการใช้งานคุณสามารถแทนที่และทดสอบด้วยรหัสใหม่และการทดสอบโดยใช้ API ทางเลือกและสิ่งนี้ไม่จำเป็นต้องลงทุนในความพยายามที่สำคัญซึ่งไม่จำเป็นต้องให้คุณค่าทางธุรกิจที่แท้จริงแก่คุณ สำหรับการใช้หน่วยทดสอบ API