40

私は現在、Python デスクトップ アプリケーション用に 2 つの並列コード ベースを維持しようとするほど愚かです。1 つは GTK 3 用の PyGObject イントロスペクションを使用し、もう 1 つは GTK 2 用の PyGTK を使用しています。 PyGTK ブランチ。これらの実装にはすべて小さな違いがあるため、私は見過ごして破損を引き起こし、見逃して誤ってリリースし、ユーザーに捕まるだけです。

できれば両方のコードベースで実行するのに適した、いくつかの単体テストを設計するための良い方法を見つけようとしています。それは過度に複雑なプログラムではありません (これは本質的にライブラリ管理ツールであり、iTunes のように想像してください):

- Main Window
  |- Toolbar with some buttons (add/edit/remove items, configure the program)
  |
  |- VPaned
  |--- Top HPaned
  |------ ListView (listing values by which a library of items can be filtered)
  |------ ListView (listing the contents of the library
  |--- Bottom HPaned
  |------ Image (displaying cover art for the currently selected item in the library)
  |------ TextView (displaying formatted text describing the currently selected item)
 - Edit dialog
 - Configuration dialog
 - About dialog 

ビューをモデルからできるだけ分離しようとしました。これらの項目のそれぞれは、独自のクラスで実装されます (まあ、リストされている GTK クラスから継承するクラスで)。ListViews は、ListStores から継承する他のクラスと結合されています。ライブラリ自体は別のクラスによって処理されます。それにもかかわらず、テストする必要があるウィジェット間の相互作用があります。たとえば、ユーザーがフィルタ ビューで特定のアイテムを選択してライブラリをフィルタリングし、フィルタリングされた結果からアイテムを選択した場合、テキスト ビューには正しいライブラリ エントリの情報を表示する必要がありますが、これは翻訳のためにやや複雑です。 TreeModelFilter と元の ListStore などの間の iters など。

では、そのような GUI アプリケーションの堅牢な単体テストを作成するための推奨される方法は何ですか? これにはいくつかのライブラリがあることがわかりましたが、pygtk の主要なライブラリは何年​​も更新されていないため、PyGObject イントロスペクションでほぼ確実に失敗します。おそらく私は、Python のモジュールを使用してそれを行う良い方法を見つけるほど創造的ではないunittestので、提案を受け付けています。

4

4 に答える 4

6

PyGTK の関数とウィジェットを直接テストする優れた方法があります。受け入れ/機能/統合テストのフレームワークを経由せずに、忘れ去られてしまいます。これについては、かなり自明なこの投稿で学びました。しかし、基本的な考え方は、ウィジェットを関数/クラスとして扱い、それらを直接テストできるということです。コールバックなどを処理する必要がある場合は、ここで再現する巧妙なトリックがあります。

import time
import gtk

# Stolen from Kiwi
def refresh_gui(delay=0):
  while gtk.events_pending():
      gtk.main_iteration_do(block=False)
  time.sleep(delay)

ブログ投稿で述べたように、このコードは LGPL です。それ以外の場合は、考えてみると、ウィンドウやウィジェットを使用しない限り、show()それらを好きなようにテストでき、ある意味で本物であるため、本物であるかのように動作するはずです。それらは表示されないだけです。

もちろん、clicked()たとえばボタンを呼び出して、ボタンや対話型ウィジェットの相互作用を自分でシミュレートする必要があります。PyGTK での単体テストに関する Ali Afshar の優れた投稿をもう一度参照してください。

于 2013-01-18T06:53:59.247 に答える
2

私は単体テストには興味がなく、実際には統合テストに興味があるという点で Jürgen が正しかったというテーマに固執する中で freedesktop.org からこのフレームワークも見つけました: http://ldtp.freedesktop.org/wiki/

アクセシビリティ対応の GUI アプリケーション (GTK、Qt、Swing など) のさまざまなテストを自動化できます。

于 2012-02-26T10:37:27.597 に答える
1

X11 フレームバッファを使用できます。

Xvfb :119 -screen 0 1024x768x16 &
export DISPLAY=:119
... run your tests

gtk.main()マウスまたはキーボードの入力を待機するため、を入力しないでください。このパターンを使用して、gtk にすべてのイベントを処理させることができます。

def refresh_gui():
  while gtk.events_pending():
      gtk.main_iteration_do(block=False)

私の知る限り、アプリケーションは表示されませんが、コールバックをテストできます。

于 2014-05-05T08:57:51.853 に答える