ควรเป็น "จัด - ยืนยัน - กระทำ - ยืนยัน" หรือไม่


94

เกี่ยวกับรูปแบบการทดสอบแบบคลาสสิกของArrange-Act-Assertฉันมักพบว่าตัวเองมีการเพิ่มการยืนยันตัวตนที่มาก่อนพระราชบัญญัติ วิธีนี้ทำให้ฉันรู้ว่าการยืนยันที่ผ่านนั้นผ่านไปแล้วอันเป็นผลมาจากการกระทำ

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

การทดสอบของคุณเป็นไปตามรูปแบบนี้หรือไม่ ทำไมหรือทำไมไม่?

การชี้แจงการอัปเดต : การยืนยันครั้งแรกนั้นตรงกันข้ามกับการยืนยันขั้นสุดท้าย ไม่ใช่การยืนยันว่าการจัดเรียงใช้ได้ผล เป็นการยืนยันว่าพระราชบัญญัติยังไม่ได้ผล

คำตอบ:


121

นี่ไม่ใช่สิ่งที่ต้องทำบ่อยที่สุด แต่ก็ยังมีชื่อเป็นของตัวเอง เทคนิคนี้เรียกว่ายามยืนยัน คุณสามารถดูคำอธิบายโดยละเอียดได้ในหน้า 490 ในหนังสือที่ยอดเยี่ยมxUnit Test Patternsโดย Gerard Meszaros (ขอแนะนำ)

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

อาจมีเงื่อนไขเบื้องต้นหลายประการที่ต้องปฏิบัติตามสำหรับกรณีทดสอบที่กำหนดดังนั้นคุณอาจต้องใช้ Guard Assertion มากกว่าหนึ่งครั้ง แทนที่จะทำซ้ำในการทดสอบทั้งหมดการมีการทดสอบเพียงครั้งเดียว (และแบบเดียว) สำหรับเงื่อนไขเบื้องต้นแต่ละข้อจะช่วยให้รหัสทดสอบของคุณเป็นไปได้มากขึ้นเนื่องจากคุณจะมีการทำซ้ำน้อยลง


+1 คำตอบที่ดีมาก ส่วนสุดท้ายมีความสำคัญอย่างยิ่งเพราะแสดงให้เห็นว่าคุณสามารถป้องกันสิ่งต่างๆได้เป็นการทดสอบหน่วยแยก
murrekatt

3
โดยทั่วไปฉันก็ทำแบบนี้เช่นกัน แต่มีปัญหากับการทดสอบแยกต่างหากเพื่อให้แน่ใจว่ามีเงื่อนไขเบื้องต้น (โดยเฉพาะอย่างยิ่งกับ codebase ขนาดใหญ่ที่มีข้อกำหนดที่เปลี่ยนแปลง) - การทดสอบเงื่อนไขเบื้องต้นจะได้รับการแก้ไขเมื่อเวลาผ่านไปและไม่ซิงค์กับ 'main' ทดสอบที่คาดเดาเงื่อนไขเบื้องต้นเหล่านั้น ดังนั้นเงื่อนไขเบื้องต้นอาจดีและเป็นสีเขียวทั้งหมด แต่เงื่อนไขเบื้องต้นเหล่านั้นไม่เป็นที่พอใจในการทดสอบหลักซึ่งตอนนี้จะแสดงเป็นสีเขียวและดีเสมอ แต่ถ้าเงื่อนไขเบื้องต้นอยู่ในการทดสอบหลักก็จะล้มเหลว คุณเคยเจอปัญหานี้และพบวิธีแก้ปัญหาที่ดีหรือไม่?
nchaud

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

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

32

นอกจากนี้ยังอาจจะระบุเป็นเตรียมการสมมติ -Act-ยืนยัน

มีการจัดการทางเทคนิคสำหรับสิ่งนี้ใน NUnit ดังตัวอย่างที่นี่: http://nunit.org/index.php?p=theory&r=2.5.7


1
ดี! ฉันชอบที่สี่ - และแตกต่าง - และถูกต้อง - "A" ขอบคุณ!
Carl Manaster

+1, @ โอเล่! ฉันชอบอันนี้เหมือนกันสำหรับบางกรณีพิเศษ! จะลองดู!
John Tobler

8

นี่คือตัวอย่าง

public void testEncompass() throws Exception {
    Range range = new Range(0, 5);
    assertFalse(range.includes(7));
    range.encompass(7);
    assertTrue(range.includes(7));
}

