1

GUIのテストを自動化したい。私は次の投稿を行いましたが、誰かが次の例のサンプルテストコードを投稿できれば、私ははるかに理解しやすくなります。

以下は私の単純なHelloWorldコードです。

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!。誰かがこれらのクリックをシミュレートして自動的にテストするサンプルコードを投稿できれば素晴らしいと思います。

4

1 に答える 1

3

ボタンがクリックされたように動作させる最も簡単な方法は、そのinvokeメソッドを使用することです。

.hello.ok invoke

もちろん、その呼び出しの結果もキャプチャする必要があります。stdoutへの書き込みは、テストに関しては世界で最も有用なものではありません(テストハーネスを別のプロセスでラップし、…まあ、それをはるかに多くの作業として残しておかない限り)。コードのGUI部分をテストするときに別のバックエンドを使用できるようにコードを再構築すると、ここで大いに役立ちます。

メソッド呼び出しのレベルを下回り、でイベントを偽造し始めることも可能ですevent generate。マウスのクリックやキーの押下だけを生成することはできないため、これははるかに多くの作業です。また、Tkのウィジェットが適切に機能するように、合成<Enter>とイベントを実行する必要があります。<FocusIn>次に例を示します(-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のテストで頑張ってください。うまくやるのは難しい。必要に応じて引数として構成するスクリプトを渡すことにより、GUIがバックエンドから切り離されるようにコードを作成すると(Tclで行うのは非常に簡単で、他の言語で行われる「モック」のようなものと同等です)、すべてを一度にテストする必要がなくなります。それはあなたを正気に保つのに役立ちます。

于 2011-06-06T22:01:31.517 に答える