<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>唬人斯不唬人 &#187; Java</title>
	<atom:link href="http://blog.djh5e.org/archives/tag/java/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.djh5e.org</link>
	<description>唬人的世界, 不唬人的自我</description>
	<lastBuildDate>Fri, 21 Aug 2009 05:32:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Convert HTML content to PDF format</title>
		<link>http://blog.djh5e.org/archives/50</link>
		<comments>http://blog.djh5e.org/archives/50#comments</comments>
		<pubDate>Mon, 10 Apr 2006 14:24:54 +0000</pubDate>
		<dc:creator>Horance Chou</dc:creator>
				<category><![CDATA[野人獻曝]]></category>
		<category><![CDATA[FO]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[XSLT]]></category>

		<guid isPermaLink="false">http://blog.djh5e.org/archives/50</guid>
		<description><![CDATA[過去如果要 HTML to PDF 一直是很麻煩的一件事, 我曾試過用 html2fo, 或是用 JTidy 先把 HTML 轉成 XHTML 後再配合自己寫的 xslt 來作轉換, 不過 javaworld 的這篇文章剛好補上了 JTidy 到 FO 之間的空缺 &#8212; xhtml2fo, 以後可就方便多了! 詳細內容請參考: Convert HTML content to PDF format]]></description>
			<content:encoded><![CDATA[<p>過去如果要 HTML to PDF 一直是很麻煩的一件事, 我曾試過用 <a href="http://html2fo.sourceforge.net">html2fo</a>, 或是用 JTidy 先把 HTML 轉成 XHTML 後再配合自己寫的 xslt 來作轉換, 不過 javaworld 的這篇文章剛好補上了 JTidy 到 FO 之間的空缺 &#8212; <a href="http://www.antennahouse.com/XSLsample/XSLsample.htm">xhtml2fo</a>, 以後可就方便多了!</p>

<p>詳細內容請參考: <a href="http://www.javaworld.com/javaworld/jw-04-2006/jw-0410-html_p.html">Convert HTML content to PDF format</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.djh5e.org/archives/50/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JUnit 簡介與應用 (刊登於 http://www.newzilla.org/   no. 3)</title>
		<link>http://blog.djh5e.org/archives/4</link>
		<comments>http://blog.djh5e.org/archives/4#comments</comments>
		<pubDate>Sun, 17 Jul 2005 14:15:00 +0000</pubDate>
		<dc:creator>Horance Chou</dc:creator>
				<category><![CDATA[野人獻曝]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://blog.djh5e.org/?p=4</guid>
		<description><![CDATA[一.前言： &#8221; 測試&#8221;的目的, 是為了找出&#8221;產品&#8221;和&#8221;設計&#8221;之間的差異。在軟體開發的領域，測試更是驗証軟體功能的重要工作。測試的方法很多，但其中最基本，最直覺的測試，就是由程式 開發人員在撰寫程式元件時所進行的&#8221;單元測試&#8221;(Unit Test)。在現今各種軟體開發方法論中，單元測試之功效漸受重視；在最近幾年被提出的&#8221;極道程式設計法&#8221;*(Extreme Programming, 以下簡稱XP)[1]和&#8221;測試導向開發方法&#8221;(Test-Driven Development, 以下簡稱TDD)[2]之中，單元測試也都被列為推行此兩方法論的要點之一。本文將介紹如何利用Java程式語言最常被使用的單元測試平台-JUnit [3]來撰寫測試案例(Test Case)，以加速開發/測試循環(Developing/Testing iteration)。 *註:此一譯名為唐宗漢先生(Autrijus Tang)在Taipei.PM聚會演講Extreme Programming時所採用的名詞，個人覺得非常貼切，在此沿用他的譯名。 二.JUnit簡介 JUnit 是Erich Gamma及Kent Beck兩位所開發之迴歸測試平台(Regression Testing Framework)。顧名思義，此一平台即是提供Java程式開發人員實作單元測試案例相關API(Application Programming Interfaces, 應用程式介面)。JUnit是一個自由軟體(Open Source Software)[4]。JUnit的授權方式為Common Public License 1.0版，最新的穩定版本是3.8.1，可由Sourceforge[5]取得此一平台的最新釋出版本。 三.為什麼要使用JUnit 不論您所參與的專案是否遵循XP或TDD，單元測試都是免不了的。在XP所定義的規則和實作(Rules and Practices)裡，單元測試佔有很大比重[6]。而由於Java物件導向的語言特性，以及JUnit平台良好的設計架構，我們至少可以獲得下列益處： 1.不用為了單元測試撰寫重覆的程式碼： 使 用JUnit，可以讓開發人員很輕易地建立測試案例，以測試現有物件中的方法(Methods)。使用JUnit平台撰寫單元測試案例，就如同在撰寫一些 由5~10行程式碼所組成的方法一樣簡單-事實上，如果搭配某些開發工具，您甚至不需要撰寫任何程式碼。稍後我們會在實例中證明這一點。 2.JUnit的測試案例可以被組織成測試組合(Test Suites)： JUnit的測試案組合可以包念數個測試案例或其它的測試組合，如此一來開發人員便可以在一個測試動作中完成相關元件的測試。 3.JUnit的測試結果是很容易收集到的： JUnit套件中提供了基本的測試執行環境，例如在文字模式執行的junit.textui.TestRunner，以及在圖型化介面(GUI)下執行的junit.swingui.TestRunner，兩者都有助於開發人員簡單地執行已完成的測試組合或測試案例。 最後，也是最重要的一點：JUnit是自由軟體。 四.如何使用JUnit 1.安裝JUnit： 您可以在任何一個SourceForge映射站台(Mirror site)的下載頁面取得JUnit Framework，如： http://umn.dl.sourceforge.net/sourceforge/junit/junit3.8.1.zip 取 得junit3.8.1.zip後，您可以使用慣用的解壓縮工具將junit3.8.1.zip解開至指定的目錄。 若您希望在您的java執行環境中直接使用JUnit Framework，可以在CLASSPATH環境變數加入junit.jar，請參考各種作業系統下的環境變數設定方式自行設定。 [...]]]></description>
			<content:encoded><![CDATA[<h2>一.前言：</h2>

<p>&#8221; 測試&#8221;的目的, 是為了找出&#8221;產品&#8221;和&#8221;設計&#8221;之間的差異。在軟體開發的領域，測試更是驗証軟體功能的重要工作。測試的方法很多，但其中最基本，最直覺的測試，就是由程式 開發人員在撰寫程式元件時所進行的&#8221;單元測試&#8221;(Unit Test)。在現今各種軟體開發方法論中，單元測試之功效漸受重視；在最近幾年被提出的&#8221;極道程式設計法&#8221;*(Extreme Programming, 以下簡稱XP)[1]和&#8221;測試導向開發方法&#8221;(Test-Driven Development, 以下簡稱TDD)[2]之中，單元測試也都被列為推行此兩方法論的要點之一。本文將介紹如何利用Java程式語言最常被使用的單元測試平台-JUnit [3]來撰寫測試案例(Test Case)，以加速開發/測試循環(Developing/Testing iteration)。</p>

<p>*註:此一譯名為唐宗漢先生(Autrijus Tang)在Taipei.PM聚會演講Extreme Programming時所採用的名詞，個人覺得非常貼切，在此沿用他的譯名。</p>

<p><span id="more-4"></span></p>

<h2>二.JUnit簡介</h2>

<p>JUnit 是Erich Gamma及Kent Beck兩位所開發之迴歸測試平台(Regression Testing Framework)。顧名思義，此一平台即是提供Java程式開發人員實作單元測試案例相關API(Application Programming Interfaces, 應用程式介面)。JUnit是一個自由軟體(Open Source Software)[4]。JUnit的授權方式為Common Public License 1.0版，最新的穩定版本是3.8.1，可由Sourceforge[5]取得此一平台的最新釋出版本。</p>

<h2>三.為什麼要使用JUnit</h2>

<p>不論您所參與的專案是否遵循XP或TDD，單元測試都是免不了的。在XP所定義的規則和實作(Rules and Practices)裡，單元測試佔有很大比重[6]。而由於Java物件導向的語言特性，以及JUnit平台良好的設計架構，我們至少可以獲得下列益處：</p>

<h3>1.不用為了單元測試撰寫重覆的程式碼：</h3>

<p>使 用JUnit，可以讓開發人員很輕易地建立測試案例，以測試現有物件中的方法(Methods)。使用JUnit平台撰寫單元測試案例，就如同在撰寫一些 由5~10行程式碼所組成的方法一樣簡單-事實上，如果搭配某些開發工具，您甚至不需要撰寫任何程式碼。稍後我們會在實例中證明這一點。</p>

<h3>2.JUnit的測試案例可以被組織成測試組合(Test Suites)：</h3>

<p>JUnit的測試案組合可以包念數個測試案例或其它的測試組合，如此一來開發人員便可以在一個測試動作中完成相關元件的測試。</p>

<h3>3.JUnit的測試結果是很容易收集到的：</h3>

<p>JUnit套件中提供了基本的測試執行環境，例如在文字模式執行的junit.textui.TestRunner，以及在圖型化介面(GUI)下執行的junit.swingui.TestRunner，兩者都有助於開發人員簡單地執行已完成的測試組合或測試案例。</p>

<p>最後，也是最重要的一點：JUnit是自由軟體。</p>

<h2>四.如何使用JUnit</h2>

<h3>1.安裝JUnit：</h3>

<p>您可以在任何一個SourceForge映射站台(Mirror site)的下載頁面取得JUnit Framework，如：</p>

<pre><font>http://umn.dl.sourceforge.net/sourceforge/junit/junit3.8.1.zip</font></pre>

<p>取 得junit3.8.1.zip後，您可以使用慣用的解壓縮工具將junit3.8.1.zip解開至指定的目錄。 若您希望在您的java執行環境中直接使用JUnit Framework，可以在CLASSPATH環境變數加入junit.jar，請參考各種作業系統下的環境變數設定方式自行設定。</p>

<h3>2.範例：MoneyTest</h3>

<pre lang="java">public static void main(String[] args) {
Money m12CHF = new Money(12, "CHF");
Money m14CHF = new Money(14, "CHF");
Money res = m12CHF.add(m14CHF);
System.out.println("res: " + res.amount() + " " + res.currency());
}</pre>

<p>接著，您打開一個命令列視窗，用 javac compile 您的 Money.java, 再以</p>

<pre>java junit.samples.Money</pre>

<p>來執行這個程式，然後祈導輸出結果是：</p>

<pre>res: 26 CHF</pre>

<p>這樣的寫法是許多程式開發人員最常用的方法，但如此一來，您就必需以人工判斷程式執行是否正常。 現在，讓我們看看如何使用JUnit來建立一個測試案例：</p>

<p>在 您取得的junit3.8.1.zip中包含有一個簡單的JUnit範例，您可以在junit/samples目錄中找到這個範例的原始碼。 現在，您想寫幾個測試案例來測試這個Money物件中的add()方法。回想一下，您是否曾經做過這樣的動作： 在Money物件中加上一段這樣的程式碼：(註：CHF為Swiss Francs的貨幣縮寫，在此保留JUnit範例中的原始用法)</p>

<p>1.撰寫一個 MoneyTest並繼承 junit.framework.TestCase(請參考junit/samples/MoneyTest.java)</p>

<p>2.撰寫一個 testSimpleAdd() method，內容為：</p>

<pre>public void testSimpleAdd () {
Money m12CHF = new Money(12,"CHF");
Money m14CHF = new Money(14,"CHF");
Money expectedReturn = new Money(26,"CHF");
Money actualReturn = m12CHF.add(m14CHF);
assertTrue(expectedReturn.equals(actualReturn));
}</pre>

<p>要 注意的是，當沒有覆載(Override)junit.framework.TestCase物件中的runTest()方法時， TestRunner將會自動執行所有命名以&#8221;test&#8221;為開頭的方法，如testSimpleAdd,testSimpleSub(如果有被定義的話) 等等。 在testSimpleAdd()方法中最後一行的assertTrue()則是JUnit Framework中用來檢查測試結果的API，在本例中若expectedReturn和actualReturn相等時(以equals()方法之傳 回值來認定)，JUnit才會認為此一測試通過。JUnit Framework中還有許多其它的assert方法，例如assertEquals(),assertNotEquals()等，請參考JUnit API Javadoc文件[7]。</p>

<p>3.執行TestRunner，例如：</p>

<pre>java -cp ${CLASSPATH}:/path/to/junit.jar:. junit.textui.TestRunner junit.samples.money.MoneyTest
.

Time: 0.01

OK (1 tests)</pre>

<p>此 處是以文字模示的junit.textui.TestRunner來進行JUnit測試。您可以看到JUnit順利的執行了您的 MoneyTest，並回覆&#8221;OK (1 tests)&#8221;，表示TestRunner進行了一項測試，結果全部通過。您可以將範例中的junit.textui.TestRunner改為 junit.swingui.TestRunner，觀察一下有什麼不同。</p>

<p>4.若您想要在一個測試案例中，進行數項不同測試，而又不想在每個測試方法中撰寫物件宣告實體化測試物件(即new Money(⋯))，此時就可以覆載setUp()和tearDown()方法來預先建立您的&#8221;測試配置&#8221;(Test Fixtures):</p>

<pre>public class MoneyTest extends TestCase {
private Money f12CHF;
private Money f14CHF;
private Money f28USD;

protected void setUp() {
f12CHF= new Money(12, "CHF");
f14CHF= new Money(14, "CHF");
f28USD= new Money(28, "USD");
}
}</pre>

<p>TestRunner在執行時會自動呼叫setUp(),並在結束前呼叫tearDown()方法。物件中所有的測試方法直接使用這三個Money物件。因此，前例的testSimpleAdd可以改寫成：</p>

<pre>public void testSimpleAdd() {
// [12 CHF] + [14 CHF] == [26 CHF]
Money expected= new Money(26, "CHF");
assertEquals(expected, f12CHF.add(f14CHF));
}</pre>

<p>5.那麼，要如何在一次執行中進行多個測試呢? 您可以使用Test Suite(測試組合)來達成：在您的MoneyTest類別加入suite()靜態方法:</p>

<pre>public static Test suite() {
TestSuite suite= new TestSuite();
suite.addTest(new MoneyTest("testMoneyEquals"));
suite.addTest(new MoneyTest("testSimpleAdd"));
return suite;
}</pre>

<p>如 此一來，TestRunner在執行時，便會依您定義的測試組合進行測試。若您沒有為您的 TestCase類別定義suite()方法，那麼TestRunner會自動執行所有以&#8221;test&#8221;開頭之測試方法。 以上介紹了JUnit Framework的基本用法，若您需要更進階的用法，請見第六點中提供的參考資料及延申閱讀。</p>

<h2>五.結語</h2>

<p>JUnit 之所以廣受歡迎，不只是因為他是自由軟體，而是新的開發方法論-如XP及TDD開始受到重視，且開發人員感受到使用JUnit所帶給他們的好處，因而在 Java開發人員中日漸被採用。本文著重介紹JUnit的安裝與基本運用，若能配合XP及TDD等相關開發方法，應該更能體會其中奧妙。最後，希望這篇文 章能讓各位對JUnit有初步的了解，並融入您的開發流程，對您未來的專案開發工作產生助益。</p>

<h2>六.參考資料</h2>

<ol>
    <li><a href="http://www.extremeprogramming.org/">http://www.extremeprogramming.org/</a></li>
    <li><a href="http://www.testdriven.com/">http://www.testdriven.com/</a></li>
    <li><a href="http://www.junit.org/">http://www.junit.org/</a></li>
    <li><a href="http://www.opensource.org/">http://www.opensource.org/</a></li>
    <li><a href="http://sourceforge.net/projects/junit/">http://sourceforge.net/projects/junit/</a></li>
    <li><a href="http://www.extremeprogramming.org/rules.html">http://www.extremeprogramming.org/rules.html</a></li>
    <li><a href="http://junit.sourceforge.net/javadoc/index.html">http://junit.sourceforge.net/javadoc/index.html</a></li>
</ol>

<p>延申閱讀：</p>

<ol>
    <li><a href="http://www.extremeprogramming.org/">Extreme Programming: A gentle introduction. </a></li>
    <li><a href="http://aut.dyndns.org/xp/slides/start.html">極道程式設計法 by Autrijus Tang</a></li>
    <li><a href="http://junit.sourceforge.net/#Documentation">JUnit Documentation</a></li>
    <li><a href="http://www.clarkware.com/articles/JUnitPrimer.html">JUnit Primer</a></li>
    <li><a href="http://www.octopull.demon.co.uk/java/Introducing_JUnit.html">Introducing JUnit by Alan Griffiths </a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.djh5e.org/archives/4/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

