私は現在、Pythonデスクトップアプリケーション用の2つの並列コードベースを維持しようとするほど愚かです.1つはPyGObjectイントロスペクションをGTK 3に使用し、もう1つはPyGTKをGTK 2に使用します。私は主にPyGObjectブランチで作業し、 PyGTKブランチに転送します。これらの実装間の小さな違いのため、私はしばしば事態を見落とし、私が逃して誤ってリリースする破損を引き起こし、ユーザーにしか捕まえられません。Python GUIアプリケーションのユニットテストにはどのような方法が推奨されますか?
私は、両方のコードベースで実行するのに適したユニットテストを設計する良い方法を見つけようとしています。それは、過度に複雑なプログラムではありません(それは基本的にライブラリ管理ツールですが、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クラスを継承したクラス)。 ListViewは、ListStoresを継承する他のクラスと結合されています。ライブラリ自体は別のクラスで扱われます。それにもかかわらず、テストする必要があるウィジェット間の相互作用があります。たとえば、フィルタビューで特定の項目を選択し、ライブラリをフィルタ処理した後、フィルタリングされた結果から項目を選択すると、翻訳されたためにテキストのビューに正しいライブラリエントリの情報が表示されます
このようなGUIアプリケーションのための堅牢な単体テストの作成にはどのような方法が推奨されますか?私はこれのためのいくつかのライブラリがあることを見てきましたが、pygtkの主なものは何年も更新されていないので、PyGObjectのイントロスペクションではほとんど確実に失敗します。おそらく、私はPythonのunittest
モジュールを使ってそれを行う良い方法を理解するのに十分な創造力を持っていないので、私は提案をすることができます。
誰かが尋ねる前に:pygtkはGTK 3をサポートしていませんが、GTK 2のpygobjectイントロスペクションのサポートがあまりにも不完全で依存していることがわかりました。 –
GUIの使用時に回帰を避ける最良の方法は、マニュアルテストを行うことです。 Unittestは実際にMVCの場合のように仕事関数をテストするのには良いですが、私はあなたがguiに対処する方法がわかりません。 – ykatchou
これは私がやっていることですが、私は明らかにそれほど良くはありませんが、すべてのリリース以来私は何かが恋しいです。 –