อาจเป็นไปได้ว่าฉันเขียนRange.includes()เพื่อกลับจริง ฉันไม่ได้ แต่ฉันสามารถจินตนาการได้ว่าฉันอาจมี หรือฉันอาจเขียนผิดด้วยวิธีอื่น ๆ ฉันหวังว่าและคาดหวังว่าด้วย TDD ฉันทำถูกแล้ว - ใช้includes()งานได้จริง - แต่บางทีฉันอาจจะไม่ ดังนั้นการยืนยันครั้งแรกคือการตรวจสอบความมีสุขภาพจิตเพื่อให้แน่ใจว่าการยืนยันครั้งที่สองมีความหมายจริงๆ

อ่านเองassertTrue(range.includes(7));บอกว่า: "ยืนยันว่าช่วงที่แก้ไขมี 7" อ่านในบริบทของการยืนยันครั้งแรกมันบอกว่า: "ยืนยันว่าการเรียก encompass ()ทำให้รวมเป็น 7 และเนื่องจาก encompass เป็นหน่วยที่เรากำลังทดสอบฉันจึงคิดว่านั่นเป็นค่า (เล็กน้อย)

ฉันยอมรับคำตอบของตัวเอง คนอื่น ๆ หลายคนเข้าใจผิดว่าคำถามของฉันเกี่ยวกับการทดสอบการตั้งค่า ฉันคิดว่านี่แตกต่างกันเล็กน้อย


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

สมมติว่าคุณ TDD คลาส Range จะไม่มีการทดสอบที่ล้มเหลวอีกครั้งในการทดสอบ Range ctor เมื่อคุณจะทำลายมัน
ใจร้อน

1
@philippe: ฉันไม่แน่ใจว่าฉันเข้าใจคำถาม ตัวสร้างช่วงและรวมถึง () มีการทดสอบหน่วยของตนเอง ช่วยอธิบายให้ละเอียดได้ไหม
Carl Manaster

สำหรับ assertFalse แรก (range.includes (7)) การยืนยันว่าล้มเหลวคุณจะต้องมีข้อบกพร่องใน Range Constructor ฉันจึงตั้งใจถามว่าการทดสอบสำหรับตัวสร้างช่วงจะไม่แตกในเวลาเดียวกันกับการยืนยันนั้นหรือไม่ และสิ่งที่เกี่ยวกับการยืนยันหลังจากพระราชบัญญัติในค่าอื่นเช่น assertFalse (range.includes (6))?
ใจร้าย

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

7

การArrange-Assert-Act-Assertทดสอบสามารถ refactored เป็นสองการทดสอบ:

1. Arrange-Assert

และ

2. Arrange-Act-Assert

การทดสอบครั้งแรกจะยืนยันเฉพาะสิ่งที่ตั้งขึ้นในขั้นตอนการจัดเรียงและการทดสอบครั้งที่สองจะยืนยันเฉพาะสิ่งที่เกิดขึ้นในขั้นตอนพระราชบัญญัติเท่านั้น

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

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

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


3

ตอนนี้ฉันกำลังทำสิ่งนี้ AAAA ที่แตกต่างกัน

Arrange - setup
Act - what is being tested
Assemble - what is optionally needed to perform the assert
Assert - the actual assertions

ตัวอย่างการทดสอบการอัปเดต:

Arrange: 
    New object as NewObject
    Set properties of NewObject
    Save the NewObject
    Read the object as ReadObject

Act: 
    Change the ReadObject
    Save the ReadObject

Assemble: 
    Read the object as ReadUpdated

Assert: 
    Compare ReadUpdated with ReadObject properties

เหตุผลที่ ACT ไม่มีการอ่าน ReadUpdated เป็นเพราะมันไม่ได้เป็นส่วนหนึ่งของพระราชบัญญัติ การกระทำเป็นเพียงการเปลี่ยนแปลงและการประหยัด จริงๆแล้ว ARRANGE ReadUpdated สำหรับการยืนยันฉันกำลังเรียก ASSEMBLE เพื่อยืนยัน เพื่อป้องกันความสับสนในส่วน ARRANGE

ASSERT ควรมีเฉพาะการยืนยันเท่านั้น นั่นออกจาก ASSEMBLE ระหว่าง ACT และ ASSERT ซึ่งตั้งค่าการยืนยัน

