65.9K
CodeProject 正在变化。 阅读更多。
Home

安装程序测试和验证

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.36/5 (6投票s)

2009年6月11日

CPOL

4分钟阅读

viewsIcon

42921

downloadIcon

325

安装程序测试验证器 - 有助于安装程序测试和验证。

引言

iCheckEngine 的主要目的是帮助测试人员进行安装程序测试。通常,在安装程序测试期间,测试人员会对照安装规范中提供的测试场景进行匹配。

这包括针对以下方面的测试:

  1. 文件部署 - 测试数百个文件/文件夹是否已部署,以及它们的文件大小和文件内容。
  2. 注册表 - 测试注册表项的创建及其值。
  3. 可执行文件版本 - 测试部署的可执行文件的版本是否正确。
  4. 数据库 - 与数据库相关的测试,即,表/过程/触发器是否已创建,并且连接和密码是否正确。
  5. XML 配置 - 配置中的 XML 值是否设置正确。
  6. 环境变量设置

注意:以上列表并非详尽无遗,安装程序测试可能需要进行更多测试,欢迎提供意见。

当我们有很多安装程序需要测试时,我们感受到了这个工具的必要性。因此,我努力将其中的一部分自动化。

iCheckEngine 为用户提供以下组件,以测试与安装程序测试相关的场景。每次运行结束时,都可以配置生成文件报告或 HTML 报告

我能够识别出以下组件,它们对于简单的安装测试是必需的(非常欢迎提供意见)

  • 文件 - 文件是否已正确部署,它们的大小、版本、内容等。
  • 注册表 - 注册表项是否已创建,值是否已设置。
  • XML - 如今许多应用程序都将配置存储在 XML 文件中,因此需要检查 XML 节点。
  • 数据库 - 检查与数据库、表、过程和触发器相关的项。
  • 字符串检查 - 测试环境变量是否与某些通用字符串匹配非常有用。

支持两种报告生成方式 - HTML 和基于文件的报告

  • FileLog - 提供用于生成基于文件的报告的有用函数。
  • HtmlLog - 提供用于生成基于 HTML 的报告的有用函数。

理解 iCheckEngine

iCheckEngine 应用程序可分为两部分

  1. iCheckEngine 服务器和解析器:iCheckEngine 服务器和解析器集成在主程序 iCheckEngine.exe 中。组件由一系列 DLL 组成,这些 DLL 暴露一个 Check 函数供 iCheckEngine.exe 调用。
  2. iCheckEngine 组件:组件可进一步分为两部分
    1. 内部 - 集成在主程序 iCheckEngine.exe
    2. 外部 - 它们从 DLL 暴露检查函数
    3. 注意:外部组件需要在 iCheckComponentConfig.xml 文件中显式声明及其公开的方法。为了保持简单,这些导出的方法具有由函数指针 ISimpleFunc 定义的固定签名。

以下是 iCheckEngine 所需的四个重要配置文件

  1. iCheckConfig.xml - 从命令行参数提供给 iCheckEngine 的主配置文件。
  2. 组件文件 - 这些文件的路径在 iCheckConfig.xml 中提到。
  3. 安装检查文件 - 这些文件的路径也包含在 iCheckConfig.xml 中。
  4. 最重要:可以指定多个 InstallCheck 节点。所有文件都将被处理,并根据单独的文件配置生成报告。

  5. 日志文件 - 在解析/执行 iCheckConfig 期间,应用程序活动将记录在此文件的路径中。

下面是 iCheckConfig.xml 的示例内容

<Install-Check version = "1.0.0.1">
    <Components FilePath="C:\iCheckEngine\config\iCheckComponentConfig.xml" />
    <LogFilePath FilePath="C:\iCheckEngine\Logs.txt" />    
    <InstallCheck FilePath="C:\iCheckEngine\config\iCheckSampleTest.xml" />
    <InstallCheck FilePath="C:\iCheckEngine\config\iCheckSampleTest_2.xml" />
</Install-Check>

iCheckComponentConfig.xml 包含外部组件及其公开方法的定义。要添加新组件,需要相应地修改这些文件。

下面是 iCheckComponentConfig.xml 文件的示例内容

<?xml version="1.0" encoding="UTF-8"?> 
<Install-Check>

