自动批处理测试
本章讨论了自动测试的所有方面,也称为批量测试。包括自动执行测试、将测试分发到不同机器以及处理测试运行生成的结果。(参见,如何进行自动化批量测试。)
自动化测试运行
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上)。如果您没有对/etc
或c:\
的写入权限,您也可以将此文件放置在两个平台的SQUISH_ROOT/etc/squishserverrc
中。(在Windows上,您可以选择将文件命名为squishserverrc
或squishserverrc.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
标签包含执行验证的文件中的行号。如果uri
以x-testsuite:
、x-testcase:
或x-results:
开头,则路径相对于测试套件、测试用例或结果目录。如果文件路径超出了这些目录,则uri
标签将包含绝对文件路径。
scriptedVerificationResult
标签用于指定验证点类型。还有其他可能的类型:screenshotVerificationResult
、propertyVerificationResult
或tableVerificationResult
。
screenshotVerificationResult
用于屏幕截图验证,或propertyVerificationResult
用于属性验证(例如对布尔测试.vp(name)功能的调用)或者对其他任何类型的验证(例如对布尔测试.verify(condition)函数的调用),空字符串用于其他类型的验证,tableVerificationResult
用于表格验证点的结果。
每个验证点的结果标签有两个属性:一个将结果生成时间设置为ISO 8601格式的time
属性,以及一个将值设置为PASS
、FAIL
、XPASS
、XFAIL
、FATAL
或ERROR
之一的type
属性。此外,scriptedVerificationResult
标签应包含至少一个描述结果的detail
标签。通常,有两个标签:一个用于描述结果,另一个提供更详细的结果描述。对于屏幕截图验证,将包含额外的标签,一个objectName
,其中包含相关GUI对象的符号名称,以及一个failedImage
,其中包含实际图像的URI(对于失败,即实际图像与预期图像不同的情况)。
除了verification
标签外,在相同级别(即作为test
标签的子元素),可以有零个或多个message
标签。这些标签有两个属性,一个将消息生成时间设置为ISO 8601格式的time
属性,另一个将值设置为LOG
、WARNING
或FATAL
之一的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.的商标。所有其他商标均为其各自所有者的财产。