สุดท้ายนี้หากคุณล้มเหลวในการจัดเรียงการทดสอบของคุณจะไม่ถูกต้องเนื่องจากคุณควรมีการทดสอบอื่น ๆ เพื่อป้องกัน / ค้นหาข้อบกพร่องเล็กน้อยเหล่านี้ เนื่องจากสำหรับสถานการณ์ที่ฉันนำเสนอควรมีการทดสอบอื่น ๆ อยู่แล้วซึ่งทดสอบอ่านและสร้าง หากคุณสร้าง "Guard Assertion" คุณอาจทำลาย DRY และทำการบำรุงรักษา


1

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


1

ฉันได้อ่านเกี่ยวกับเทคนิคนี้แล้ว - อาจจะมาจากคุณ btw - แต่ฉันไม่ได้ใช้มัน ส่วนใหญ่เป็นเพราะฉันคุ้นเคยกับแบบฟอร์ม Triple A สำหรับการทดสอบหน่วยของฉัน

ตอนนี้ฉันเริ่มสงสัยและมีคำถาม: คุณเขียนแบบทดสอบของคุณได้อย่างไรคุณทำให้การยืนยันนี้ล้มเหลวตามวงจรสีแดงเขียว - แดง - เขียว - refactor หรือคุณเพิ่มเข้าไปในภายหลัง

คุณล้มเหลวในบางครั้งหรือไม่หลังจากที่คุณเปลี่ยนรหัสใหม่แล้ว? สิ่งนี้บอกอะไรคุณ? บางทีคุณอาจแบ่งปันตัวอย่างที่ช่วยได้ ขอบคุณ.


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

1

ฉันเคยทำสิ่งนี้มาก่อนเมื่อตรวจสอบการทดสอบที่ล้มเหลว

หลังจากเกาศีรษะหลายครั้งฉันพบว่าสาเหตุคือวิธีการที่เรียกในระหว่าง "จัดเรียง" ทำงานไม่ถูกต้อง ความล้มเหลวในการทดสอบทำให้เข้าใจผิด ฉันเพิ่ม Assert หลังการจัดเรียง สิ่งนี้ทำให้การทดสอบล้มเหลวในสถานที่ซึ่งเน้นปัญหาที่แท้จริง

ฉันคิดว่ายังมีกลิ่นรหัสที่นี่หากส่วนการจัดเรียงของการทดสอบยาวและซับซ้อนเกินไป


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

1

โดยทั่วไปแล้วฉันชอบ "จัดเรียง, กระทำ, ยืนยัน" มากและใช้เป็นมาตรฐานส่วนตัวของฉัน อย่างไรก็ตามสิ่งหนึ่งที่ไม่สามารถเตือนให้ฉันทำคือการไม่จัดเรียงสิ่งที่ฉันจัดเตรียมไว้เมื่อการยืนยันเสร็จสิ้น ในกรณีส่วนใหญ่สิ่งนี้ไม่ก่อให้เกิดความรำคาญมากนักเนื่องจากสิ่งต่างๆส่วนใหญ่หายไปอย่างน่าอัศจรรย์โดยอัตโนมัติผ่านการรวบรวมขยะเป็นต้นอย่างไรก็ตามหากคุณสร้างการเชื่อมต่อกับทรัพยากรภายนอกคุณอาจต้องการปิดการเชื่อมต่อเหล่านั้นเมื่อคุณทำเสร็จแล้ว ด้วยคำยืนยันของคุณหรือคุณหลายคนมีเซิร์ฟเวอร์หรือทรัพยากรราคาแพงอยู่ที่ไหนสักแห่งที่มีการเชื่อมต่อหรือทรัพยากรที่สำคัญซึ่งควรจะมอบให้กับคนอื่นได้ สิ่งนี้สำคัญอย่างยิ่งหากคุณเป็นหนึ่งในผู้พัฒนาที่ไม่ได้ใช้ TearDown หรือ TestFixtureTearDownเพื่อทำความสะอาดหลังจากการทดสอบอย่างน้อยหนึ่งครั้ง แน่นอนว่า "จัดเตรียมกระทำยืนยัน" จะไม่รับผิดชอบต่อความล้มเหลวในการปิดสิ่งที่ฉันเปิด ฉันพูดถึง "gotcha" นี้เท่านั้นเพราะฉันยังไม่พบคำพ้องความหมาย "A-word" ที่ดีสำหรับ "dispose" ที่จะแนะนำ! ข้อเสนอแนะใด ๆ ?


