蛙人 / 博客 / 验证仅为短持续时间显示的对象

验证仅为短持续时间显示的对象

许多应用程序在后台执行长时间的任务显示一个对话框,指示任务的进度。如果在任务运行时,如果在运行任务时,如果其他操作没有意义,则对话框也可能阻止对应用程序的访问。基于长期奔跑的任务进度,这些对话框通常会出现并消失。

由于这些对话框是应用程序逻辑的一部分,因此它们也会测试它们是重要的–特别是在错误方案中。但是,由于它们自动消失,因此在测试中验证它可能会具有挑战性,因为录制或验证创建不容易实现。

在执行任务完成后执行要完成的操作之前,测试也可能希望使用这样的对话框作为同步点。因此,检测对话框的存在和消失可以帮助确定此类任务是否完全完成。

在以下部分中我们’LL研究如何检测对话框的外观和消失,以及检查进度。最后我’LL提供一些关于如何改进/扩展的代码的想法。

测试设置

基于作为作为该的一部分提供的示例应用程序来完成以下解释 Qt框架 并且可以使用自动化 squ for Qt edition。应用程序我们’re using is called findfiles. 并且可以在Qt示例文件夹中找到 QTBASE /小部件/对话框。该应用程序有一个对话框,用于设置搜索参数,如下所示:

We’重新开始使用一个非常简单的录制测试,设置FindFiles应用程序,以查找包含单词的所有文件 QLabel. Qt示例文件夹中的任何位置。最后,验证了结果的数量。在此处使用的路径当然只能在我的系统上工作,并且发现文件的数量也可能不同。

可以在这里看到我最终录制的脚本:

# -*- coding: utf-8 -*-
def main():
startApplication("findfiles")
mouseClick(waitForObject(":Containing text:_QLineEdit"), 406, 6, 0, Qt.LeftButton)
type(waitForObject(":Find Files.Containing text:_QComboBox"), "QLabel")
mouseClick(waitForObject(":In directory:_QLineEdit"), 452, 13, 0, Qt.LeftButton)
type(waitForObject(":Find Files.In directory:_QComboBox"), "<Ctrl+A>")
type(waitForObject(":Find Files.In directory:_QComboBox"), "/Users/andreas/Qt/5.6/Src/qtbase/examples")
type(waitForObject(":Find Files.In directory:_QComboBox"), "<Delete>")
clickButton(waitForObject(":Find Files.Find_QPushButton"))
test.compare(waitForObjectExists(":Find Files.Browse..._QTableWidget").rowCount, 241)

执行此脚本时,它将在上行失败 –RowCount值将为0.原因是,在找到表格时,就会完成比较’没有任何记录,它将等待对话对话并再次消失。这 waitforobjectexist函数 不等待一个物体准备好了– like 等待object. would do –因此,模态进度对话框不会被阻止。

验证对话框是否出现并消失

为了修复同步问题,并确保我们的测试在对话框未能出现时失败’LL添加一些脚本代码等待对话框出现并消失。

验证对话框的存在,可以通过waitForobject函数与对话框的合适对象名称完成。可以通过在对话框背景区域记录一个简单的mouseclick来获得名称。当WAITFOOBJECT无法找到对话框时,或者其被其他对象阻止,它将抛出一个将结束测试脚本的异常。例如,这不一定需要,例如,当超时太短暂时,需要刚刚运行,只是为了找出对话框中的验证也会失败。在分析测试结果时,错误消息也难以掌握,这是一个清晰的消息‘预期进度对话框,但在X秒内没有显示’读取更容易。

等待object调用将被包装为返回的小功能 真的 或者 错误的 根据WHETHER,可以找到对象名称。然后,这反过来又用于在ClickButton调用后添加对话框存在的验证。由于对话框应该出现非常快,并且如果需要太长时间,则是故意短暂的,因为它被视为应用程序中的错误。以下两种代码段显示函数包装WaitForObject和ClickButton之后添加的验证:

def doesObjectExist(name, timeout):
try:
waitForObjectExists(name, timeout)
return True
except LookupError:
return False
    clickButton(waitForObject(":Find Files.Find_QPushButton"))
appearingTimeout = 2000
if doesObjectExist(":Find Files_QProgressDialog", appearingTimeout):
test.passes("Progress dialog appeared within %s seconds" % (appearingTimeout/1000,))
else:
test.fail("Progress dialog failed to appear within %s seconds" % (appearingTimeout/1000,))

再次执行进度对话框的同步和验证使用相同的功能。但是,我们希望等待对话框名称不再找到。因此我们使用 等待功能 等到DOOBIBEXIST返回 错误的。这在这些行中概述了在验证对话框的情况下被添加到脚本中的:

    disappearingTimeout = 10000
dialogHasClosed = waitFor(lambda: not doesObjectExist(":Find Files_QProgressDialog", 500), disappearingTimeout)
if dialogHasClosed:
test.passes("Progress dialog has been closed within %s seconds" % (disappearingTimeout/1000,))
else:
test.fails("Progress dialog still shown after %s seconds" % (disappearingTimeout/1000,))

此小测试现在完全运行并通过,只要显示进度对话框并且找到的最终文件集符合预期。虽然未经验证的是whers,因此进度对话实际显示了一些进度,即进步栏进展情况。由于未能显示进度,因此将使用户界面非常糟糕,以查看如何完成。

验证是否正在显示实际进度

随着当前值可作为属性访问,可以使用大多数工具包进行更容易地完成进度条值的验证。我们’LL检查酒店’使用的时间值在一定时间内达到了给定值 等待功能 再次。根据该检查的结果,正在记录结果条目。

为了随着时间的推移测试不同的进展点,该示例使用小功能来执行实际验证,并为100个文件的点调用两次,并且找到1500个文件。以下两种代码段显示了函数的示例脚本代码以及如何在对话框显示时使用它:

def 验证项目(progressBar, wantedValue, timeout):
valueReached = waitFor(lambda: progressBar.value > wantedValue, timeout)
if valueReached:
test.passes("Progressbar reached value %s after at most %s seconds" % (wantedValue, timeout / 1000))
else:
test.fail("Progressbar did not reach value %s after %s seconds" % (wantedValue, timeout / 1000))
    progressBar = waitForObjectExists("{type='QProgressBar' container=':Find Files_QProgressDialog'}")
验证项目(progressBar, 100, 2000)
验证项目(progressBar, 1500, 5000)

此时示例脚本只需在飞行中为进度条对象创建对象名称,而不是将其添加到对象映射。我可以’录制了一下,也可以获得一个符号名称,但这可能没有比RealName更具表现力。

此最终版本在测试脚本中的文件查找任务上强制执行同步,以便可以轻松检查文件查找的结果。此外,它确保应用程序提供了合理的用户界面,而在执行任务并向用户通知用户进度。

等待物体外观/消失的一般想法 等待object.等待 除了在一段时间后达到的值验证,可以应用于其他场景‘volatile’ or ‘transient’应用程序或某些对象属性以确定性的方式在一段时间内更改对象。

虽然示例脚本正在使用Qt应用程序,因为它可以应用于其他工具包和蜂鸣的版本。

进一步的发展

在筹备过程中,我的脑海中的一些改进,超出了本文的范围。所以我’M只是概述如何扩展或改进示例:

  • 可以验证进度对话框中的更多详细信息,例如显示文件名。
  • 验证项目 如果对话者在此期间消失了,则功能并不能很好地工作 等待 invocation
  • 表格单元内容的验证也可能还包括完整性的第一列。
  • squ’支持对信号反应的支持 进行进度验证更严格。

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

复制链接