Junit @Rule ทำงานอย่างไร


195

ฉันต้องการเขียนกรณีทดสอบสำหรับรหัสจำนวนมากฉันต้องการทราบรายละเอียดของ@Ruleคุณสมบัติการเพิ่มความคิดเห็นของ JUnit เพื่อที่ฉันจะสามารถใช้สำหรับการเขียนกรณีทดสอบได้ โปรดให้คำตอบหรือลิงก์ที่ดีซึ่งให้คำอธิบายโดยละเอียดเกี่ยวกับฟังก์ชันการทำงานผ่านตัวอย่างง่ายๆ


ฉันผ่านลิงค์นี้ไปแล้วhttp://cwd.dhemery.com/2011/01/what-junit-rules-are-good-for/
Dipak

ฉันพบบทความนี้อธิบาย@Ruleค่อนข้างดีโดยเฉพาะอย่างยิ่งตรวจสอบส่วนสุดท้าย "ลำดับเหตุการณ์ในรายละเอียด"
Peter Perháč

ฉันคิดว่ามันคล้ายกับแนวคิดของการฉีดฉันใช่ไหม?
Chao

ขอขอบคุณที่แบ่งปันลิงก์ สิ่งหนึ่งที่ไม่ชัดเจน DEFAULT Statement.evaluate () ได้รับการเรียกเมื่อใด มันถูกเรียกใช้ก่อนการประเมิน () ของกฎทั้งหมดหรือหลังจากกฎทั้งหมดหรือไม่ ฉันเดาหลังจากทั้งหมด
MasterJoe2

@ testerjoe2 คุณสามารถเลือกที่จะเพิกเฉยต่อคำสั่งเริ่มต้นได้อย่างสมบูรณ์ คุณอาจเลือกที่จะมอบหมายหรือคุณอาจจะแทนที่มันพร้อมกับคำชี้แจงอื่น ๆ ของคุณเอง มันไม่ได้รับการเรียก , คุณอาจจะเรียกมันหรือไม่ นั่นคือในจุดที่ 10: "วิธีการประเมินคำสั่ง screenshot (เรียก) วิธีการประเมินงบ () วิธีการเริ่มต้น
ปีเตอร์Perháč

คำตอบ:


156

กฎถูกใช้เพื่อเพิ่มฟังก์ชันการทำงานเพิ่มเติมซึ่งใช้กับการทดสอบทั้งหมดภายในคลาสทดสอบ แต่ด้วยวิธีทั่วไป

ยกตัวอย่างเช่นExternalResourceรันรหัสก่อนและหลังการใช้วิธีการทดสอบโดยไม่ต้องใช้และ@Before @Afterใช้ExternalResourceมากกว่า@Beforeและ@Afterให้โอกาสในการนำโค้ดกลับมาใช้ใหม่ได้ดีขึ้น สามารถใช้กฎเดียวกันนี้จากคลาสทดสอบที่แตกต่างกันสองคลาส

การออกแบบมีพื้นฐานมาจาก: Interceptors ใน JUnit

สำหรับข้อมูลเพิ่มเติมโปรดดูที่วิกิพีเดีย JUnit หลักเกณฑ์


1
การแก้ไข: "ตัวอย่างเช่น ExternalResource เรียกใช้งานโค้ดก่อนและหลังคลาสทดสอบ" มีบางอย่างเกี่ยวกับการใช้ Apply () เพื่อให้ ExternalResource ทำงานระหว่างการทดสอบ
derekm

62

กฎ Junit ทำงานบนหลักการของ AOP (การเขียนโปรแกรมแบบเชิงกว้าง) มันขัดขวางวิธีการทดสอบจึงเปิดโอกาสให้ทำบางสิ่งก่อนหรือหลังการดำเนินการของวิธีทดสอบที่เฉพาะเจาะจง

นำตัวอย่างของรหัสด้านล่าง:

public class JunitRuleTest {

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

  @Test
  public void testRule() throws IOException {
    File newFolder = tempFolder.newFolder("Temp Folder");
    assertTrue(newFolder.exists());
  }
} 

ทุกครั้งที่มีการดำเนินการวิธีทดสอบข้างต้นโฟลเดอร์ชั่วคราวจะถูกสร้างขึ้นและจะถูกลบหลังจากการดำเนินการของวิธีการนั้น นี่คือตัวอย่างของกฎที่ไม่ได้จัดทำโดย Junit