<Components>
    <File Enabled="TRUE" Path="C:\iCheckEngine\iFileComponent.dll">
        <Methods>                
            <FileExistenceCheck />
            <FileNotExistenceCheck />
            <DirExistenceCheck />
            <DirNotExistenceCheck />
            <FileSizeGreater />    
            <FileSizeLesser />
            <CheckFileVersion />
            <MatchFileContent />
        </Methods>
    </File>

    <Registry Enabled="TRUE" Path="C:\iCheckEngine\iRegistryComponent.dll">
        <Methods>
            <KeyExistenceCheck />
            <KeyNotExistenceCheck />
            <KeyValueCheck />
        </Methods>
    </Registry>            
    <FileLog Enabled="FALSE" Path="C:\iCheckEngine\iFileLog.dll">
        <Methods>
            <WriteReportHeader />
            <WriteReportTrailer />
            <WriteMessage /> 
        </Methods>
    </FileLog>
    <HTMLLog  Enabled="TRUE" Path="C:\iCheckEngine\iFileLog.dll">
        <Methods>
            <WriteHTMLReportHeader />
            <WriteHTMLReportTrailer />
            <WriteHTMLMessage /> 
        </Methods>
    </HTMLLog>

        .....Content Stripped.................

iCheckSampleTest.xml 中的节

  • Variable - 用户定义的变量(注意:环境变量会自动加载)。
  • ExecuteAtStart - 在检查执行开始时调用的组件方法。
  • ExecuteForEachCheck - 在每次调用检查函数时调用的组件方法。
  • ExecuteAtEnd - 在检查执行结束时调用的组件方法。
  • Alerts - 需要在此定义警报。

iCheckSampleTest.xml 包含实际指令,用于调用适当的安装组件函数来执行指定任务。下面是一个包含安装程序检查说明的文件的示例内容:iCheckSampleTest.xml