1
@carlmanaster คุณอยู่ใกล้ฉันมากพอแล้ว! ฉันติดอยู่ใน TestFixture ถัดไปของฉันเพื่อลองขนาด มันเหมือนกับคำเตือนเล็ก ๆ น้อย ๆ ที่ให้ทำในสิ่งที่แม่ของคุณควรจะสอนคุณ: "ถ้าคุณเปิดมันปิด! ถ้าคุณทำมันเลอะ อาจมีคนอื่นสามารถปรับปรุงได้ แต่อย่างน้อยก็เริ่มต้นด้วย "ก!" ขอบคุณสำหรับข้อเสนอแนะ!
John Tobler

1
@carlmanaster ฉันให้ "Annul" ลอง มันดีกว่าคำว่า "teardown" และมันก็ใช้ได้ดี แต่ฉันยังคงมองหาคำ "A" อีกคำที่ติดอยู่ในหัวของฉันอย่างสมบูรณ์แบบเช่น "จัดเรียง, กระทำ, ยืนยัน" อาจจะ "ทำลายล้าง?!"
John Tobler

1
ตอนนี้ฉันมี "จัดเตรียมทะลึ่งลงมือทำยืนยันทำลายล้าง" อืม! ฉันมีความซับซ้อนมากเกินไปใช่มั้ย? บางทีฉันอาจจะดีกว่าเพียงแค่ KISS แล้วกลับไปที่ "จัดเตรียมลงมือทำและยืนยัน!"
John Tobler

1
อาจใช้ R เพื่อรีเซ็ต? ฉันรู้ว่ามันไม่ใช่ A แต่ดูเหมือนโจรสลัดจะพูดว่า: Aaargh! และรีเซ็ตคำคล้องจองด้วย Assert: o
Marcel Valdez Orozco

1

มีลักษณะที่รายการวิกิพีเดียในการออกแบบโดยสัญญา Arrange-Act-Assert Holy Trinity เป็นความพยายามที่จะเข้ารหัสแนวคิดเดียวกันบางส่วนและเป็นการพิสูจน์ความถูกต้องของโปรแกรม จากบทความ:

The notion of a contract extends down to the method/procedure level; the
contract for each method will normally contain the following pieces of
information:

    Acceptable and unacceptable input values or types, and their meanings
    Return values or types, and their meanings
    Error and exception condition values or types that can occur, and their meanings
    Side effects
    Preconditions
    Postconditions
    Invariants
    (more rarely) Performance guarantees, e.g. for time or space used

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


0

ขึ้นอยู่กับสภาพแวดล้อม / ภาษาการทดสอบของคุณ แต่โดยปกติแล้วหากบางสิ่งในส่วนการจัดเรียงล้มเหลวข้อยกเว้นจะถูกโยนทิ้งและการทดสอบล้มเหลวในการแสดงผลแทนที่จะเริ่มส่วนพระราชบัญญัติ ดังนั้นไม่ฉันมักจะไม่ใช้ Assert ส่วนที่สอง

นอกจากนี้ในกรณีที่ส่วนการจัดเรียงของคุณค่อนข้างซับซ้อนและไม่ได้มีข้อยกเว้นเสมอไปคุณอาจพิจารณาห่อด้วยวิธีการบางอย่างและเขียนแบบทดสอบของตัวเองเพื่อให้คุณมั่นใจได้ว่าจะไม่ล้มเหลว (หากไม่มี โยนข้อยกเว้น)


0

ฉันไม่ใช้รูปแบบนั้นเพราะฉันคิดว่าจะทำสิ่งที่ชอบ:

Arrange
Assert-Not
Act
Assert

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

โดยใช้ตัวอย่างคำตอบของคุณ:

public void testEncompass() throws Exception {
    Range range = new Range(0, 5);
    assertFalse(range.includes(7)); // <-- Pointless and against DRY if there 
                                    // are unit tests for Range(int, int)
    range.encompass(7);
    assertTrue(range.includes(7));
}

ฉันเกรงว่าคุณจะไม่เข้าใจคำถามของฉันจริงๆ การยืนยันเบื้องต้นไม่เกี่ยวกับการทดสอบการจัดเรียง เป็นเพียงการสร้างความมั่นใจว่าพระราชบัญญัติเป็นสิ่งที่ทำให้รัฐถูกยืนยันในตอนท้าย
Carl Manaster

