1

我想自动化我的 GUI 测试。我浏览了以下帖子,但如果有人可以为以下示例发布示例测试代码,我会更容易理解。

以下是我的简单Hello World代码。

namespace eval Gui {
}

proc Gui::hello {} {
  toplevel .hello
  wm title .hello "Hello" 
  wm resizable .hello 0 0 ;# not resizable

  # create a frame to hold the check widgets 
  set f [frame .hello.boolean -borderwidth 10] 
  pack $f -side top

  # OK and Cancel buttons 
  button .hello.ok -text "OK" -command [list Gui::Ok .hello ]
  button .hello.cancel -text "Cancel" -command [list Gui::cancel .hello ]
  pack   .hello.cancel .hello.ok -side right

  bind .hello <Return> {Gui::Ok .hello ; break}
  bind .hello <Escape> {Gui::cancel .hello ; break}
}

proc Gui::Ok { arg } { 
  set x [list puts "Hello world!"]
  eval $x 
  destroy $arg
}

proc Gui::cancel { arg } { 
  destroy $arg
}

#-------------------------------------------------------------------
# Gui main window  
#-------------------------------------------------------------------
proc Gui::initialize { } {
  # build the frame which contains menu options 
  frame .mbar -relief raised -bd 2
  frame .mdummy -width 200 -height 240
  pack .mbar .mdummy -side top -fill x 

  # menu options 
  menubutton .mbar.command -text Command -underline 0 -menu .mbar.command.menu
  pack .mbar.command -side left

  # menu under command options 
  menu .mbar.command.menu -tearoff 0
  .mbar.command.menu add command -label "Hello..." -command [list Gui::hello]
}

#-------------------------------------------------------------------
# main code
#-------------------------------------------------------------------
Gui::initialize

我想测试Command -> Hello ... -> OK一下它是否输出Hello world!。如果有人可以发布一个模拟这些点击并自动测试它的示例代码,那就太好了。

4

1 回答 1

3

使按钮表现得像被点击的最简单的方法是使用它的invoke方法:

.hello.ok invoke

当然,您还必须捕获该调用的结果;在测试方面,写入标准输出并不是世界上最有用的东西(除非您将测试工具包装在另一个流程中并且......好吧,让我们把它留作更多的工作)。重构你的代码,以便在测试它的 GUI 部分时可以使用不同的后端,这将对你有很大帮助。

也可以低于方法调用的级别,直到您开始使用event generate. 这是更多的工作,因为您不能只生成鼠标点击和按键;您还必须合成<Enter><FocusIn>事件,以便 Tk 的小部件正确武装自己。这是一个示例(-when tail将事件放在事件队列的末尾):

event generate .hello.ok <Enter> -when tail
event generate .hello.ok <ButtonPress-1> -when tail
event generate .hello.ok <ButtonRelease-1> -when tail

您甚至可以生成相对于顶层或整个根窗口定位的事件(尽管 Tk 只会在内部传递它们;它不会将事件发送到其他应用程序,因为那将是相当粗鲁的),但我建议离开职位如果您不需要它们,因为它们会使您的代码非常脆弱(通常不重要),例如详细的字体更改。

祝你测试你的 GUI 好运。很难做好。通过传入脚本以配置为适当的参数(在 Tcl 中非常简单,相当于在其他语言中完成的“模拟”之类的事情),使您的代码与后端分离,这将有很大帮助阻止您一次测试所有内容。这将帮助你保持清醒。

于 2011-06-06T22:01:31.517 回答