モック基本モジュールの使用を自動化するPythonインタフェース

モックプロフィール

python3モックunittestのモジュールは、別個のインストール、テストのフレームワークに統合されていない後

モックモック言葉は英語で意味を、私たちは、ライブラリの主な機能は、いくつかのことをシミュレートすることであると推測することができます

正確には、モックは、ユニットテストをサポートするためのPythonライブラリであり、その主な機能は、モックオブジェクトの振る舞いを達成するために指定されたPythonオブジェクトのうちモックオブジェクトの使用を交換することです

モックは、unittestのユニットテストフレームワークに統合されているので、我々はモックの目的は私たちに、より良いテストを行うことであると想像することができます

モック役割

1.依存関係の解決:我々は、機能モジュールインタフェースまたは場合をテストする、またはこのインタフェース機能モジュールは、他のインターフェイス又は他のモジュールに依存している場合、依存しているインタフェースや機能モジュールが開発されていない場合ので、我々は缶を

モックアナログを使用して特定のテストを完了することに依存するインターフェイス、インターフェイスであります

2.ユニットテスト:機能が開発されていない場合、我々はコードのテストケースで記述する必要があり、我々はテストするこの機能をシミュレートすることができます

3.複雑なビジネス・インタフェースをシミュレートする:実際の作業をシミュレートするために、我々はインターフェース機能をテストしている場合、このインターフェイスは非常に複雑なインターフェイスの事業に依存している場合、我々は実際には、このモック複雑なビジネス・インタフェースを使用することができ、

これは、インターフェイスに依存しており、同じ原理を解きます

4. FBIの前端と後端:あなたはフロントページの開発であれば、今の機能を開発する必要があります。状況に応じては、あなたがインターフェイスをコールバックする必要があり、その後、別のページを表示するために舞台裏返され、インターフェースが開発されていないが、背景ではありません君

仕事のこの部分は、それを停止するには?答えはノーである、あなたはモックこのインタフェースの助けに背景が必要なデータを返すシミュレートすることができます

モックインストール

pythonのモックモジュール3は、unittestのフレームワークに統合されているので、あなただけのファイルの先頭でインポートモックをunittestの使用する必要があるときからインポートすることができます

あなたはpython2を使用している場合は、その後、モックをインポートすることができますモックインストールをインストールピップ実行する必要があります

モックの例

どのように完全な機能テストを開発しますか?

二つの数字は、機能テストケースを記述する必要はなく、開発の進捗が遅いのためにを達成するために一緒に今がある場合は、2つだけのシンプルなフレームワークを取り、何の内部実装ません

 

""」
------------------------------------
@time:2019年6月26日14時09分
@Auth:Linuxの超の
@file:ClassFunc.py
@IDE:PyCharm
@Motto:レアル戦士は、荒涼とした警告に直面する勇気、鋭いエラーに直面する勇気!
@QQ:[email protected]
@GROUP:878565760
--- ---------------------------------
「」」
輸入unittestの
unittestの輸入モックから


クラスサブクラス(オブジェクト):
    デフを追加(自己、a、b)は:
        "" "两个数相加" ""
        パス

(たunittest.TestCaseの)TestSubクラス:
  "" "試験例二つの数字と共に" ""
    DEF test_sub(自己):
        サブ=サブクラス()関数#テストクラスのインスタンスの初期化
        sub.add = mock.Mock(RETURN_VALUE = 10 )#モックAddメソッドを返し10
        結果sub.add =(5 ,. 5)#コール機能試験
        self.assertEqual(結果、10)#アサーションが期待結果と実際の結果


もし__name__ == '__main__':
    unittest.main()

 

テスト結果

 


-------------------------------------------------- --------------------
0.000sで実行した1つの試験

OK

プロセス終了コードで終了

 

試験結果は、試験ケースにより実行されたことを示しました。

実際にシミュレートされた模擬追加方法の原理は、モック(sub.add())を返すパラメータデータがRETURN_VALUEに対応するとき、そのオブジェクトが呼び出されモックターゲットオブジェクトを受信する(受信sub.addを使用して)で同じ方法を使用することです

その結果、表面に見えるがaddメソッドをシミュレートすることです(これは私の個人的な理解であり、無視しないでください)

あなたはユースケースは、他の名前を追加し、実験を行うことができますが、あまりにも、テストによって変更することができます

[OK]を、継続

私たちは、ユースケースを書き終え、だけでなく、完成以来、機能の開発を開発する(squallingは、あなたがしたいですか?)、すでにテスト実関数ので、その後、どのように我々はそれの上に実際の機能に基づいてテストケースを指示していますか?

どのように完全な機能テスト?

私たちは、わずかに変更されたのコード例を使用します

 

""」
------------------------------------
@time:2019年6月26日14時09分
@Auth:Linuxの超の
@file:ClassFunc.py
@IDE:PyCharm
@Motto:レアル戦士は、荒涼とした警告に直面する勇気、鋭いエラーに直面する勇気!
@QQ:[email protected]
@GROUP:878565760
--- ---------------------------------
「」」
輸入unittestの
unittestの輸入モックから


