Tcl/Tk - 自动化 GUI 测试

本文介绍了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 测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,WP2

admin_action_{$_REQUEST[‘action’]}

do_action( "admin_action_{$_REQUEST[‘action’]}" )动作钩子::在发送“Action”请求变量时激发。Action Hook: Fires when an ‘action’ request variable is sent.目录锚点:#说明#源码说明(Description)钩子名称的动态部分$_REQUEST['action']引用从GET或POST请求派生的操作。源码(Source)更新版本源码位置使用被使用2.6.0 wp-admin/admin.php:...

日期:2020-09-02 17:44:16 浏览:1127

admin_footer-{$GLOBALS[‘hook_suffix’]}

do_action( "admin_footer-{$GLOBALS[‘hook_suffix’]}", string $hook_suffix )操作挂钩:在默认页脚脚本之后打印脚本或数据。Action Hook: Print scripts or data after the default footer scripts.目录锚点:#说明#参数#源码说明(Description)钩子名的动态部分,$GLOBALS['hook_suffix']引用当前页的全局钩子后缀。参数(Parameters)参数类...

日期:2020-09-02 17:44:20 浏览:1032

customize_save_{$this->id_data[‘base’]}

do_action( "customize_save_{$this-&gt;id_data[‘base’]}", WP_Customize_Setting $this )动作钩子::在调用WP_Customize_Setting::save()方法时激发。Action Hook: Fires when the WP_Customize_Setting::save() method is called.目录锚点:#说明#参数#源码说明(Description)钩子名称的动态部分,$this->id_data...

日期:2020-08-15 15:47:24 浏览:775

customize_value_{$this->id_data[‘base’]}

apply_filters( "customize_value_{$this-&gt;id_data[‘base’]}", mixed $default )过滤器::过滤未作为主题模式或选项处理的自定义设置值。Filter Hook: Filter a Customize setting value not handled as a theme_mod or option.目录锚点:#说明#参数#源码说明(Description)钩子名称的动态部分,$this->id_date['base'],指的是设置...

日期:2020-08-15 15:47:24 浏览:866

get_comment_author_url

过滤钩子:过滤评论作者的URL。Filter Hook: Filters the comment author’s URL.目录锚点:#源码源码(Source)更新版本源码位置使用被使用 wp-includes/comment-template.php:32610...

日期:2020-08-10 23:06:14 浏览:903

network_admin_edit_{$_GET[‘action’]}

do_action( "network_admin_edit_{$_GET[‘action’]}" )操作挂钩:启动请求的处理程序操作。Action Hook: Fires the requested handler action.目录锚点:#说明#源码说明(Description)钩子名称的动态部分$u GET['action']引用请求的操作的名称。源码(Source)更新版本源码位置使用被使用3.1.0 wp-admin/network/edit.php:3600...

日期:2020-08-02 09:56:09 浏览:848

network_sites_updated_message_{$_GET[‘updated’]}

apply_filters( "network_sites_updated_message_{$_GET[‘updated’]}", string $msg )筛选器挂钩:在网络管理中筛选特定的非默认站点更新消息。Filter Hook: Filters a specific, non-default site-updated message in the Network admin.目录锚点:#说明#参数#源码说明(Description)钩子名称的动态部分$_GET['updated']引用了非默认的...

日期:2020-08-02 09:56:03 浏览:834

pre_wp_is_site_initialized

过滤器::过滤在访问数据库之前是否初始化站点的检查。Filter Hook: Filters the check for whether a site is initialized before the database is accessed.目录锚点:#源码源码(Source)更新版本源码位置使用被使用 wp-includes/ms-site.php:93910...

日期:2020-07-29 10:15:38 浏览:809

WordPress 的SEO 教学:如何在网站中加入关键字(Meta Keywords)与Meta 描述(Meta Description)?

你想在WordPress 中添加关键字和meta 描述吗?关键字和meta 描述使你能够提高网站的SEO。在本文中,我们将向你展示如何在WordPress 中正确添加关键字和meta 描述。为什么要在WordPress 中添加关键字和Meta 描述?关键字和说明让搜寻引擎更了解您的帖子和页面的内容。关键词是人们寻找您发布的内容时,可能会搜索的重要词语或片语。而Meta Description则是对你的页面和文章的简要描述。如果你想要了解更多关于中继标签的资讯,可以参考Google的说明。Meta 关键字和描...

日期:2020-10-03 21:18:25 浏览:1620

谷歌的SEO是什么

SEO (Search Engine Optimization)中文是搜寻引擎最佳化,意思近于「关键字自然排序」、「网站排名优化」。简言之,SEO是以搜索引擎(如Google、Bing)为曝光媒体的行销手法。例如搜寻「wordpress教学」,会看到本站的「WordPress教学:12个课程…」排行Google第一:关键字:wordpress教学、wordpress课程…若搜寻「网站架设」,则会看到另一个网页排名第1:关键字:网站架设、架站…以上两个网页,每月从搜寻引擎导入自然流量,达2万4千:每月「有机搜...

日期:2020-10-30 17:23:57 浏览:1264