自动批处理测试

本章讨论了自动测试的所有方面,也称为批量测试。包括自动执行测试、将测试分发到不同机器以及处理测试运行生成的结果。(参见,如何进行自动化批量测试。)

自动化测试运行

Squish提供了命令行工具,可以完全自动化测试的运行。执行测试的工具是squishrunner,但为了正常运行,还需要运行squishserver——squishrunner利用squishserver启动AUT并与之通信。

可以在Squish支持的所有平台上创建自动化的批量测试,包括Windows和类Unix平台。

例如,这是一个简单的类Unix外壳脚本,用于执行完整的测试套件~/suite_myapp并将结果保存到~/squish-results-`date`

#!/bin/bash
# add Squish to PATH
export SQUISH_PREFIX=/path/to/squish
export PATH=$SQUISH_PREFIX/bin:$PATH

# Dated directory to store report results:
LOGDIRECTORY=~/squish-results-`date -I`

# Execute the test suite with a local squishserver:
squishrunner --testsuite ~/suite_myapp --local --reportgen xml3.5,$LOGDIRECTORY

由于我们使用了--local,因此不需要在我们的脚本中后台启动单独的squishserver进程。

我们使用--reportgen来指定要生成的输出类型。有关所有报告生成器格式的列表,请参阅squishrunner –reportgen:生成报告

这是一个类似示例,用于Windows和标准的cmd.exe外壳。由于Windows变量%DATE%有时使用点,有时使用破折号或其他字符分隔数字,所以它不能在某些区域设置中用作目录名。

REM add Squish to PATH
set SQUISH_PREFIX=C:\path\to\squish
set PATH=%SQUISH_PREFIX%\bin;%PATH%

REM The Log Directory does not (but perhaps should) have today's date in it:
set LOGDIRECTORY=%USERPROFILE%\squish-results

REM Execute the test suite with a --local squishserver:
squishrunner --testsuite %USERPROFILE%\suite_myapp --local --reportgen "xml3.5,%LOGDIRECTORY%"

使用此类外壳脚本和批处理文件的一个缺点是,对于跨平台测试,我们必须为每个平台维护单独的脚本。我们可以通过使用跨平台脚本语言来避免这个问题,这将使我们能够编写一个脚本,并在所有感兴趣的平台上运行。以下是一个Python示例脚本,可以在SQUISHDIR/examples/regressiontesting/squishruntests-simple.py中找到。

#!/usr/bin/env python
# -*- encoding=utf8 -*-
# Copyright (C) 2018 - 2021 froglogic GmbH.
# Copyright (C) 2022 The Qt Company Ltd.
# All rights reserved.
#
# This file is part of an example program for Squish---it may be used,
# distributed, and modified, without limitation.
#
# For a script with more options and configurability, see 'squish6runtests.py'
# This script assumes squishrunner and squishserver are both in your PATH

import os
import sys
import subprocess
import time

def is_windows():
    platform = sys.platform.lower()
    return platform.startswith("win") or platform.startswith("microsoft")

# Create a dated directory for the test results:
LOGDIRECTORY = os.path.normpath(
    os.path.expanduser("~/results-%s" % time.strftime("%Y-%m-%d"))
)

if not os.path.exists(LOGDIRECTORY):
    os.makedirs(LOGDIRECTORY)

# execute the test suite (and wait for it to finish):
exitcode = subprocess.call(
    [
        "squishrunner",
        "--testsuite",
        os.path.normpath(os.path.expanduser("~/suite_myapp")),
        "--local",
        "--reportgen",
        "xml3.5,%s" % LOGDIRECTORY,
    ],
    shell=is_windows(),
)
if exitcode != 0:
    print("ERROR: abnormal squishrunner exit. code: %d" % exitcode)

此脚本与前面显示的Unix外壳脚本和Windows批处理文件执行相同的工作,并假设squishrunner和squishserver在PATH中。它可以在Windows、macOS和其他类Unix系统上运行而无需任何更改。它还检查squishrunner的返回码,以检测异常终止。

