Tcl/Tk - 自动化 GUI 测试 [英] Tcl/Tk - automating GUI testing

查看:28
本文介绍了Tcl/Tk - 自动化 GUI 测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想自动化我的 GUI 测试.我经历了以下 post 但如果有人可以发布示例测试以下示例的代码对我来说会更容易理解.

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.

以下是我的简单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 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.

推荐答案

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

The simplest way to make a button behave like it's been clicked is to use its invoke method:

.hello.ok invoke

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

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.

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

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):

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

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

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.

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

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.

这篇关于Tcl/Tk - 自动化 GUI 测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