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();
}
}