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

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

问题描述

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

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 -> Hello ... -> 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.

推荐答案

使按钮表现得像被单击一样简单的方法是使用其

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

.hello.ok invoke

当然,那么您还必须捕获该调用的结果;在测试方面,向stdout编写代码并不是世界上最有用的事情(除非您将测试工具包装在另一个过程中,否则……让我们把它留给我们做更多的工作).重组代码,以便在测试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.

也有可能低于方法调用的级别,以使您可以使用

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时好运.很难做好.通过在适当的地方传入脚本以将其配置为参数,从而使您的代码与GUI分离,从而使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天全站免登陆