クラスサブクラス(オブジェクト):
    デフを追加(自己、a、b)は:
        "" "两个数相加" ""
        + bを返します

(たunittest.TestCaseの)TestSubクラス:
    "" "テスト二つの数字" ""
    DEF test_sub(自己):
        サブ=サブクラス()関数#テストクラスのインスタンスの初期化
        sub.add = mock.Mock(RETURN_VALUE = 10、 side_effect = sub.add)#パスside_effectキーワードパラメータ、パラメータ値がRETURN_VALUEを上書きし、実際のテストの使用方法を追加し
        、結果を= sub.add(5、11) #実際のテスト関数呼び出し
        self.assertEqual(結果16) #実際の結果と期待される結果を主張


もし__name__ == '__main__':
    unittest.main()

 

side_effectパラメータ

私たちは、別のキーワード引数side_effect = sub.add、このパラメータを追加し、このパラメータRETURN_VALUEパラメータの受け渡しが失敗し、逆に、RETURN_VALUEに道を譲るコードをモック

そして効果にside_effectは、私はあなたがaddメソッドも達し、この方法の実際の使用を追加します呼び出すときに、ここでパラメータ値は、アドレスのsub.add方法を追加することと等価である与え、我々がテストした実際のメソッドを追加します。

また、アドレスの値を持つside_effect測定されたパラメータを渡すとき、モックが動作しないことが理解されるであろう

反復シーケンスを受信side_effect送信複数の値が各コールモック、異なる値が返されたときに、あります

 

mock_obj = mock.Mock(side_effect = [1,2,3])
プリント(mock_obj())
プリント(mock_obj())
プリント(mock_obj())
プリント(mock_obj())

输出
トレースバック(最後の最新の呼び出し):
1つの
  ファイル"D:/MyThreading/mymock.py"、37行、<モジュール>で
2
    プリント(mock_obj())
3
  ファイル「C:\ Python36 \ libに\ unittestの\モック。 PY」、行939、__call__に
    戻り_mock_self._mock_call(* argsを、** kwargsから)
  ファイル"C:\ Python36 \ libに\ unittestの\ mock.py"を、ライン998、_mock_callで
    結果=次の(効果)
を呼び出すとStopIteration

プロセス終了コード1で終了

 

(場所の原理は発電機と少し似ている)すべての値がエラー後に撮影されている場合

機能テストのどの依存関係?

シナリオを考えてみましょう:私たちは、支払いインタフェースをテストしたいが順番に支払インターフェイスは、サードパーティ決済インターフェースに依存し、サードパーティ決済インターフェースは、私たちは、その後、どのように我々は、このインタフェースそれ私たち自身をテストします使用する権限を持っていませんか?

以下の例を参照してください。

サードパーティのインターフェースと私たち自身の支払インターフェイスは、次のようにした場合

 

""」
------------------------------------
@time:2019年6月26日午前15時09
@Auth:Linuxの超の
@file:PayMent.py
@IDE:PyCharm
@Motto:レアル戦士は、荒涼とした警告に直面する勇気、鋭いエラーに直面する勇気!
@QQ:[email protected]
@GROUP:878565760
--- ---------------------------------
「」」
インポート要求


クラスPayApi(オブジェクト):

    @staticmethod
    DEF認証(カード、金額):
        "" "
        サードパーティ製の支払いゲートウェイ
        :PARAMカード:カード
        :PARAM量:支払った金額
        :リターン:
        " ""
        pay_url = "http://www.zhifubao.com"サードパーティの#支払いゲートウェイアドレス
        データ= {「カード」:カード、「量」:AMOUNT}
        サードパーティの支払い要求に対する応答= requests.post(pay_url、データ=データ)#インターフェイス
        リターン応答位状態コードを返します

    ペイDEF(セルフ、USER_ID、カード、金額):
        「」「
        私たち自身の支払インタフェース
        :のparamのuser_id:ユーザー上記のIDを述べた
        :PARAMカード:カード
        :PARAM量:支払った金額
        :リターン:
        」「」
     #は、インタフェース、サードパーティ製の支払いを呼び出し
        、応答self.auth =(カード、量)
        の試行:
            応答[ 'STATUS_CODE'] == '200は' IF:
                印刷( 'ユーザー{} {}成功した支払額'を.format(user_idは、量))
                リターン'成功した支払い'
            のelif応答[ 'STATUS_CODE'] == '500':
                印刷( '{}ユーザーが支払うことに失敗し、変化量' .format(USER_ID))
                リターン'支払いが失敗し'
            他の:
                リターン「不明エラー」
        の例外を除きます:
            リターン「エラー、サーバーの異常な!」


__name__ == '__main__'の場合:
    パス

 

我々が使用することはできません実際のサードパーティ決済・インタフェースをシミュレートするために、インタフェースのアドレスは私のDIYであるため、サードパーティ製の支払いインタフェースにアクセスできないことは明らかです

テストケースを書きます

 

""」
------------------------------------
@time:2019年6月26日夜3時22
@Auth:Linuxの超の
@file:testpay.py
@IDE:PyCharm
@Motto:レアル戦士、鋭いエラーに直面する勇気、荒涼とした警告に直面してみろ!
@QQ:[email protected]
@GROUP:878565760
--- ---------------------------------
「」」
輸入unittestの
unittestの輸入モックから

payment.PayMentインポートPayApiから


クラスTestPayApi(たunittest.TestCase):

    DEF test_success(自己):
        支払う= PayApi()
        pay.auth = mock.Mock(RETURN_VALUE = { 'STATUS_CODE': '200'})
        ステータス= pay.pay( '1000'、 '12345'、 '10000')
        自己.assertEqual(ステータス、 '支付成功')

    DEF test_fail(自己):
        支払う= PayApi()
        pay.auth = mock.Mock(RETURN_VALUE = { 'STATUS_CODE': '500'})
        ステータス= pay.pay( '1000'、 '12345'、 '10000')
        自己.assertEqual(ステータス、 '支付失败')

    DEF test_error(自己):
        支払う= PayApi()
        pay.auth = mock.Mock(RETURN_VALUE = { 'STATUS_CODE': '300'})
        ステータス= pay.pay( '1000'、 '12345'、 '10000')
        自己.assertEqual(ステータス、 '未知错误')

    デフtest_exception(自己):
        (= PayApiを支払う)
        pay.auth = mock.Mock(RETURN_VALUE = '200')
        の状態= pay.pay( '1000'、 '12345'、 '10000')
        self.assertEqual(ステータス'エラー、服务器异常! ')


もし__name__ == '__main__':
    unittest.main()

 

テスト出力

 

1000年....ユーザーは、同じ量の支払うことに失敗した
ユーザーの支払額10 000 1000年の成功を

-------------------------------------------------- --------------------
0.001sで4つのテストを実施しました

OK

プロセス終了コード0で終了

 

サードパーティ決済インタフェースが使用できない場合でも、結果から見ることができますが、我々はまだ自分の支払インターフェース・テストは合格します

一部の人々は、それが我々のテスト結果が有効であるかどうか、サードパーティ製の支払いを使用していない、頼むかもしれませんか?

通常、我々はモジュールをテストし、我々は他の機能モジュールを考慮することができるテスト結果が正しくなるように、テストモジュールへの目標は問題ありませんのみのため、正常な動作です

実際には、上記のコードも書くことが別の方法を使用することができます

モックオブジェクトのメソッド

 

""」
------------------------------------
@time:2019年6月26日夜3時22
@Auth:Linuxの超の
@file:testpay.py
@IDE:PyCharm
@Motto:レアル戦士、鋭いエラーに直面する勇気、荒涼とした警告に直面してみろ!
@QQ:[email protected]
@GROUP:878565760
--- ---------------------------------
「」」
インポートunittestの
unittestの輸入モックから
unittest.mock輸入パッチから

payment.PayMentインポートPayApiから


クラスTestPayApi(たunittest.TestCase):

    デフセットアップ(自己):
        self.pay = PayApi()

    @ patch.object(PayApi、 'AUTH')
    デフtest_success(自己、mock_auth):

        mock_auth.return_value = { 'STATUS_CODE': '200'}
        ステータス= self.pay.pay( '1000'、 '12345'、 '10000')
        self.assertEqual(ステータス、 '支付成功')

    @ patch.object(PayApi、 'AUTH')
    DEF test_fail(自己、mock_auth):
        mock_auth.return_value = { 'STATUS_CODE': '500'}
        ステータス= self.pay.pay( '1000'、 '12345'、「10000 「)
        self.assertEqual(ステータス、 '支付失败')

    @ patch.object(PayApi、 'AUTH')
    DEF test_error(自己、mock_auth):
        mock_auth.return_value = { 'STATUS_CODE': '300'}
        ステータス= self.pay.pay( '1000'、 '12345'、「10000 「)
        self.assertEqual(ステータス、 '未知错误')

    @ patch.object(PayApi、 'AUTH')
    デフtest_exception(自己、mock_auth):
        mock_auth.return_value = '200'
        の状態= self.pay.pay( '1000'、 '12345'、 '10000')
        self.assertEqual(ステータス、 'エラー、服务器异常!')


もし__name__ == '__main__':
    unittest.main()

 

最初に言うことではない模擬方法は、上記実施例と同様の文言が複数、通常の機能がモック

遂に

多くの組み込み関数モック方法があります。

そして、モック関数は、非常に強力である文または2を終えることができない、この記事では、モックの基本的な使用を導入し、より強力な方法はゆっくりする必要がどのようにマスターに、適用する方法を実践するために、非常に簡単です探ります

おすすめ

転載: www.linuxidc.com/Linux/2019-08/160338.htm