พฤติกรรมที่คล้ายกันสามารถทำได้โดยการสร้างกฎของเราเอง Junit จัดให้มีอินเตอร์เฟซ TestRule ซึ่งสามารถนำไปใช้เพื่อสร้างกฎ Junit ของเราเอง

นี่คือลิงค์ที่มีประโยชน์สำหรับการอ้างอิง:


4
ดังนั้นมันจะถูกลบโดยไม่ต้องเขียนโค้ดใด ๆ เพื่อลบ / ล้างวัตถุ?
Dror

ดูที่แหล่งที่มาของgithub.com/junit-team/junit4/blob/master/src/main/java/org/…โฟลเดอร์จะถูกสร้างขึ้นใน before () วิธีการโทรกลับและลบใน after () วิธีการโทรกลับ ..
Pierluigi Vernetto

1
สำหรับคนที่อาจไม่เข้าใจว่าทำไม TemporaryFolder ถึงถูกลบมันเป็นเพราะ TemporaryFolder ที่ Junit จัดทำขึ้นเพื่อเป็นโฟลเดอร์ temp ที่ถูกลบโดยอัตโนมัติ - นั่นคือขั้นตอนการฉีกขาดเป็นส่วนหนึ่งของคลาส TemporaryFolder
Mindaugas Bernatavičius

18

คำอธิบายวิธีการทำงาน:

JUnit ล้อมวิธีการทดสอบของคุณในวัตถุ Statement เพื่อให้ Statement และExecute()รันการทดสอบของคุณ จากนั้นแทนที่จะโทรstatement.Execute()โดยตรงเพื่อรันการทดสอบของคุณ JUnit ส่งคำชี้แจงไปยัง TestRule พร้อม@Ruleคำอธิบายประกอบ ฟังก์ชั่น "ใช้" ของ TestRule ส่งคืนคำแถลงใหม่ที่ให้คำชี้แจงพร้อมกับการทดสอบของคุณ งบใหม่Execute()วิธีสามารถเรียกคำชี้แจงการทดสอบเป็นวิธีการดำเนินการ (หรือไม่หรือเรียกว่าหลายครั้ง) before and afterและทำสิ่งที่มันต้องการ

ตอนนี้ JUnit มีคำแถลงใหม่ที่ทำมากกว่าเรียกใช้การทดสอบและสามารถส่งต่อไปยังกฎเพิ่มเติมอีกครั้งก่อนที่จะเรียก Execute


2
คำชี้แจงมีวิธีการประเมินไม่ดำเนินการ
Hemanth

0

กฎใช้เพื่อปรับปรุงพฤติกรรมของวิธีทดสอบแต่ละวิธีด้วยวิธีทั่วไป กฎ Junit สกัดกั้นวิธีการทดสอบและอนุญาตให้เราทำบางสิ่งบางอย่างก่อนที่วิธีทดสอบจะเริ่มดำเนินการและหลังจากวิธีการทดสอบได้รับการดำเนินการ

ตัวอย่างเช่นการใช้กฎ@Timeoutเราสามารถตั้งค่าการหมดเวลาสำหรับการทดสอบทั้งหมดได้

public class TestApp {
    @Rule
    public Timeout globalTimeout = new Timeout(20, TimeUnit.MILLISECONDS);

    ......
    ......

 }

@กฎชั่วคราวจะใช้ในการสร้างโฟลเดอร์ไฟล์ชั่วคราว ทุกครั้งที่มีการดำเนินการวิธีทดสอบโฟลเดอร์ชั่วคราวจะถูกสร้างขึ้นและจะถูกลบหลังจากการดำเนินการของวิธีการนั้น

public class TempFolderTest {

 @Rule
 public TemporaryFolder tempFolder= new TemporaryFolder();

 @Test
 public void testTempFolder() throws IOException {
  File folder = tempFolder.newFolder("demos");
  File file = tempFolder.newFile("Hello.txt");

  assertEquals(folder.getName(), "demos");
  assertEquals(file.getName(), "Hello.txt");

 }


}

คุณสามารถดูตัวอย่างของกฎที่สร้างขึ้นโดย junit ได้ที่ลิงค์นี้

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