测试执行

Test Execution 是建立在 Total Control 基础上的自动化测试框架。该框架基于XML设计,帮助用户轻松对多个应用或单个应用的不同模块进行全面测试。通过采用结构化的方法,让用户能够方便地定义测试套件、测试工具和依赖关系,实现模块化和可重用性。该框架利用stest框架中的FindNode和assert机制,帮助定位应用中的特定元素,并检查它们的属性或行为,确保每个部分都正常工作。

结构和组件



测试控制器(Test Harness)

测试控制器是用于组织测试执行的顶层容器。它可以引用测试套件文件(Test Suite)和其他测试控制器文件,允许以层次结构组织测试。这种结构使测试人员能够根据测试阶段的范围和需求,灵活地对测试进行逻辑分组,并在不同的细粒度级别执行测试。

  • TestSuiteFile:指向包含测试套件定义的外部 XML 文件,其中包括一组旨在测试应用程序特定功能或特性的测试脚本。
  • TestHarnessFile:引用另一个测试控制器 XML 文件,支持测试环境的嵌套。这一功能允许创建复杂的测试场景,其中更高级别的控制器负责管理更为专业的子控制器和测试套件的执行。

每个应用程序至少需要一个包含一个或多个套件文件的控制器文件。



测试套件(Test Suite)

每个测试套件的 XML 文件都封装了一系列测试脚本,每个脚本都有唯一标识符和可选的依赖项。套件中包含详细的配置,例如开始日期、时间、迭代次数以及测试运行规范,以便选择性地执行测试。

  • TestScripts:定义作为套件一部分运行的各个测试,每个脚本都包含测试代码的路径和唯一的前缀。这确保了测试按正确的顺序执行,维护测试环境的完整性。
  • TestRun:这是一个可选元素,允许测试人员指定应在套件中执行的确切测试。测试 ID 可以单独列出或以范围形式列出,为测试执行提供灵活性。


FindNode and assert

测试框架的核心在于每个测试脚本中使用的 FindNode 和 assert 函数。FindNode 负责在被测应用程序中定位特定元素,使用名称、ID 或其他属性作为标识。一旦找到元素,assert 语句会用来验证其属性,如文本内容、颜色、可见性或其他相关属性。这种方法确保每个元素不仅存在,而且按预期行为运行,从而为验证复杂应用程序的功能提供了强大的机制。assert 失败则意味着测试失败,否则即为通过。



结论

这个基于 XML 的测试框架为管理多个应用程序或单个应用程序的各个部分的大规模测试活动提供了强大且灵活的解决方案。其层次化结构与 FindNode 和 assert 函数的精确性相结合,提供了一个全面的工具集,确保应用程序的质量和可靠性。通过将测试定义和配置集中在 XML 文件中,该框架方便了测试组件的维护、可扩展性和可重用性,使其成为任何严格测试流程中的宝贵资产。

示例



测试控制器(Test Harness)

测试控制器作为我们测试层级中的根级别,负责协调多个测试套件的执行,必要时也可以管理其他测试控制器。这种方式使我们能够灵活扩展,测试应用程序中的各种组件。

<TestHarness>
    <Name>主应用程序测试控制器</Name>
    <TestSuiteFiles>
        <TestSuiteFile path="path/to/ui_tests.suite" />
        <TestSuiteFile path="path/to/api_tests.suite" />
        <!-- 可以在此处添加其他测试套件文件 -->
    </TestSuiteFiles>
    <TestHarnessFiles>
        <!-- 如果此测试控制器需要运行其他测试控制器 -->
        <TestHarnessFile path="path/to/another_harness.harness" />
        <!-- 可以在此处添加其他测试控制器文件 -->
    </TestHarnessFiles>
</TestHarness>
  • <Name>:标识测试控制器,提供其管理的测试范围的上下文信息。
  • <TestSuiteFiles>:列出该控制器中包含的测试套件 XML 文件,每个文件针对不同的测试场景或应用程序模块。
  • <TestHarnessFiles>:(可选)包括对其他测试控制器的引用,支持嵌套或层次化的测试结构。


测试套件(Test Suite)

测试套件是针对应用程序中特定功能或特性的测试脚本集合。它们旨在将相关测试分组,以便高效执行和管理。在此版本中,设计被简化,将 ID 和依赖项推送到各个脚本中。

<TestSuite>
    <Name>UI Test Suite</Name>
    <AppName>com.example.myapp</AppName>
    <Description>应用程序的用户界面功能测试</Description>
    <TestScripts>
        <TestScript prefix="LP">
            <Path>tests/ui/login_page_tests.py</Path>
        </TestScript>
        <TestScript prefix="SM">
            <Path>tests/ui/message_sending_tests.py</Path>
        </TestScript>
        <!-- 根据需要添加更多 TestScript 条目 -->
    </TestScripts>
</TestSuite>
  • <TestSuite>:定义测试套件的根元素。它封装了与特定套件相关的所有信息和测试脚本。
  • <Name>:提供测试套件的名称。在此示例中,“UI Test Suite”表示此套件包含与应用程序用户界面相关的测试。
  • <AppName>:该元素指定测试套件所针对的应用程序包名称。例如,com.example.myapp 表示被测应用程序的唯一包名称。
  • <Description>:提供测试套件目的或覆盖范围的简要描述。这为套件的测试内容提供了上下文,特别适用于文档编写和快速概览。
  • <TestScripts>:此元素包含一组 <Script> 元素。每个 Script 定义了属于该套件的单个测试脚本。
  • <TestScript>:此元素定义测试脚本的路径。每个测试脚本包含多个具有唯一前缀的测试用例(其他应用程序可以使用相同前缀)。脚本自行定义其整数 ID。一个测试用例通过“<Prefix>:<ID>”来标识。


