web-dev-qa-db-ja.com

機能テストと統合テストの違い

私はその違いを深く混乱しています。私は非常に多くの定義を読みましたが、それらは常に、テストが要件を満たしているときの機能テストを説明しています。まあ、それは単にfunctional testという名前に言い換えただけです。それは違いを明確にしません。

違いを示す実際のコードに興味があります。

ライブラリにハッシュを実行する関数があるとします。

def custom_hasher(scheme, val):
    # use many hashing libraries...


def hasher(inlist, scheme):
    """ Take a list and outputs the hashed values of a list. """

    output = list()
    for val in inlist:
        output.append(custom_hasher(scheme, val))
    return output

機能テストの場合、テストしたいのは['a', 'b']['jask34sdasdas', 'asasjdk234sjdk']のようなものとして返されます。

しかし、それは統合テストでできることです。どのタイプの入力が必要かを正確に把握しています(適切な実行が必要なので、リストを渡します)。または、ディクショナリを渡した場合にObject has no append method例外を発生させます。

どちらでもできます。どこが違うの?

別の例は、いくつかのWebアプリです。

@logged_in   # only logged in user can do this
@route("/invite", method=['POST'])
def send_invite(request):
   recp_email = request.data['recp_email']

   # now do a bunch of logics before and after sending an email

したがって、私の統合テストでは、ネットワークを介してこれを確実に実行します(サーバーを実行しています)。このURLにリクエストを送信します。機能テストについても同じです。

線を引く方法は?この場合、いくつかのテーブルの送信ログを見て、電子メールが送信されているかどうかをテストする機能テストを作成できます。しかし、それは私がテストしているもの(ビューsend_invite)とは異なる関数です。

そのため、2つを区別する方法がわかりません。彼らは両方とも何かを主張します。

助けてください。

3
CppLearner

Functional testsは通常、integration testsの同義語として使用されます。質問を正しく理解できた場合、unit testsfunctional testsを混同している可能性があります。

単体テストでは、他のコンポーネントをモック/スタブすることにより、機能自体を個別にテストすることを目指します。

統合テストでは、さまざまなシステムが連携して動作することをテストし、それらが正しく連携して正しい出力を生成するかどうかを確認します。

send_inviteの例の場合、単体テストでは、メールとその他のフレームワークコンポーネントをモックし、招待送信機能が正しい引数でメールコンポーネントを正しく呼び出すかどうかをテストします。統合テストの場合、テストサーバーをセットアップして、関数が電子メールを正しく送信し、他のコンポーネントを含め、想定されているすべてのことを実行しているかどうかを確認できます。

単体テストは最小のテストブロックであり、その後に統合テストが続きます。


編集:

言葉は別として、テストが必要な理由として問題に取り組みましょう。コードが正しく機能していることを確認するためのテストが必要です。

send_emailの例では、最初に関数を個別にテストして、関数が想定どおりに機能することを確認する必要があります。これを行うには、モック/スタブを使用して関数自体をテストし、他のコンポーネントから関数を分離します。電子メールの送信を担当する別のコンポーネントがあり、関数がこのコンポーネントを呼び出して電子メールを送信していると仮定すると、電子メールコンポーネントが壊れている場合、これがsend_emailのテストに影響することは望ましくありません。この関数に直接関連しています。 send_email関数のコードが正しく機能していることを確認したいだけです。これは一般にunit testingと呼ばれます。

関数が単独で正しく機能していることを確認したら、招待システムがすべてのコンポーネントで正しく機能しているかどうかをテストする必要があります。今回は、モック/スタブなしで関数をテストすることでそれを行います。これは一般にintegration testsと呼ばれます。

一部の場所にはfunctional tests with side effectsfunctional tests without side effectsがあります。つまり、モック/スタブせずにテストで事前定義された引数を使用して関数を呼び出すと、正しい出力が生成され、テストで事前定義された引数を使用して関数が呼び出されます。他のコンポーネントをそれぞれモック/スタブする。これはunit testsおよびintegration testsに変換できます。

言語は混乱を招く可能性があり、異なる文化/コミュニティでは、これらのテストを異なる単語で呼び出すことがあります。テストで実行する必要があるのは、可能な限り最小の意味のあるユニットからテストを開始し、そこからシステム全体に作業することです(これは逆の順序でも実行できますが、この回答の範囲外です)。

4
Hakan Deryal