熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

Jacks:Java兼容性測試,開放源碼之路

2013-11-23 17:58:30  來源: Javascript 
什麼是 Jacks?

  Jacks 測試套件檢查 Java 編譯器是否符合 JLS(Java 語言規范)它由大量小測試案例組成每個測試都側重於 JLS 中特定的部分Eric Blake 為 Jacks 項目作出了很大貢獻他從面向細節領域描述了這種類型測試的好處通過生成帶有指定編譯行為的小測試案例然後將每個案例的執行自動化編譯器作者或調試者可以快速找出 Java 源碼到字節碼轉換中存在的問題

  開發 Jacks 背後的概念是要簡化對多編譯器或多編譯器配置所運行的測試(例如對上兩個發行版的 Jikes 和 Javac 的 JDK 發行版所進行的一組測試)如果手工進行您必須重復地設置環境變量然後根據所期望的結果來檢查測試結果而通過使用 Jacks只需要更改到存放測試的目錄 調用 Jacks 框架然後表明應該使用哪個編譯器配置

  Sun 沒有履行對 Java 開發者所做的承諾激發了 Jikes 小組對 Jacks 項目的設置和運行Sun 再三聲明它會把 JavaJCK(Java Compatibility Kit)和相關 Java 技術交到一個標准主體的手中但因為這還沒有實現從事 Java 項目的開發者就不能使用 JCK 來對日常的開發進行回歸測試當面對由於不合理的許可證限制而導致的代碼人為不足時他們傾向於用新的更完善的系統來替換舊系統這就是發生在 Jacks 上的故事(盡管 Jacks 由 developerWorks 主持它受 GPL 而非 IBM Public License 約束

  使用 Jacks

  Jacks 是以 Tcl 編寫的因此需要確保擁有 Tcl (需要版本 來確保具有 tcltest 擴展和 Unicode 支持這兩者都是 Jacks 所必需的)可以下載用於 Windows 的安裝程序和用於 Red Hat x 的 RPM也可以更方便地從源代碼中構建如果您不知道到什麼地方下載請參閱本文稍後的 參考資料 部分如果使用的是 Red Hat 很可能已安裝了 Tcl

  安裝了 Tcl 後需要從 CVS 取出 Jacks然後通過將編譯器路徑名包括在要測試的編譯器的 Jacks _setup 配置文件中來配置 Jacks對於每個希望支持的配置都需要一個 _setup 文件例如Jacks 帶有 javac_setup 文件需要編輯該文件來為 javac 設置路徑Eric Blake 說最困難的部分是斷定如何測試 Jikes因為我在環境中已設置了 JIKESPATH但我想出了要在 jikes_setup 配置文件中更改什麼內容一切都很順利

  從 CVS 模塊中取出 Jacks 源代碼

  setenv CVSROOT :pserver:anoncvs@:/usr/cvs/jikes
cvs login

  paswsd anoncvs

  cvs checkout jacks
 

  可以對數量不限的編譯器或編譯器配置使用 Jacks要除去某一編譯器的配置只需要刪除其 _setup 文件

  從 CVS 中取出源代碼後就需要在路徑中包括頂層 Jacks 目錄這樣才能運行 Jacks shell 腳本為謹慎起見最初運行 shell 腳本時應該不帶任何自變量以確保每項都經過正確配置

  % jacks

  如果一切正常將看到 Jacks 腳本所接受的命令行選項的清單如果收到錯誤請檢查在路徑中是否能找到可執行文件 tclshWindows 用戶需要直接運行 tclsh並將 jackstcl 自變量在一般標志之前傳遞給它還應該考慮安裝 Cygwin UNIX 兼容性層這樣象 Unix 用戶一樣您就可以使用提供的 shell 腳本來運行 Jacks 了下面的指令假設您使用的是 shell 腳本

  對於測試示例需要使用 Jikes 編譯器來運行給定子目錄中的所有測試命令如下

  % cd tests/jls/packages/packagedeclarations/unnamedpackages

  % jacks jikes
 

  開發新的回歸測試

  開發新的 Jacks 測試案例非常簡便照 Eric Blakes 的話說基本上您設計一個簡單的源文件來測試問題將它放在特定的 Jacks 格式中然後運行 Jacks如果編譯器結果與所期望的結果不一樣它打印出錯誤這裡是 Jacks 主頁上教程中有關添加新測試案例的一例

  // File SynchronizedInterfacejava
public synchronized interface SynchronizedInterface {}
 
  使用 Jikes 編譯時生成以下錯誤

  % jikes SynchronizedInterfacejava

  Found semantic error compiling SynchronizedInterfacejava:

   public synchronized interface SynchronizedInterface {}

  <>

  *** Error: synchronized is not a valid interface modifier

  如果很快看一下 JLS 的第 會發現 synchronized 在該上下文中不是合法的修飾符如果嘗試使用早期發行版 JDK 中的 Javac 編譯器來編譯相同的類則不會生成錯誤(該錯誤在稍後的發行版中得到修正)

  % javac SynchronizedInterfacejava

  現在既然問題得以重現可以通過以下步驟來對 Jacks 測試套件添加回歸測試案例

  了解應該將測試案例放在哪個目錄中

  編寫回歸測試

  在 Jacks 框架中運行新測試

  tcltest 框架中回歸測試的格式是

  tcltest::test NAME DESCRIPTION {
  COMMANDS

  } EXPECTED_RESULT
 

  這是 JLS 第 節中的第一個測試所以 NAME 是

  該測試案例在目錄 tests/jls/interfaces/interfacedeclarations/interfacemodifiers (位置基於 JLS 節的名稱)中

  DESCRIPTION 可以是任何想要的內容

  COMMANDS 一節包含了所有 Tcl 命令但大多數情況只需要 Jacks 中的 saveas 和 compile 方法

  saveas 命令使用兩個自變量文件名和將保存到文件中的數據

  saveas SynchronizedInterfacejava \
{public synchronized interface SynchronizedInterface {}}
 
  compile 命令使用任意數量的命令行自變量並將它們傳遞給 Java 編譯器它將返回 PASSFAIL 或 WARN 來表明編譯器的退出狀態

  EXPECTED_RESULT 是希望從 compile 命令獲得的結果

  在該接口示例中編譯應該不成功因此完整的回歸測試應該類似於

  tcltest::test {should generate error on synchronized interface} {
saveas SynchronizedInterfacejava \

  {synchronized interface SynchronizedInterface {}}

  compile SynchronizedInterfacejava

  } FAIL
 
  檢驗結果

  運行測試並檢查結果是完全自動的因此可以真正地休息一下看看出現的結果Jacks 框架在測試目錄中遞歸下降運行它所找到的所有測試

  如果一切正常就不打印任何消息如果測試失敗將打印有關失敗的描述如 Mo Dejong 在 清單 中顯示的那樣該例演示了 Javac 中因為第一個構造器調用第二個構造器第二個又調用第一個所造成的錯誤JLS 規定這是非法的(第 節)因此如果檢測到這種情況Java 編譯器必須用信號通知該錯誤

  讓我們看看 Jikes 對於同一測試案例是如何做的在 清單 我們將使用 Jacks 中的一些特性可以讓您將模式作為 Jacks 腳本的第三個自變量傳遞將跳過那些名稱與模式不匹配的測試案例在這個小案例中模式就是測試案例的名稱在該例中請注意我們所感興趣的那個測試案例是如何通過的其它測試案例是如何跳過的上面的輸出表明在 Javac 編譯器中找到的錯誤在 Jikes 中並不存在

  盡管人類可讀的結果非常有用但在您有許多要處理的測試案例的情況下它們很快就會變得非常難於管理Jacks 最近慶祝了一個重要的裡程碑現在它包含了逾 個 JLS 獨立測試案例有了這麼多的測試案例沒人能夠記住在某一時刻哪些案例通過了哪些又失敗了但不用害怕Jacks 包括了一系列記錄和測試結果分析特性能夠隨時間跟蹤測試結果這是一項關鍵特性因為它為 Java 編譯器開發者提供了一種跟蹤錯誤修正狀態和可能回歸的方法

  如何編寫 Jacks以及為什麼使用 Tcl

  當實現例如 Jacks 這樣的測試套件時腳本語言是個很自然的選擇而使用 Tcl 也有以下幾個原因

  Tcl 是開放源碼因此在今後的一段時間內仍然會繼續存在

  易於安裝不需要編譯腳本

  易於讀寫腳本語言遠比 C/C++ 更易於掌握

  易於使用字符串處理和常規規則表達式特性

  高度可移植在比 Java 多的平台上運行

  過去十年中成功地在幾千個組織中使用過

  具有諷刺意味的是它曾是 Sun 項目 :)

  Mo DeJong 說Jacks 最了不起的一個特性是自生成文檔 在 Jacks 主頁上您可以找到到達測試案例索引頁面的鏈接這些頁面列出了所有可用的測試案例它以幾種有用的方式進行索引和交叉引用可以方便地通過名稱查找測試案例也可以通過現有測試來發現某個 JLS 章節的內容是多麼完善Tcl 高度動態的語言特性使自記錄測試案例的實現更容易

  到目前為止Jacks 支持以下幾種 Java 編譯器

  JDK 也可以使用但已經過時了)

  JikesIBM 的開放源碼 Java 編譯器

  Kaffe利用了 Kopi 編譯器

  GCJ到 gcc 的 Java 前端

  隨處改進 Java 編譯器

  Jacks 最初著重只為 Jikes 項目提供編譯器測試原來的目標是要替換為 Jikes 創建的自制測試系統但這個初衷由於太難建立和使用而被放棄了人們很快發現如果測試套件變得更常規一些就可以為其它 Java 編譯器項目使用這樣將會導致已提交測試案例在數量上的增加至少讓其它 Java 專家評估一下正確性測試案例也並無大礙

  Jikes 項目自然大大利用鑒了 Jacks但 GCJ 和 Kopi 編譯器項目又如何呢?Tom TromeyRed Hat 的常任 Java 領導者已經意識到了 Jacks 開發對於 GCJ 項目的作用Jacks 對於 GCJ 項目已經有了實際意義每當我在進行前端編譯器更改時就會運行 Jacks並定期使用 Jacks 查找 GCJ 中的錯誤我發現添加測試是樁小事框架非常易於使用考慮也很周到

  在第一次運行了 Jacks 後Kopi 編譯器的項目經理 Thomas Graf 也成了一個擁戴者第一次運行產生了 個失敗的測試在基於對某些失敗測試的分析而應用一些修正後失敗的測試數為 這些結果非常振奮人心(對於 Jacks:)結論是Jacks 測試套件對於提高編譯器的質量來說確實是一種非常有價值的工具!


From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25464.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.