24

私は PySide 1.1.0 ベースのアプリケーションを構築しており、アプリケーションの単体テストと機能テストを行うための良い例を探しています。UI の機能テスト (クリック、キー押下などのシミュレーション)、UI のレイアウトを変更する UI スロットの単体テスト (おそらく部分的にモックされた送信側と受信側を使用)、およびユニットを実行できるようにしたいウィジェットを含むコードのテスト。ただし、ウィンドウをレンダリングする必要はありません。

一例として、QTreeView にデータを提供するモデル (QAbstractItemModel 派生オブジェクト) にアイテムが追加されると、メニューバーの 1 つのメニューのサブメニューを動的に作成します。モデルとサブメニューは同期している必要があるため、モデルとサブメニューを管理するコントローラーにデータを送信し、モデルとサブメニューの両方が適切に更新されたことをアサートする単体テストを記述できるようにしたいと考えています。

回避できるのであれば、テスト コードで QApplication を設定する必要はありません。また、視覚化ではなく、ウィジェットのデータ構造の検証のみに関心がある場合は、ウィンドウを表示する必要がないようにしたいと考えています。

http://www.pyside.orgまたは Google 検索で適切な価値のあるものを見つけることができません。私が見るべき良いサンプルコードを経験したり、知っている人はいますか?

4

2 に答える 2

38

unittest私は今、ユニットテストのpysideコードで少し遊んでいて、Pythonのモジュールとqtのモジュールを組み合わせるとQTestかなりうまくいくという結論に達しました。

オブジェクトをインスタンス化する必要がありますが、イベントループを実行する必要がないため、QApplicationそのメソッドを実行する必要はありません。exec_

QCheckBoxこれは、ダイアログ内のが想定どおりに機能するかどうかをテストする方法の例です。

class Test_PwsAddEntryDialog(TestCase):
    """Tests the class PwsAddEntryDialog."""

    def test_password_strength_checking_works(self):
        """Tests if password strength checking works, if the corresponding check
        box is checked.
        """
        d = PwsAddEntryDialog()
        # test default of internal flag
        self.assertFalse(d.testPasswordStrength)
        # type something
        QTest.keyClicks(d.editSecret, "weak", 0, 10)
        # make sure that entered text is not treated as a password
        self.assertEqual(d.labelPasswordStrength.text(), "")
        # click 'is password' checkbox
        QTest.mouseClick(d.checkIsPassword, Qt.LeftButton)
        # test internal flag changed
        self.assertTrue(d.testPasswordStrength)
        # test that label now contains a warning
        self.assertTrue(d.labelPasswordStrength.text().find("too short") > 0)
        # click checkbox again
        QTest.mouseClick(d.checkIsPassword, Qt.LeftButton)
        # check that internal flag once again changed
        self.assertFalse(d.testPasswordStrength)
        # make sure warning disappeared again
        self.assertEqual(d.labelPasswordStrength.text(), "")

これは完全に画面外で機能し、ウィジェットをクリックしてテキストを入力する必要がありますQLineEdit

これが私が(かなり単純な)テストする方法ですQAbstractListModel

class Test_SectionListModel(TestCase):
    """Tests the class SectionListModel."""

    def test_model_works_as_expected(self):
        """Tests if the expected rows are generated from a sample pws file
        content.
        """
        model = SectionListModel(SAMPLE_PASSWORDS_DICT)
        l = len(SAMPLE_PASSWORDS_DICT)
        self.assertEqual(model.rowCount(None), l)
        i = 0
        for section in SAMPLE_PASSWORDS_DICT.iterkeys():
            self.assertEqual(model.data(model.index(i)), section)
            i += 1

これが少しお役に立てば幸いです。

于 2012-08-19T12:22:39.800 に答える