squishrunner将运行指定的测试,进行所有必要的初始化和清理。然后可以根据需要后处理生成的报告——有关详细信息,请参阅处理测试结果

一旦我们在所有期望的平台上运行此脚本,我们必须确保它可以自动运行,比如每天一次。如何做到这一点超出了本手册的范围,但如果您需要帮助,您始终可以联系Qt支持中心以获得帮助。由于Windows服务不支持运行GUI应用程序的显示,因此无法将squishserver作为Windows服务执行。

分布式测试

在整个手册中,通常假定所有测试都是在本地进行的。这意味着squishserver、squishrunner和AUT都在同一台机器上运行。这种场景并非唯一可能的情况,在本节中我们将了解如何在不同机器上远程运行测试。例如,假设我们在计算机A上工作和测试,而想要测试位于计算机B上的AUT。

第一步是将Squish和AUT安装到目标计算机(计算机B)上。注意,对于Squish for Web,我们不需要执行此步骤。现在——除非我们在计算机B上使用Squish for Web——我们必须告诉squishserverAUT的可执行文件名及其位置。这是通过运行以下命令实现的:

squishserver --config addAUT <name_of_aut> <path_to_aut>

稍后,我们将从计算机A连接到计算机B上的squishserver。默认情况下,squishserver只接受来自本地机的连接,因为接受来自其他地方的任意连接可能会危害安全。因此,如果我们想从另一台机器连接到squishserver,我们必须首先注册将尝试建立连接来执行测试的机器(本例中的计算机A),以及运行AUT和squishserver的机器(计算机B)。这样做可以确保只有受信任的机器才能使用squishserver进行互连。

要执行注册,在AUT的机器(计算机B)上,我们创建一个名为/etc/squishserverrc的纯文本文件,编码为ASCII(在Unix或Mac上)或c:\squishserverrc(在Windows上)。如果您没有对/etcc:\的写入权限,您也可以将此文件放置在两个平台的SQUISH_ROOT/etc/squishserverrc中。(在Windows上,您可以选择将文件命名为squishserverrcsquishserverrc.txt)。文件应包含以下内容

ALLOWED_HOSTS = <ip_addr_of_computer_A>

<ip_addr_of_computer_A>必须是计算机A的IP地址。(需要一个实际的IP地址;使用主机名是无效的。)例如,在我们的网络上,这一行是

ALLOWED_HOSTS = 192.168.0.3

这几乎肯定与您的网络不同。

如果您想指定应该允许连接到squishserver的几个机器的IP地址,您可以在ALLOWED_HOSTS行上放置尽可能多的IP地址,用空格分隔。如果您想允许具有类似IP地址的一组机器,可以使用通配符。例如,要允许所有以192.168.0开头的IP地址的机器连接到本squishserver,您可以指定IP地址为192.168.0.*。

一旦我们注册了计算机A,我们就可以在计算机B上运行squishserver,准备监听连接,现在这些连接可以来自计算机B本身或任何允许的主机,例如来自计算机A。