และประเด็นของฉันก็คือไม่ว่าคุณจะใส่อะไรในส่วน Assert-Not ก็มีนัยอยู่แล้วในส่วนการจัดเรียงเนื่องจากโค้ดในส่วนการจัดเรียงได้รับการทดสอบอย่างละเอียดและคุณรู้อยู่แล้วว่ามันทำอะไร
Marcel Valdez Orozco

แต่ฉันเชื่อว่ามีค่าในส่วน Assert-Not เพราะคุณกำลังพูดว่า: เนื่องจากส่วนการจัดเรียงออกจาก 'โลก' ใน 'สถานะนี้' แล้ว 'พระราชบัญญัติ' ของฉันจะออกจาก 'โลก' ใน 'สถานะใหม่' นี้ ; และหากการใช้โค้ดส่วนการจัดเรียงขึ้นอยู่กับการเปลี่ยนแปลงการทดสอบก็จะแตกเช่นกัน แต่อีกครั้งที่อาจต่อต้าน DRY เนื่องจากคุณ (ควร) มีการทดสอบรหัสใด ๆ ที่คุณขึ้นอยู่ในส่วนการจัดเรียง
Marcel Valdez Orozco

บางทีในโปรเจ็กต์ที่มีหลายทีม (หรือทีมใหญ่) ทำงานในโปรเจ็กต์เดียวกันประโยคดังกล่าวน่าจะมีประโยชน์มากมิฉะนั้นฉันคิดว่ามันไม่จำเป็นและซ้ำซ้อน
Marcel Valdez Orozco

อาจเป็นไปได้ว่าประโยคดังกล่าวน่าจะดีกว่าในการทดสอบการรวมการทดสอบระบบหรือการทดสอบการยอมรับซึ่งส่วนจัดเรียงมักจะขึ้นอยู่กับองค์ประกอบมากกว่าหนึ่งองค์ประกอบและมีปัจจัยอื่น ๆ อีกมากมายที่อาจทำให้สถานะเริ่มต้นของ 'โลก' เปลี่ยนแปลงโดยไม่คาดคิด แต่ฉันไม่เห็นสถานที่สำหรับการทดสอบหน่วยนี้
Marcel Valdez Orozco

0

หากคุณต้องการทดสอบทุกอย่างในตัวอย่างให้ลองทดสอบเพิ่มเติม ... เช่น:

public void testIncludes7() throws Exception {
    Range range = new Range(0, 5);
    assertFalse(range.includes(7));
}

public void testIncludes5() throws Exception {
    Range range = new Range(0, 5);
    assertTrue(range.includes(5));
}

public void testIncludes0() throws Exception {
    Range range = new Range(0, 5);
    assertTrue(range.includes(0));
}

public void testEncompassInc7() throws Exception {
    Range range = new Range(0, 5);
    range.encompass(7);
    assertTrue(range.includes(7));
}

public void testEncompassInc5() throws Exception {
    Range range = new Range(0, 5);
    range.encompass(7);
    assertTrue(range.includes(5));
}

public void testEncompassInc0() throws Exception {
    Range range = new Range(0, 5);
    range.encompass(7);
    assertTrue(range.includes(0));
}

เพราะไม่เช่นนั้นคุณจะพลาดโอกาสผิดพลาดมากมาย ... เช่นหลังจากล้อมรอบแล้วช่วงจะมีเพียง 7 เท่านั้นเป็นต้นนอกจากนี้ยังมีการทดสอบความยาวของช่วง (เพื่อให้แน่ใจว่ามันไม่ได้รวมค่าสุ่มด้วย) และ ชุดการทดสอบอื่นทั้งหมดสำหรับการพยายามรวม 5 ในช่วง ... สิ่งที่เราคาดหวัง - ข้อยกเว้นในการล้อมรอบหรือช่วงที่จะไม่มีการเปลี่ยนแปลง?

อย่างไรก็ตามประเด็นก็คือหากมีสมมติฐานใด ๆ ในการกระทำที่คุณต้องการทดสอบให้ทดสอบด้วยตัวเองใช่หรือไม่?


0

ฉันใช้:

1. Setup
2. Act
3. Assert 
4. Teardown

เนื่องจากการตั้งค่าใหม่ทั้งหมดมีความสำคัญมาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.