JUnit - Phần mở rộng

Sau đây là các phần mở rộng JUnit -

  • Cactus
  • JWebUnit
  • XMLUnit
  • MockObject

cây xương rồng

Cactus là một khung thử nghiệm đơn giản để kiểm tra đơn vị mã java phía máy chủ (Servlets, EJBs, Tag Libs, Filters). Mục đích của Cactus là giảm chi phí viết thử nghiệm cho mã phía máy chủ. Nó sử dụng JUnit và mở rộng nó. Cactus thực hiện chiến lược trong vùng chứa để thực hiện các bài kiểm tra bên trong vùng chứa.

Hệ sinh thái xương rồng được tạo thành từ một số thành phần:

  • Cactus Frameworklà trái tim của Xương rồng. Nó là công cụ cung cấp API để viết các bài kiểm tra Cactus.

  • Cactus Integration Modules là giao diện người dùng và khuôn khổ cung cấp các cách dễ dàng để sử dụng Khung xương rồng (tập lệnh Ant, plugin Eclipse và plugin Maven).

Đoạn mã sau minh họa cách sử dụng 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 là một khung thử nghiệm dựa trên Java cho các ứng dụng web. Nó bao bọc các khuôn khổ thử nghiệm hiện có như HtmlUnit và Selenium bằng một giao diện thử nghiệm đơn giản, thống nhất để kiểm tra tính đúng đắn của các ứng dụng web của bạn.

JWebUnit cung cấp một API Java cấp cao để điều hướng ứng dụng web kết hợp với một tập hợp các xác nhận để xác minh tính đúng đắn của ứng dụng. Điều này bao gồm điều hướng thông qua liên kết, nhập và gửi biểu mẫu, xác nhận nội dung bảng và các tính năng ứng dụng web kinh doanh điển hình khác.

Các phương pháp điều hướng đơn giản và xác nhận sẵn sàng sử dụng cho phép tạo thử nghiệm nhanh hơn so với chỉ sử dụng JUnit hoặc HtmlUnit. Và nếu bạn muốn chuyển từ HtmlUnit sang các plugin khác như Selenium (có sẵn sớm), bạn không cần phải viết lại các bài kiểm tra của mình.

Đây là một mã mẫu.

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 cung cấp một lớp mở rộng JUnit duy nhất, XMLTestCase, và một tập hợp các lớp hỗ trợ cho phép xác nhận về:

  • Sự khác biệt giữa hai phần XML (thông qua các lớp Diff và Chi tiết).

  • Tính hợp lệ của một đoạn XML (thông qua lớp Validator).

  • Kết quả của việc chuyển đổi một đoạn XML bằng XSLT (thông qua lớp Transform).

  • Việc đánh giá một biểu thức XPath trên một đoạn XML (thông qua các lớp triển khai giao diện XpathEngine).

  • Các nút riêng lẻ trong một đoạn XML được hiển thị bởi DOM Traversal (thông qua lớp NodeTest).

Giả sử chúng tôi có hai phần XML mà chúng tôi muốn so sánh và khẳng định rằng chúng bằng nhau. Chúng ta có thể viết một lớp kiểm tra đơn giản như thế này -

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

Trong bài kiểm tra đơn vị, các đối tượng giả có thể mô phỏng hành vi của các đối tượng phức tạp, thực (không phải giả) và do đó rất hữu ích khi một đối tượng thực không thực tế hoặc không thể kết hợp vào bài kiểm tra đơn vị.

Phong cách mã hóa phổ biến để thử nghiệm với các đối tượng giả là:

  • Tạo các thể hiện của các đối tượng giả.
  • Đặt trạng thái và kỳ vọng trong các đối tượng giả.
  • Gọi mã miền với các đối tượng giả làm tham số.
  • Xác minh tính nhất quán trong các đối tượng giả.

Dưới đây là một ví dụ về MockObject sử dụng 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();
   }
}