鍍金池/ 教程/ Java/ JUnit - 框架擴(kuò)展
JUnit - 參數(shù)化測(cè)試
JUnit - 執(zhí)行過(guò)程
JUnit - 執(zhí)行測(cè)試
JUnit - 概述
JUnit - 測(cè)試框架
JUnit - 套件測(cè)試
Junit - 環(huán)境設(shè)置
JUnit - 忽略測(cè)試
JUnit - 使用斷言
JUnit - Eclipse 插件
JUnit - 時(shí)間測(cè)試
JUnit - 編寫(xiě)測(cè)試
JUnit - 框架擴(kuò)展
JUnit - API
JUnit - 異常測(cè)試
JUnit - ANT 插件
JUnit - 基本用法

JUnit - 框架擴(kuò)展

以下是 JUnit 擴(kuò)展

  • Cactus
  • JWebUnit
  • XMLUnit
  • MockObject

Cactus

Cactus 是一個(gè)簡(jiǎn)單框架用來(lái)測(cè)試服務(wù)器端的 Java 代碼(Servlets, EJBs, Tag Libs, Filters)。Cactus 的設(shè)計(jì)意圖是用來(lái)減小為服務(wù)器端代碼寫(xiě)測(cè)試樣例的成本。它使用 JUnit 并且在此基礎(chǔ)上進(jìn)行擴(kuò)展。Cactus 實(shí)現(xiàn)了 in-container 的策略,意味著可以在容器內(nèi)部執(zhí)行測(cè)試。

Cactus 系統(tǒng)由以下幾個(gè)部分組成:

  • Cactus Framework(Cactus 框架) 是 Cactus 的核心。它是提供 API 寫(xiě) Cactus 測(cè)試代碼的引擎。
  • Cactus Integration Modules(Cactus 集成模塊) 它是提供使用 Cactus Framework(Ant scripts, Eclipse plugin, Maven plugin)的前端和框架。

這是使用 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 是一個(gè)基于 Java 的用于 web 應(yīng)用的測(cè)試框架。它以一種統(tǒng)一、簡(jiǎn)單測(cè)試接口的方式包裝了如 HtmlUnit 和 Selenium 這些已經(jīng)存在的框架來(lái)允許你快速地測(cè)試 web 應(yīng)用程序的正確性。

JWebUnit 提供了一種高級(jí)別的 Java API 用來(lái)處理結(jié)合了一系列驗(yàn)證程序正確性的斷言的 web 應(yīng)用程序。這包括通過(guò)鏈接,表單的填寫(xiě)和提交,表格內(nèi)容的驗(yàn)證和其他 web 應(yīng)用程序典型的業(yè)務(wù)特征。

這個(gè)簡(jiǎn)單的導(dǎo)航方法和隨時(shí)可用的斷言允許建立更多的快速測(cè)試而不是僅僅使用 JUnit 和 HtmlUnit。另外如果你想從 HtmlUnit 切換到其它的插件,例如 Selenium(很快可以使用),那么不用重寫(xiě)你的測(cè)試樣例代碼。

以下是樣例代碼。

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 提供了一個(gè)單一的 JUnit 擴(kuò)展類(lèi),即 XMLTestCase,還有一些允許斷言的支持類(lèi):

  • 比較兩個(gè) XML 文件的不同(通過(guò)使用 Diff 和 DetailedDiff 類(lèi))
  • 一個(gè) XML 文件的驗(yàn)證(通過(guò)使用 Validator 類(lèi))
  • 使用 XSLT 轉(zhuǎn)換一個(gè) XML 文件的結(jié)果(通過(guò)使用 Transform 類(lèi))
  • 對(duì)一個(gè) XML 文件 XPath 表達(dá)式的評(píng)估(通過(guò)實(shí)現(xiàn) XpathEngine 接口)
  • 一個(gè) XML 文件進(jìn)行 DOM Traversal 后的獨(dú)立結(jié)點(diǎn)(通過(guò)使用 NodeTest 類(lèi))

我們假設(shè)有兩個(gè)我們想要比較和斷言它們相同的 XML 文件,我們可以寫(xiě)一個(gè)如下的簡(jiǎn)單測(cè)試類(lèi):

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

在一個(gè)單元測(cè)試中,虛擬對(duì)象可以模擬復(fù)雜的,真實(shí)的(非虛擬)對(duì)象的行為,因此當(dāng)一個(gè)真實(shí)對(duì)象不現(xiàn)實(shí)或不可能包含進(jìn)一個(gè)單元測(cè)試的時(shí)候非常有用。

用虛擬對(duì)象進(jìn)行測(cè)試時(shí)一般的編程風(fēng)格包括:

  • 創(chuàng)建虛擬對(duì)象的實(shí)例
  • 在虛擬對(duì)象中設(shè)置狀態(tài)和描述
  • 結(jié)合虛擬對(duì)象調(diào)用域代碼作為參數(shù)
  • 在虛擬對(duì)象中驗(yàn)證一致性

以下是使用 Jmock 的 MockObject 例子。

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