首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

基於 JUnit 的 InstallAnywhere 安裝程序 GUI 自動測試框架深度解析與擴展

     編輯:Java 相關知識

InstallAnywhere (IA) 提供基於 JUnit 3 的安裝程序圖形界面自動測試框架,解決 Swing/AWT 程序自動測試難題。本文剖析框架架構、四大 Fixture、核心組件協作流程,通過完整範例演示測試用例編寫,並針對框架不足(自定義面板/邏輯不可測、Java 編寫腳本不適合複雜場景)提出擴展方案:擴展事件類型支援自定義面板與業務邏輯、引入 XML 腳本描述測試用例、改進控制器解析執行 XML。

框架架構四大 Fixture

Fixture職責
工作目錄創建測試工作目錄
臨時目錄創建臨時目錄
Java 程序執行啟動 IA 安裝程序 (runInstall)
GUI 自動測試 (核心)測試用例控制器、事件通知服務器、自測試機器人

核心組件協作流程

  1. 測試啟動 → 創建 事件通知服務器 (Socket Server,監聽 12060 端口)
  2. 2. Java 程序執行 Fixture 啟動安裝程序 3. 安裝程序窗口激活/面板顯示 → 發送事件通知 (window.activated:NAME / panel.shown:NAME) 4. 測試用例控制器 按預定序列:
      ① 接收事件驗證流程節點 (waitForWindow/waitForPanel)
      ② 向 自測試機器人 發送系統輸入 (pressEnter/pressTab/type/pressKey)
    5. 直至所有測試完成

實戰範例:三面板安裝程序測試

面板:Introduction → Choose Install Folders → Install Complete

測試方法 (Java)

public class BasicProjectAutomation extends GUIAutomationFixture {
    private static final String NEW_LOCATION = "newlocation";
    private static final String PRODUCT = "BasicProject";
    private static final String BUILD_OUTPUT = "_Build_Output/Web_Installers/InstData/Java";

    public void testInstall() {
        File installer = new File("./" + PRODUCT + BUILD_OUTPUT, "install.jar");
        File installDir = new File("C:/Program Files", NEW_LOCATION);

        setWaitTimeout(30 * SECONDS);
        runInstall(PRODUCT, installer);           // 執行測試用例
        assertInstallerHasCompletedSuccessfully(); // 斷言安裝成功退出
        assertTrue("Install dir created", installDir.exists());
        assertTrue("File copied", new File(installDir, "file-to-install.txt").exists());
    }
}

測試用例定義 (Java)

private void runInstall(String productName, File installer) {
    try {
        launchInstaller(installer.getPath());
        waitForWindow(productName);
        waitForPanel("Introduction");
        pressEnter();                              // 點擊下一步

        waitForPanel("Choose Install Folder");
        pressTab();                                // 定位到路徑輸入框
        for (int i = 0; i < productName.length(); i++) pressKey(KeyEvent.VK_BACK_SPACE);
        type(NEW_LOCATION);                        // 輸入新路徑

        waitForPanel("Install Complete");
        pressEnter();                              // 完成
        waitForInstallerToComplete();
    } finally {
        printJavaOutput("Installer");
    }
}

框架擴展:支援自定義面板、業務邏輯與 XML 腳本

1. 擴展事件類型

  • 自定義面板顯示:cuspanel.shown:PANEL_NAME
  • 自定義業務邏輯激活:cuscode:active:CUSCODE_NAME
protected void waitForCusPanel(String s) { waitForEvent("cuspanel.shown:" + s); }
protected void waitForCusCode(String s) { waitForEvent("cuscode:active:" + s); }

自定義面板/邏輯代碼中需主動發送對應事件通知(Socket 寫入)。

2. XML 測試腳本結構

節點子節點/屬性
Productinstall、uninstall、name、installer、buildOutput
install/uninstallpresenter、pressTab、type、pressKey、releaseKey、waitForWindow、waitForPanel、waitForCusPanel、waitForCusCode、launchInstaller/launchUninstaller、waitForInstallerToComplete
動作屬性pressEnter、pressTab(times)、type、pressKey(times)、releaseKey、waitForWindow、waitForPanel、waitForCusPanel、waitForCusCode、launchInstaller、launchUninstaller、name、waitForInstallerToComplete

3. XML 腳本範例 (替代 Java 用例)

<?xml version="1.0" encoding="UTF-8"?>
<Product name="BasicProject" installer="install.jar" buildOutput="_Build_Output/Web_Installers/InstData/Java">
    <install>
        <waitForWindow>BasicProject</waitForWindow>
        <waitForPanel>Introduction</waitForPanel>
        <pressEnter/>
        <waitForPanel>Choose Install Folder</waitForPanel>
        <pressTab times="1"/>
        <pressKey times="12"/>
        <type>newlocation</type>
        <waitForPanel>Install Complete</waitForPanel>
        <pressEnter/>
        <waitForInstallerToComplete/>
    </install>
</Product>

4. 擴展後架構

新增 XML 解析器 於測試用例控制器,讀取腳本動態構建測試序列,開發者專注測試邏輯編寫,無需關注 Java 語法。

總結與價值

  • IA 原生框架實現了安裝程序 GUI 自動化的基礎能力
  • 擴展事件類型打通自定義面板/邏輯測試堵點
  • XML 腳本降低測試編寫門檻,支援複雜場景、非開發人員參與
  • 4. 為 InstallAnywhere 專案引入測試驅動開發 (TDD) 奠定基礎
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved