Tcl / Tk - автоматизация тестирования GUI - PullRequest
1 голос
/ 07 июня 2011

Я хочу автоматизировать тестирование моего GUI. Я прошел через post , но если кто-то может опубликовать пример тестового кода для следующего примера, мне будет гораздо легче понять.

Вот мой простой 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!. Было бы здорово, если бы кто-то мог опубликовать пример кода, который имитирует эти клики и автоматически его тестирует.

1 Ответ

3 голосов
/ 07 июня 2011

Самый простой способ заставить кнопку вести себя так, как она нажата, - это использовать invoke метод:

.hello.ok invoke

Конечно, тогда вам также нужно захватитьрезультат этого вызова;запись в stdout не является самой полезной вещью в мире, когда дело доходит до тестирования (если вы не завернули тестовый жгут в другой процесс и… ну, давайте просто оставим это как гораздо большую работу).Здесь очень поможет реструктуризация вашего кода, чтобы вы могли использовать другой бэкэнд при тестировании части графического интерфейса.

Также возможно опускаться ниже уровня вызовов методов до точки, с которой вы начинаетефальшивые события с 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, и эквивалентно таким вещам, как «издевательство», сделанное на других языках), очень поможетмешает вам проверить все сразу.Это поможет вам оставаться в здравом уме.

...