安装程序测试和验证






4.36/5 (6投票s)
安装程序测试验证器 - 有助于安装程序测试和验证。
引言
iCheckEngine 的主要目的是帮助测试人员进行安装程序测试。通常,在安装程序测试期间,测试人员会对照安装规范中提供的测试场景进行匹配。
这包括针对以下方面的测试:
- 文件部署 - 测试数百个文件/文件夹是否已部署,以及它们的文件大小和文件内容。
- 注册表 - 测试注册表项的创建及其值。
- 可执行文件版本 - 测试部署的可执行文件的版本是否正确。
- 数据库 - 与数据库相关的测试,即,表/过程/触发器是否已创建,并且连接和密码是否正确。
- XML 配置 - 配置中的 XML 值是否设置正确。
- 环境变量设置
注意:以上列表并非详尽无遗,安装程序测试可能需要进行更多测试,欢迎提供意见。
当我们有很多安装程序需要测试时,我们感受到了这个工具的必要性。因此,我努力将其中的一部分自动化。
iCheckEngine 为用户提供以下组件,以测试与安装程序测试相关的场景。每次运行结束时,都可以配置生成文件报告或 HTML 报告。
我能够识别出以下组件,它们对于简单的安装测试是必需的(非常欢迎提供意见)。
- 文件 - 文件是否已正确部署,它们的大小、版本、内容等。
- 注册表 - 注册表项是否已创建,值是否已设置。
- XML - 如今许多应用程序都将配置存储在 XML 文件中,因此需要检查 XML 节点。
- 数据库 - 检查与数据库、表、过程和触发器相关的项。
- 字符串检查 - 测试环境变量是否与某些通用字符串匹配非常有用。
支持两种报告生成方式 - HTML 和基于文件的报告
- FileLog - 提供用于生成基于文件的报告的有用函数。
- HtmlLog - 提供用于生成基于 HTML 的报告的有用函数。
理解 iCheckEngine
iCheckEngine 应用程序可分为两部分
- iCheckEngine 服务器和解析器:iCheckEngine 服务器和解析器集成在主程序 iCheckEngine.exe 中。组件由一系列 DLL 组成,这些 DLL 暴露一个
Check
函数供 iCheckEngine.exe 调用。 - iCheckEngine 组件:组件可进一步分为两部分
- 内部 - 集成在主程序 iCheckEngine.exe 中
- 外部 - 它们从 DLL 暴露检查函数
注意:外部组件需要在 iCheckComponentConfig.xml 文件中显式声明及其公开的方法。为了保持简单,这些导出的方法具有由函数指针 ISimpleFunc
定义的固定签名。
以下是 iCheckEngine 所需的四个重要配置文件
- iCheckConfig.xml - 从命令行参数提供给 iCheckEngine 的主配置文件。
- 组件文件 - 这些文件的路径在 iCheckConfig.xml 中提到。
- 安装检查文件 - 这些文件的路径也包含在 iCheckConfig.xml 中。
- 日志文件 - 在解析/执行 iCheckConfig 期间,应用程序活动将记录在此文件的路径中。
最重要:可以指定多个 InstallCheck
节点。所有文件都将被处理,并根据单独的文件配置生成报告。
下面是 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 输出示例
文本输出示例
谢谢
特别感谢Alex Hazanov 为他提供的 XML Wrapper,它有助于读取 XML 文件。
历史
- 更新 2009 年 6 月 22 日
- 源代码下载文件
- 修复了与 Debug 和 Release 版本相关的编译器问题。
- 现在使用通用路径,允许项目提取到任何文件夹并运行。
- 文章文本
- 在文章中添加了 HTML 和 TEXT 输出图像。