JUnit - ส่วนขยาย

ต่อไปนี้เป็นส่วนขยาย JUnit -

  • Cactus
  • JWebUnit
  • XMLUnit
  • MockObject

ต้นกระบองเพชร

Cactus เป็นกรอบการทดสอบอย่างง่ายสำหรับการทดสอบหน่วยโค้ด java ฝั่งเซิร์ฟเวอร์ (Servlets, EJBs, Tag Libs, Filters) จุดประสงค์ของ Cactus คือลดต้นทุนในการเขียนการทดสอบโค้ดฝั่งเซิร์ฟเวอร์ ใช้ JUnit และขยาย กระบองเพชรใช้กลยุทธ์ในตู้คอนเทนเนอร์ที่ดำเนินการทดสอบภายในคอนเทนเนอร์

ระบบนิเวศของกระบองเพชรประกอบด้วยส่วนประกอบหลายอย่าง -

  • Cactus Frameworkคือหัวใจของกระบองเพชร เป็นเครื่องมือที่ให้ API ในการเขียนการทดสอบ Cactus

  • Cactus Integration Modules เป็นส่วนหน้าและเฟรมเวิร์กที่ให้วิธีง่ายๆในการใช้ Cactus Framework (สคริปต์ Ant, ปลั๊กอิน Eclipse และปลั๊กอิน Maven)

รหัสต่อไปนี้แสดงให้เห็นถึงวิธีการใช้งาน Cactus

import org.apache.cactus.*;
import junit.framework.*;

public class TestSampleServlet extends ServletTestCase {
   @Test
   public void testServlet() {
      // Initialize class to test
      SampleServlet servlet = new SampleServlet();

      // Set a variable in session as the doSomething()
      // method that we are testing 
      session.setAttribute("name", "value");

      // Call the method to test, passing an 
      // HttpServletRequest object (for example)
      String result = servlet.doSomething(request);

      // Perform verification that test was successful
      assertEquals("something", result);
      assertEquals("otherValue", session.getAttribute("otherName"));
   }
}

JWebUnit

JWebUnit เป็นกรอบการทดสอบที่ใช้ Java สำหรับเว็บแอปพลิเคชัน มันรวมกรอบการทดสอบที่มีอยู่เช่น HtmlUnit และ Selenium ด้วยอินเทอร์เฟซการทดสอบที่เรียบง่ายและเป็นหนึ่งเดียวเพื่อทดสอบความถูกต้องของเว็บแอปพลิเคชันของคุณ

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

วิธีการนำทางที่เรียบง่ายและการยืนยันที่พร้อมใช้งานช่วยให้สร้างการทดสอบได้รวดเร็วกว่าการใช้ JUnit หรือ HtmlUnit เพียงอย่างเดียว และหากคุณต้องการเปลี่ยนจาก HtmlUnit เป็นปลั๊กอินอื่น ๆ เช่น Selenium (พร้อมให้บริการเร็ว ๆ นี้) ก็ไม่จำเป็นต้องเขียนการทดสอบของคุณใหม่

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

import junit.framework.TestCase;
import net.sourceforge.jwebunit.WebTester;

public class ExampleWebTestCase extends TestCase {
   private WebTester tester;
   
   public ExampleWebTestCase(String name) {
      super(name);
      tester = new WebTester();
   }
	
   //set base url
   public void setUp() throws Exception {
      getTestContext().setBaseUrl("http://myserver:8080/myapp");
   }
	
   // test base info
   @Test
   public void testInfoPage() {
      beginAt("/info.html");
   }
}

XMLUnit

XMLUnit จัดเตรียมคลาสส่วนขยาย JUnit เดียว XMLTestCase และชุดของคลาสสนับสนุนที่อนุญาตให้ทำการยืนยันเกี่ยวกับ -

  • ความแตกต่างระหว่าง XML สองส่วน (ผ่านคลาส Diff และ DetailDiff)

  • ความถูกต้องของชิ้นส่วนของ XML (ผ่านคลาส Validator)

  • ผลลัพธ์ของการแปลง XML ชิ้นหนึ่งโดยใช้ XSLT (ผ่านคลาส Transform)

  • การประเมินนิพจน์ XPath บนส่วนของ XML (ผ่านคลาสที่ใช้อินเตอร์เฟส XpathEngine)

  • แต่ละโหนดในส่วนของ XML ที่เปิดเผยโดย DOM Traversal (ผ่านคลาส NodeTest)

สมมติว่าเรามี XML สองส่วนที่เราต้องการเปรียบเทียบและยืนยันว่ามีค่าเท่ากัน เราสามารถเขียนคลาสทดสอบง่ายๆได้ดังนี้ -

import org.custommonkey.xmlunit.XMLTestCase;

public class MyXMLTestCase extends XMLTestCase {

   // this test method compare two pieces of the XML
   @Test
   public void testForXMLEquality() throws Exception {
      String myControlXML = "<msg><uuid>0x00435A8C</uuid></msg>";
      String myTestXML = "<msg><localId>2376</localId></msg>";
      assertXMLEqual("Comparing test xml to control xml", myControlXML, myTestXML);
   }
}

MockObject

ในการทดสอบหน่วยวัตถุจำลองสามารถจำลองพฤติกรรมของวัตถุที่ซับซ้อนจริง (ไม่จำลอง) ได้ดังนั้นจึงมีประโยชน์เมื่อวัตถุจริงทำไม่ได้หรือไม่สามารถรวมเข้ากับการทดสอบหน่วยได้

รูปแบบการเข้ารหัสทั่วไปสำหรับการทดสอบกับวัตถุจำลองคือ -

  • สร้างอินสแตนซ์ของวัตถุจำลอง
  • กำหนดสถานะและความคาดหวังในวัตถุจำลอง
  • เรียกใช้รหัสโดเมนโดยมีวัตถุจำลองเป็นพารามิเตอร์
  • ตรวจสอบความสอดคล้องในวัตถุจำลอง

ด้านล่างเป็นตัวอย่างของ MockObject โดยใช้ Jmock

import org.jmock.Mockery;
import org.jmock.Expectations;

class PubTest extends TestCase {
   Mockery context = new Mockery();
   public void testSubReceivesMessage() {
      // set up
      final Sub sub = context.mock(Sub.class);

      Pub pub = new Pub();
      pub.add(sub);
    
      final String message = "message";
      
      // expectations
      context.checking(new Expectations() {
         oneOf (sub).receive(message);
      });

      // execute
      pub.publish(message);
      
      // verify
      context.assertIsSatisfied();
   }
}