现在我们已准备好在计算机A上创建测试用例并让它们在计算机B上执行。首先,我们必须在计算机B上启动squishserver(使用默认选项在4322端口启动;有关可用选项的列表,请参阅squishserver

squishserver

默认情况下,squishide在启动时会在本地启动squishserver并连接到本地的squishserver以执行测试。要连接到远程机器上的squishserver,请选择编辑 > 偏好设置 > Squish > 服务器 > 添加 > 远程服务器,并在主机名/IP字段中输入运行远程squishserver的机器的IP地址(计算机B)。只有当squishserver使用非标准端口启动时,才更改端口号。在这种情况下,将其设置为与远程机器上使用的端口号相匹配。

服务器偏好设置面板

现在我们可以像平常一样执行测试套件。一个明显的不同之处在于,AUT不是在本地启动,而是在远程服务器上启动。测试完成后,结果将如往常一样在计算机A上的squishide中可见。

还可以使用命令行进行远程测试。命令与之前描述的相同,只是这次我们必须使用--host选项指定主机名。

squishrunner --host computerB.froglogic.com --testsuite suite_addressbook

可以指定为主机名或IP地址。

这使得通过squishide在远程机器上创建、编辑和运行测试成为可能。通过将--host选项添加到用于自动运行测试的shell脚本、批处理文件或其他脚本文件中,还可以自动化位于不同机器和平台上的应用程序的测试,正如我们之前所看到的——自动化测试运行

注意: Squish工具在执行时始终会检查它们的许可密钥。在使用单台机器时这不应成问题,但可能会在多台机器使用时引起问题。如果默认的许可密钥目录不适合用于自动化测试,可以通过将环境变量SQUISH_LICENSEKEY_DIR设置为所需的目录来更改它。这可以在shell脚本或批处理文件中完成。请参阅环境变量

处理测试结果

在前一节中,我们了解了如何在受控的另一台机器上执行AUT及其测试,以及如何通过脚本和批处理文件自动执行测试。在本节中,我们将通过将XML报告上传到Squish测试中心来查看如何处理自动测试运行的测试结果。

默认情况下,squishrunner会将测试结果打印到stdout作为纯文本。要使squishrunner使用XML报告生成器,请在命令行上指定--reportgen xml3.5。如果您想将XML输出写入文件而不是stdout,请指定--reportgen xml3.5,directorypath,例如:

squishrunner --host computerB.froglogic.com --testsuite suite_addressbook_py --reportgen xml3.5,/tmp/results

XML报告将被写入目录/tmp/results

接下来,我们可以使用testcentercmd命令行工具将报告上传到Squish测试中心以进行进一步分析。

testcentercmd --url=http://localhost:8800 --token=MyToken upload AddressBook /tmp/results --label=MyLabelKey1=MyLabelValue1 --label=OS=Linux --batch=MyBatch

上述命令具有以下选项。

  • Squish测试中心运行实例的URL http://localhost:8800
  • 上传令牌,MyToken。请参阅Squish测试中心文档获取更多详细信息。
  • 命令,upload
  • 项目名称,在这种情况下为AddressBook
  • 上传的XML测试结果目录(或压缩文件)
  • 0或多个标签,或用于在数据库中对结果进行标记的key=value对
  • 可选的批次名称,MyBatch,也用于Squish测试中心数据库的整理。

项目名称、批次和标签是在Web界面中组织和选择测试报告的概念,详情请参阅此处

xml报告格式

文档以<?xml?>标签开始,该标签标识文件为XML文件并指定编码为UTF-8。接下来是Squish特定的内容,从SquishReport标签开始,在Squish 6.6中,该标签具有设置为3.4的版本属性。此标签可能包含一个或多个test标签。这些test标签可能是嵌套的——即可以在测试中存在测试,但在实践中Squish使用顶级test标签表示测试套件,嵌套的test标签表示测试套件中的测试用例。(如果我们从测试结果视图导出结果,则测试套件将没有外部的test标签,而是有一系列test标签,每个标签代表执行的一个测试用例。)

测试标签(test)有一个用于存储测试类型的type属性。每个测试标签(test)必须包含一个作为其第一个子元素的prolog标签,并将其time属性设置为以ISO 8601格式表示测试执行开始的时刻。同时,必须包含一个作为其最后一个子元素的epilog标签,并以ISO 8601格式设置测试执行结束的时刻。在prolog标签和epilog标签之间,必须有至少一个verification标签,并且可以有任意数量的message标签(包括没有)。

每个verification标签可能包含几个子元素。

uri标签包含执行测试脚本或验证点的相对路径和文件名,而lineNo标签包含执行验证的文件中的行号。如果urix-testsuite:x-testcase:x-results:开头,则路径相对于测试套件、测试用例或结果目录。如果文件路径超出了这些目录,则uri标签将包含绝对文件路径。

scriptedVerificationResult标签用于指定验证点类型。还有其他可能的类型:screenshotVerificationResultpropertyVerificationResulttableVerificationResult

screenshotVerificationResult用于屏幕截图验证,或propertyVerificationResult用于属性验证(例如对布尔测试.vp(name)功能的调用)或者对其他任何类型的验证(例如对布尔测试.verify(condition)函数的调用),空字符串用于其他类型的验证,tableVerificationResult用于表格验证点的结果。

每个验证点的结果标签有两个属性:一个将结果生成时间设置为ISO 8601格式的time属性,以及一个将值设置为PASSFAILXPASSXFAILFATALERROR之一的type属性。此外,scriptedVerificationResult标签应包含至少一个描述结果的detail标签。通常,有两个标签:一个用于描述结果,另一个提供更详细的结果描述。对于屏幕截图验证,将包含额外的标签,一个objectName,其中包含相关GUI对象的符号名称,以及一个failedImage,其中包含实际图像的URI(对于失败,即实际图像与预期图像不同的情况)。

除了verification标签外,在相同级别(即作为test标签的子元素),可以有零个或多个message标签。这些标签有两个属性,一个将消息生成时间设置为ISO 8601格式的time属性,另一个将值设置为LOGWARNINGFATAL之一的type属性。message标签的文本包含消息本身。

以下是测试套件运行的示例报告。此测试套件只有一个测试用例,其中一个屏幕截图验证失败。我们改变了换行和缩进以更好地在手册中呈现。

<?xml version="1.0" encoding="UTF-8"?>
<SquishReport version="3.4" xmlns="http://www.froglogic.com/resources/schemas/xml3">
    <test type="testsuite">
        <prolog time="2015-06-19T11:22:27+02:00">
            <name><![CDATA[suite_test]]></name>
            <location>
                <uri><![CDATA[file:///D:/downloads/simple]]></uri>
            </location>
        </prolog>
        <test type="testcase">
            <prolog time="2015-06-19T11:22:27+02:00">
                <name><![CDATA[tst_case1]]></name>
                <location>
                    <uri><![CDATA[x-testsuite:/tst_case1]]></uri>
                </location>
            </prolog>
            <verification>
                <location>
                    <uri><![CDATA[x-testcase:/test.py]]></uri>
                    <lineNo><![CDATA[2]]></lineNo>
                </location>
                <scriptedVerificationResult time="2015-06-19T11:22:27+02:00" type="PASS">
                    <scriptedLocation>
                        <uri><![CDATA[x-testcase:/test.py]]></uri>
                        <lineNo><![CDATA[2]]></lineNo>
                    </scriptedLocation>
                    <text><![CDATA[Verified]]></text>
                    <detail><![CDATA[True expression]]></detail>
                </scriptedVerificationResult>
            </verification>
            <verification>
                <location>
                    <uri><![CDATA[x-testcase:/test.py]]></uri>
                    <lineNo><![CDATA[3]]></lineNo>
                </location>
                <scriptedVerificationResult time="2015-06-19T11:22:27+02:00" type="FAIL">
                    <scriptedLocation>
                        <uri><![CDATA[x-testcase:/test.py]]></uri>
                        <lineNo><![CDATA[3]]></lineNo>
                    </scriptedLocation>
                    <text><![CDATA[Comparison]]></text>
                    <detail><![CDATA['foo' and 'goo' are not equal]]></detail>
                </scriptedVerificationResult>
            </verification>
            <epilog time="2015-06-19T11:22:27+02:00"/>
        </test>
        <epilog time="2015-06-19T11:22:27+02:00"/>
    </test>
</SquishReport>

examples/regressiontesting中,您可以找到一些示例脚本,它们在不同的机器上执行地址簿测试套件,并通过后处理XML和生成HTML来在Web页面上显示每日输出。《如何进行自动化批量测试》部分解释了如何自动化测试运行并处理测试结果以生成在任何Web浏览器中查看的HTML。

©2024 The Qt Company Ltd. 本文件中的文档贡献作品归其各自所有者所有版权。
本文件提供的文档根据由自由软件基金会发布的《GNU自由文档许可证版本1.3`的条款许可。
Qt及其相关标志是芬兰和/或全球其他国家的The Qt Company Ltd.的商标。所有其他商标均为其各自所有者的财产。