测试执行配置 (TestExecutionConfiguration(TEC))

该组件概述了测试执行的动态方面,如开始时间、设备规格、迭代次数以及需要运行的特定测试。这允许根据各种场景和需求灵活地执行测试。

<TestExecutionConfiguration>
    <Target>
        <Type>Harness</Type>
        <FilePath>path/to/mainApplicationTestHarness.harness</FilePath>
    </Target>
   <LogConfiguration>
        <ReportLogPath>report.log</ReportLogPath>
        <ExecutionLogPath>test.log</ExecutionLogPath>
    </LogConfiguration>
    <StartTime>2024-04-10T08:00:00</StartTime>
    <Devices>
        <Device name="Pixel 4"/>
        <Device androidVersion="10" count="10"/>
        <Device name="Galaxy S20"/>
        <Device groupName="group1"/>
        <Device androidVersion="14" count="10"/>
        <Device groupName="group2" androidVersion="14"/>
        <Device groupName="group2"/>
    </Devices>
    <Iterations>5</Iterations>
    <TestRun>
        <Include>LP:1</Include>  <!-- 登录页面测试中的测试 ID 1 -->
        <Include>LP:2-4</Include>  <!-- 登录页面测试中的测试 ID 2 到 4 -->
        <Include>SM:10</Include>  <!-- 发送消息测试中的测试 ID 10 -->
    </TestRun>
</TestExecutionConfiguration>
  • <Target>:此新元素封装了测试集合(测试控制器或测试套件)的详细信息,执行配置适用于该集合。
    • <Type>:指定目标是测试控制器还是测试套件。这有助于测试执行引擎确定如何应用配置。
    • <FilePath>:提供到测试控制器或测试套件 XML 文件的相对或绝对路径。此直接引用确保执行配置明确地应用于目标测试集合。
  • <LogConfiguration>: 用于指定日志文件的文件名和存储路径;如果未指定,日志将默认保存在当前测试执行配置文件的目录中。
    • <ReportLogPath>: 用于指定报告日志(记录测试运行结果的日志)的文件名和存储路径。
    • <ExecutionLogPath>: 用于指定执行日志(用户在测试脚本中自定义的日志)的文件名和存储路径。
  • <StartTime>:指定测试执行应何时开始。
  • <Devices>: 列出将在其中进行测试的设备或环境,按名称和其他相关属性定义。设备将按出现顺序包含在 <Devices> 列表中,“device” 总是包括设备列表中的第一个设备:
    • 设备名称(其他选项将被忽略),如果匹配到多个设备名称,选择第一个。
    • MDCC 中设置的 "groupName" 组名称。
    • “count” 包含设备数量。
    • "androidVersion" 包含 Android 版本号。
    • "groupName" 和 "count" 不能同时存在。
    • 如果仅有 <Device></>,将返回任意一个设备。
  • <Iterations>:确定测试应重复的次数,适用于压力或可靠性测试。
  • <TestRun>:标识要执行的特定测试或测试范围,允许根据当前需求进行选择性测试。形式如下:
    • 如果未定义 TestRun,将运行整个测试控制器。
    • <Include><prefix></Include>:所有该前缀的测试将运行。可以包含多个前缀。
    • <Include><prefix><IDs></Include>:ID 可以包含范围,如 LP:2-4 将运行 LP-2、LP-3、LP-4。

TEC 是可执行的,一旦执行完成,将为 TEC 运行生成两个文件:JSON 格式的结果文件和日志文件。框架将运行“报告生成器”来解析结果和日志文件并处理数据。测试框架捆绑了一个非常基础的报告生成器,用户可以自由选择使用自己的报告生成器。

Total Control 中的实例

Total Control 提供了一个完整的 App 自动化测试示例。安装 Total Control 以后,您可以在这个目录中看到:%appdata%\Sigma-RT\Total Control\modules\test

运行自动化测试



通过命令行运行

打开 Total Control - Script - Terminal,在终端里输入以下命令运行脚本

addToClasspath('C:/Users/admin/AppData/Roaming/Sigma-RT/Total Control/modules/test'); //将路径设置为您的自动化测试脚本所在目录
runTest("TestExecutionConfiguration.tec") //运行测试执行配置文件


通过用户界面运行

通过用户界面,可以方便的生成测试执行配置文件(*.tec)并运行它,也可以编辑已保存的 *.tec 文件。

在 Total Control 的脚本窗口点击 “测试执行器” 打开测试执行器窗口。

点击“+”创建一个新的测试执行配置文件。


  • 名称:您可以为本次执行定义一个名称,非必填。
  • 目标:选择要执行的测试控制器(Test Harness)或测试套件(Test Suite)文件。
  • 设备:择执行测试的设备,如果没有定义,会任选一个设备。
  • 测试运行:标识要执行的特定测试或测试范围,根据当前需求进行选择性测试。如果未定义 TestRun,将运行整个测试控制器(Test Harness)。
  • 迭代次数:默认 1 次,可定义多次。
  • 报告日志:测试运行结果日志,这里可以指定日志存储位置,如未指定,默认保存在当前测试执行配置文件所在的目录。
  • 执行日志:用户在测试脚本中自定义的日志,这里可以指定日志存储位置,如未指定,默认保存在当前测试执行配置文件所在的目录。

创建完成后点击“保存并运行”,指定文件名及保存位置后,开始测试。 (也可以打开已经保存的测试执行配置文件(后缀名为”.tec”),点击“保存并运行”,开始测试。)

可以看到,列表中增加了一条记录。

点击记录后的日志图标可以查看报告日志和执行日志