这一部分,我们将会理解如何测试example/qt/paymentform例子程序。这个程序使用许多基本的Qt widgets包括 QCheckBox,QCombox,QDateEdit,QPushButton,QRadioButton,和QSpinBox。作为这里所覆盖的例子的一部分,我们将会展示如何检查单个widgets的值和状态。我们也将证明如何测试一张表的业务规则。
The paymentform 例子 ——pay by check模式
无论是在销售时还是电话信用卡时,当已付款时调用paymentform。表格的Pay 按钮只有当正确区域填写了正确值是才被激活。我们必须测试的业务规则如下:
· 在“cash”模式下,即当选取Cash QRadioButton时:
— 没有不相关的widgets(例如,account name,account number),必须可见。(因为表格使用了一个QStackedWidget 我们只有检查cash widget是否可见,并且Check widget和Card widget是隐藏的 。)
— 最小payment是$1并且最大是$2000,或者到期金额,以较小者为准。
·在“Check”模式下,即当选取Check QRadioButton时:
— 没有不相关的widgets(例如,发行日,到期日),必须可见。(事实上我们只有检查Check widget是否可见,Cash widget和Card widget是隐藏的。)
— 最小的payment是$10并且最大的是$250,或者到期金额,以较小者为准。
— Check date 必须不早于30天以前,并且不晚于明日。
— Bank name,bank number,account name,和account number行编辑必须非空。
— Checkbox Check Signed必须选择。
·在“Card”模式下,即当选取Card QRadioButton时:
— 没有不相关的widgets(如,check date,check signed),必须可见。(实际上我们只有检查card widget是否可见,并且check widget和card widget是隐藏的)
— 最小付款数是$10或者到期金额的5%,两者以较大者为准;最大付款数是$5000或者到期金额,两个以较小者为准
— 对于非Visa card,发行日必须不早于3年前。
— 到期日必须至少从今日算起一个月后。
— account name 和 account number行编辑必须非空。
我们将会写三个测试,一个用来测试表格的每个模式。使之能轻便的检查QStackedWidget中的widgets,我们已经显示给出对象名字(使用QObject的setObjectName 方法)——“CashWidget”,“CheckWidget”和“CardWidget”。用相同的方式我们也给出了Qlabel显示Amount Due的名字“AmountDueLabel”。
payment表格的源代码在目录SQUISHROOT/examples/qt/paymentform下面,测试套件也在该目录下——例如,Python版本的测试在SQUISHROOT/examples/qt/paymentform/suite_py中,而JavaScript版本的测试在SQUISHROOT/examples/qt/paymentform/suite_js中,以此类推。
我们将从查看测试form的“Cash”模式的脚本开始。代码都在一个单一的大的main函数中。(不要担心代码看起来很长——当我们看到下一个测试脚本的时候我们将会看到如何将其打成可管理的模块。)我们将分块展示函数,每块后面跟一个解释。
def main():
startApplication("paymentform");
#Make sure the Cash radio button is checked so we start in the mode
#we want to test
cashradioButtonName = ("{text='Cash' type='QRadiOButton' visible='1' “
”window=':make Payment-MainWindow'}")
cashRadioButton = waitForObject(cashRadioButtonName)
if not cashRadioButton.checked:
clickButton(cashRadioButton)
test.verify(cashRadioButton.checked)
我们必须以我们想要测试的模式开始。为了访问可见的widgets,该进程常常是相同的:我们创建一个变量存放widget的名字,然后我们调用waitForObject来获取widget的一个引用。一般地,最好使用symbolic names,但是multi-property(real)names对那些已经用QObject::setObjectName函数唯一的命名的widget来说是明智的选择,当我们需要匹配通配符时也是有用的。
一旦得到了引用,我们就可以用来访问widget的属性以及调用widget的方法。我们使用这种方法来查看cash radio是否被选择了,并确保我们接下来的测试是在正确的模式下执行的。
注意到clickButton 函数可以用来点击任意一个继承自QAbstracButton的button,即,QCheckBox<QPushButton,QRadioButton,和QToolButton。
#Business rule #1:obly the QStackedWidget's CashWidget must be
# visible in cash mode
#(The name "CashWidget" was set QObject::setObjectName())
cashWidget = waitForObject("{name='CashWidget' type='QLabel' }")
checkWidgetName = "{name='CheckWidget' type='QWidget'}"
#No waiting for a hidden object
checkWidget=findObject(checkWidgetName)
test.compare(checkWidget.visible,False)
cardWidgetName = "{name='CardWidget' type=‘QWidget’}"
#No waiting for a hidden object
cardWidget = findObject(cardWidgetname)
test.compare(cardWidget.visible,False)
第一个待测试的业务规则是:如果cash widg