Tcl/Tk - 自动化 GUI 测试
我想自动化我的 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 ->你好... -> OK
并查看是否输出 Hello world!
。如果有人可以发布一个示例代码来模拟这些点击并自动测试它,那就太好了。
I want to automate the testing of my GUI. I went through the following post but if someone can post a sample test code for the following example it would be much easier for me to understand.
The following is my simple Hello World code.
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
I want to test Command -> Hello ... -> OK
and see if it outputs Hello world!
. It would be great if someone can post a sample code which simulates these clicks and tests it automatically.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
使按钮表现得像被单击一样的最简单方法是使用其
invoke
方法:当然,您还必须捕获该调用的结果;在测试方面,写入标准输出并不是世界上最有用的事情(除非您将测试工具包装在另一个进程中并且......好吧,让我们将其视为更多工作)。重构你的代码,以便在测试 GUI 部分时可以使用不同的后端,这会对你有很大帮助。
也可以低于方法调用级别,开始使用
事件生成
。这需要做更多的工作,因为您不能只生成鼠标点击和按键操作;还需要生成鼠标点击和按键操作。您还必须合成
和
事件,以便 Tk 的小部件正确武装自己。这是一个示例(-当 tail
将事件放在事件队列的末尾):您甚至可以转到相对于顶层或整个根窗口定位的生成事件的点(尽管 Tk 会只在内部传递它们;它不会将事件发送到其他应用程序,因为这相当粗鲁)但我建议如果您不需要它们,则将其保留,因为它们会使您的代码非常脆弱(通常不重要)诸如详细的字体更改之类的事情。
祝您的 GUI 测试顺利。想要做好是很难的。通过传入脚本来配置为适当的参数(在 Tcl 中非常简单,相当于在其他语言中完成的“模拟”之类的事情),使 GUI 与后端解耦,这将有很大帮助:使您无需立即测试所有内容。这将帮助你保持理智。
The simplest way to make a button behave like it's been clicked is to use its
invoke
method:Of course, then you've also got to capture the result of that invocation; writing to stdout not being the most useful thing in the world when it comes to testing (unless you wrap a test harness in another process and … well, let's just leave it as being much more work). Restructuring your code so that you can use a different back-end when testing the GUI part of it will help you a lot here.
It's also possible to go below the level of method invocations to the point where you start faking events with
event generate
. That's a lot more work because you can't just generate mouse clicks and key presses; you also have to synthesize<Enter>
and<FocusIn>
events so that Tk's widgets arm themselves properly. Here's an example (-when tail
puts the event on the end of the event queue):You can even go to the point of generating events positioned relative to the toplevel or the whole root window (though Tk will only deliver them internally; it doesn't send events to other apps as that would be rather rude) but I advise leaving positions out if you don't need them as they make your code very fragile to (usually unimportant) things like detailed font changes.
Good luck with testing your GUI. It's difficult to do well. Making your code so that the GUI is decoupled from the back end by passing in the scripts to configure as arguments where appropriate (pretty trivial to do in Tcl, and equivalent to things like “mocking” done in other languages) will help a lot by stopping you having to test everything at once. That will help keep you sane.