Mockテストは何ですか?


一.Mockコンセプト


mockは,シミュレーション,すなわちシミュレーションインタフェースが返す情報を意味し,返す必要がある情報を既存の情報に置き換え,上位モジュールのテストを実現する.ここでは2つのテストに分けられる.1つはフロントエンド対インタフェースのmockであり、1つはバックエンドユニットテストに関連するmockである.
単純なフロントエンドmockは,パッケージングツールFiddler,Charlesにより実現でき,エージェントが返すデータを修正することで,多様なシーンのテストを実現できる.ここではバッグツールで説明します.
バックエンドのMockはインタフェースの観点から、あるインタフェースAが返すデータが別のインタフェースBに依存する必要がある場合、敏捷開発中にBインタフェースがまだ完全に開発されていない場合にMockを使用する必要がある.
python 3.0のmockモジュールはunittestに統合されています.
参照先:https://www.cnblogs.com/fnng/p/5648247.html参照先:https://docs.python.org/3/library/unittest.mock.html参照先:http://engineroom.trackmaven.com/blog/making-a-mockery-of-python/

二.インプリメンテーションモード


1.mockサービスプラットフォームの利用


easymock

2.既存のフレームワークによる

  • java ->
  • python -> unittest.mock

  • 三.くりを一つあげる


    Mockクラスの定義

  • class Mock(spec=None,side_effect=None,return_value=DEFAULT,name=None)
  • spec:Mockオブジェクトの属性値を定義します.リスト、文字列、オブジェクトのインスタンス
  • です.
  • side_effect:例外を放出したり、戻り値を動的に変更したりしてreturn_を上書きできます.value
  • return_value:mockの戻り値
  • を定義する
  • name:mockオブジェクトの識別子としてprint時に
  • を見ることができる.

    シンプルなdemo


    ここでテストする必要があるのはCountクラスのadd関数ですが、この関数はまだ書かれていません.
  • count
  • ''' '''
    class Count(object):
        def add(self):
            pass
    
  • test_count
  • ''' '''
    from unittest import mock
    import unittest
    from API_Mock.count import Count
    
    class TestCount(unittest.TestCase):
        def test_add(self):
            mycount = Count()
            add_value = 13
            # mock mycount add 13
            mycount.add = mock.Mock(return_value=add_value)
            # add 
            result = mycount.add(8,5)
            # mock 
            self.assertEqual(result,add_value)
    
    if __name__ == '__main__':
        unittest.main()
    

    出力結果:
    Ran 1 test in 0.000s
    
    OK
    
    Process finished with exit code 0
    

    完了機能セクション

  • count
  • ''' '''
    class Count(object):
        def add(self, a, b):
            return a + b 
    
  • test_count
  • ''' '''
    from unittest import mock
    import unittest
    from API_Mock.count import Count
    
    class TestCount(unittest.TestCase):
    
        def test_add(self):
            mycount = Count()
            add_value = 13
            # side_effect return_value 。
            mycount.add = mock.Mock(return_value=add_value , side_effect=mycount.add)
    
            # add 
            result = mycount.add(8,8)
            print(result)
    
            # mock 
            mycount.add.assert_called_with(8,8)
            self.assertEqual(result, 16)
            
            
    if __name__ == '__main__':
        unittest.main()
    

    テスト依存の解決


    上はただ単独のモジュールに対してテストを行うだけで、私たちがテストしたAモジュールはBモジュールが返したデータを前提として、Bモジュールが返した結果が間違っていれば、Aモジュールのテストに失敗することもあります.ここでもmockがBモジュールの戻りをシミュレートする必要がある.
    1.元のモジュール
  • count
  • ''' '''
    class Count(object):
        def add(self, a, b):
            return a + b
    
        def mutiply(self,a,b):
            return a*b
    
        def add_and_mutiply(self,a,b):
            addition = self.add(a,b)
            mutiple = self.mutiply(a,b)
            return (addition,mutiple)
    
  • test_count
  • ''' '''
    from unittest import mock
    import unittest
    from API_Mock.count import Count
    
    class TestCount(unittest.TestCase):
    
        def test_add_and_mutiply(self):
            mycount = Count()
            x = 3
            y = 5
            addition,mutiple = mycount.add_and_mutiply(x,y)
            self.assertEqual(8,addition)
            self.assertEqual(15,mutiple)
    
    
    if __name__ == '__main__':
        unittest.main()
    

    2.依存項目の欠落
    依存項目が欠落している場合、すなわちモジュールBはエラーを返し、ここではモジュールAのテストが正常であることを保証しなければならない.
    ここでadd関数に結果+3を返します
    class Count(object):
        def add(self, a, b):
            return a + b+3
    

    だから、次のような間違いがあります.
  • エラー
  • Ran 1 test in 0.000s
    FAILED (failures=1)
    
    11 != 8
    Expected :8
    Actual   :11
    

    テストケースの実行に失敗しましたが、実際にはモジュールAに変更はありません.ここでmockBモジュールが必要です.
  • test_count
  • ''' '''
    from unittest import mock
    import unittest
    from API_Mock.count import Count
    from unittest.mock import patch
    
    class TestCount(unittest.TestCase):
        def test_add_and_mutiply(self):
            mycount = Count()
            x = 3
            y = 5
            mycount.add = mock.Mock(return_value = 8)
            addition,mutiple = mycount.add_and_mutiply(x,y)
    
            mycount.add.assert_called_with(3,5)
    
            self.assertEqual(8,addition)
            self.assertEqual(15,mutiple)
    
    
    if __name__ == '__main__':
        unittest.main()