ความแตกต่างระหว่าง setUp () และ setUpBeforeClass ()


159

เมื่อหน่วยทดสอบกับ JUnit มีสองวิธีการที่คล้ายกันและsetUp() setUpBeforeClass()ความแตกต่างระหว่างวิธีการเหล่านี้คืออะไร? นอกจากนี้ความแตกต่างระหว่างtearDown()และคืออะไรtearDownAfterClass()คืออะไร?

นี่คือลายเซ็น:

@BeforeClass
public static void setUpBeforeClass() throws Exception {
}

@AfterClass
public static void tearDownAfterClass() throws Exception {
}

@Before
public void setUp() throws Exception {
}

@After
public void tearDown() throws Exception {
}

คำตอบ:


204

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

@Beforeและ@Afterวิธีการจะทำงานก่อนและหลังกรณีทดสอบทุกคนจึงอาจจะถูกเรียกใช้หลายครั้งในระหว่างการทดสอบการทำงาน

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

setUpBeforeClass()

  (Test class first instance constructed and the following methods called on it)
    setUp()
    test1()
    tearDown()

  (Test class second instance constructed and the following methods called on it)
    setUp()
    test2()
    tearDown()

  (Test class third instance constructed and the following methods called on it)
    setUp()
    test3()
    tearDown()

tearDownAfterClass()

15

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

สุดท้ายใช้เมธอดหมายเหตุประกอบ "AfterClass" เพื่อล้างการตั้งค่าใด ๆ ที่คุณทำในวิธีการทำหมายเหตุประกอบ "BeforeClass" (เว้นแต่การทำลายตนเองจะดีพอ)

"Before" & "After" ใช้สำหรับการเริ่มต้นหน่วยทดสอบเฉพาะ ฉันมักจะใช้วิธีการเหล่านี้เพื่อเริ่มต้น / เริ่มต้น mocks ของการอ้างอิงของฉันอีกครั้ง เห็นได้ชัดว่าการกำหนดค่าเริ่มต้นนี้ไม่ได้เฉพาะเจาะจงสำหรับการทดสอบหน่วย แต่เป็นการทั่วไปสำหรับการทดสอบหน่วยทั้งหมด


BTW ถ้าคุณเริ่มเขียนการทดสอบหน่วยฉันจะแนะนำหม้อนี้จากบล็อกของฉัน มันมีพอยน์เตอร์สำหรับวัสดุที่ยอดเยี่ยมอื่น ๆ ในการทดสอบหน่วยเช่นกัน: madhurtanwani.blogspot.com/search/label/mock
madhurtanwani

7

setUpBeforeClass ถูกเรียกใช้ก่อนเรียกใช้เมธอดใด ๆ หลังจากตัวสร้าง (รันเพียงครั้งเดียว)

setUp จะทำงานก่อนการดำเนินการแต่ละวิธี

tearDown ทำงานหลังจากการดำเนินการแต่ละวิธี

tearDownAfterClass ถูกเรียกใช้หลังจากการเรียกใช้เมธอดอื่นทั้งหมดเป็นวิธีสุดท้ายที่จะถูกเรียกใช้ (รัน deconstructor เพียงครั้งเดียวเท่านั้น)


5

จากJavadoc :

บางครั้งการทดสอบหลายครั้งจำเป็นต้องแบ่งปันการตั้งค่าที่มีราคาแพง (เช่นการเข้าสู่ฐานข้อมูล) ในขณะนี้สามารถลดความเป็นอิสระของการทดสอบบางครั้งก็เป็นการเพิ่มประสิทธิภาพที่จำเป็น การใส่คำอธิบายpublic static voidเมธอด no-arg ด้วย@BeforeClassสาเหตุทำให้ต้องรันหนึ่งครั้งก่อนวิธีการทดสอบใด ๆ ในคลาส @BeforeClassวิธีการ superclasses จะถูกเรียกใช้ก่อนนั้นระดับปัจจุบัน


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