<Install-Check>
    <Variables>    
    <HTMLFilePath value ="C:\iCheckEngine\Reports\TestHtml.html" />
    <ReportFilePath value ="C:\iCheckEngine\Reports\TestReport.txt" />
    <ErrorFilePath value="C:\iCheckEngine\Reports\Data\Errors.txt" />
    <HTMLHeaderTemplate value="C:\iCheckEngine\ReportTemplates\
                    HTMLHeaderTemplate.txt" />
    <HTMLFootorTemplate value="C:\iCheckEngine\ReportTemplates\
                    HTMLFootorTemplate.txt" />
    <HTMLMessageTemplate value="C:\iCheckEngine\ReportTemplates\
                    HTMLMessageTemplate.txt" />

    <HeaderTemplate value=
        "C:\iCheckEngine\ReportTemplates\HeaderTemplate.txt" />
    <FootorTemplate value=
        "C:\iCheckEngine\ReportTemplates\FootorTemplate.txt" />
    <MessageTemplate value=
        "C:\iCheckEngine\ReportTemplates\MessageTemplate.txt" />
    </Variables>

    <ExecuteAtStart>    
    <!--This function will be called before 
            install-verifier start the check.-->
        
    <HTMLLog>
        <WriteHTMLReportHeader>
        <Parameter Filepath="@HTMLFilePath" HTMLHeaderTemplate="
        @HTMLHeaderTemplate" HTMLFootorTemplate="@HTMLFootorTemplate" 
        HTMLMessageTemplate="@HTMLMessageTemplate"/>
        </WriteHTMLReportHeader>        
    </HTMLLog>
    <FileLog>
        <WriteReportHeader>
         <Parameter  Filepath="@ReportFilePath" HeaderTemplate="
         @HeaderTemplate" FootorTemplate="@FootorTemplate" 
         MessageTemplate="@MessageTemplate"/>
        </WriteReportHeader>    
    </FileLog>
    </ExecuteAtStart>

    <ExecuteForEachCheck>
    <!--This function will be called for each checks and 
    every function it executes.-->
    <FileLog>
        <WriteMessage>
        <Parameter  Message="#OutputMessage" Status="#Status" 
         Check="#CheckName" Component="#Component" Method="#Method" />
        </WriteMessage>
    </FileLog>
    <HTMLLog>
        <WriteHTMLMessage>
         <Parameter  Message="#OutputMessage" Status="#Status" 
         Check="#CheckName" Component="#Component" Method="#Method" />
        </WriteHTMLMessage>
    </HTMLLog>
    </ExecuteForEachCheck>

    <Alerts>
    <Check Id="Test">            
        <StringCheck>
        <Equals>
             <Parameter  String1="@USERNAME" String2="
             bd98101" CaseSensitive="true" />
              <Parameter  String1="@USERNAME" String2="
              bd98101" CaseSensitive="false" />
        </Equals>
        <EqualsLike>
            <Parameter  String1="@OS" String2="windows" 
                    CaseSensitive="true"/>
        </EqualsLike>
        </StringCheck>
            
        <File>                 
        <FileExistenceCheck>
            <Parameter Filepath="C:\AUTOEXEC.BAT" />
            <Parameter Filepath = "C:\FileNotExist.txt" />
        </FileExistenceCheck>
        <CheckFileVersion>
            <Parameter Filepath = "C:\WINNT\TASKMAN.EXE" 
            Version = "5.0.2134.1"/>
        </CheckFileVersion>
        <MatchFileContent>
            <Parameter File1 = "C:\iCheckEngine\TempFiles\File1.txt" 
            File2 = "C:\iCheckEngine\TempFiles\File2.txt" 
            CaseSensitive="true"/>
        </MatchFileContent>
        </File>        
    </Check>

    <Check Id="CheckDirectoryExist">
        <File> 
        <DirExistenceCheck>
            <Parameter Dirpath="C:\Winnt"/>
            </DirExistenceCheck> 
            <DirExistenceCheck>
            <Parameter Dirpath="@windir\system32"/>
        </DirExistenceCheck>
        </File>
    </Check>            

    <Check Id="CheckFileSizes">
        <File> 
        <FileSizeGreater>
            <Parameter Filepath="C:\Test.txt" size="10240" />
        </FileSizeGreater>    
        <FileSizeLesser>
            <Parameter Filepath="C:\Test.txt" size="10240" />
        </FileSizeLesser>
        </File>
    </Check> 
        
    <Check Id="CheckRegistry">
        <Registry> 
        <KeyExistenceCheck>
                <Parameter KeyPath="SOFTWARE\Microsoft\
            Internet Explorer\W2kVersion" 
            KeyNode="HKEY_LOCAL_MACHINE"/>
        </KeyExistenceCheck>

        <KeyValueCheck>
            <Parameter ExpectedValue="6.0.2800.1106" 
              ValueName="W2kVersion"
            KeyPath="SOFTWARE\Microsoft\Internet Explorer" 
            KeyNode="HKEY_LOCAL_MACHINE"/>
        </KeyValueCheck> 
        </Registry>
    </Check> 
    </Alerts>
        
    <ExecuteAtEnd>
    <!--This function will be called after install-verifier completes the check.-->
    
        <HTMLLog>            
                <WriteHTMLReportTrailer>
           <Parameter Filepath="@HTMLFilePath" GeneratedDateTime="
           #CurrentDateTime" TotalCheck="#TotalCheck" SuccessCount="
           #SuccessCount" FailedCount="#FailedCount" 
        iVersion = "#iVersion"/>
              </WriteHTMLReportTrailer>
        </HTMLLog>        
        <FileLog>
        <WriteReportTrailer>
           <Parameter Filepath="@ReportFilePath" GeneratedDateTime="
           #CurrentDateTime" TotalCheck="#TotalCheck" SuccessCount="
           #SuccessCount" FailedCount="#FailedCount" iVersion = "#iVersion"/>
             </WriteReportTrailer>
        </FileLog>    
    </ExecuteAtEnd>
</Install-Check>

我相信“一张图片胜过千言万语”,而对于编码来说,输出就代表了大约一千行代码……

HTML 输出示例

文本输出示例

iCheckText_Output.JPG

谢谢

特别感谢Alex Hazanov 为他提供的 XML Wrapper,它有助于读取 XML 文件。

历史

  • 更新 2009 年 6 月 22 日
    • 源代码下载文件
      • 修复了与 Debug 和 Release 版本相关的编译器问题。
      • 现在使用通用路径,允许项目提取到任何文件夹并运行。
    • 文章文本
      • 在文章中添加了 HTML 和 TEXT 输出图像。
    s
© . All rights reserved.