2

次のような架空の API があるとします。

import foo

account_name = foo.register()
session = foo.login(account_name)
session.do_something()

重要なポイントは、するためにdo_something()は、登録してログインする必要があるということです.

以下は、非常に単純化された最初のパスの単体テスト スイートです。

# test_foo.py
import foo

def test_registration_should_succeed():
    foo.register()

def test_login_should_succeed():
    account_name = foo.register()
    foo.login(account_name)

def test_do_something_should_succeed():
    account_name = foo.register()
    session = foo.login(account_name)
    session.do_something()

問題

登録が失敗すると、すべてのテストが失敗し、実際の問題がどこにあるかがわかりにくくなります。すべてが壊れているように見えますが、実際に壊れているのは、重要な 1 つだけです。すべてのテストに精通していない限り、かつては重要だったものを見つけるのは困難です。

質問

依存するコア機能が失敗したときに後続のテストが実行されないように、単体テストをどのように構成しますか?

アイデア

ここに私が考えた可能な解決策があります。

  1. 各テストで失敗を手動で検出し、SkipTest を発生させます。- 動作しますが、多くの手作業でエラーが発生しやすい作業です。
  2. ジェネレーターを活用して、最初のテストが失敗したときに後続のテストを生成しないようにします。- これが実際に機能するかどうかはわかりません (以前に生成されたテストが失敗したことをどのように「知る」ことができるため)。
  3. テストをテスト クラスにグループ化します。たとえば、これらはすべて、ログインが必要な単体テストです。 - これが実際に私の問題に対処するかどうかはわかりません。同じように失敗も多いのではないですか?
4

2 に答える 2

4

明示的な質問に答えるよりも、モック オブジェクトを使用する方がよいと思います。一般に、単体テストでは外部データベースへのアクセスは必要ありません (おそらくログインが必要です)。ただし、これを行ういくつかの統合テストが必要な場合 (これ良い考えです)、それらのテストで統合の側面をテストし、単体テストで単体の側面をテストする必要があります。統合テストと単体テストを別々のファイルに保存して、単体テストを非常に定期的にすばやく実行し、統合テストを少し定期的に実行できるようにします (ただし、少なくとも一日一回)。

于 2011-07-11T23:06:24.910 に答える
0

この問題は、Foo が多くのことを行っていることを示しています。懸念事項を分離する必要があります。その後、テストは簡単になります。Registrator、LoginHandler、および DoSomething クラスに加えて、ワークフローを調整する中央コントローラー クラスがあれば、すべてを個別にテストできます。

于 2011-07-12T09:29:33.070 に答える