Mockテストは何ですか?
4751 ワード
一.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.既存のフレームワークによる
三.くりを一つあげる
Mockクラスの定義
シンプルなdemo
ここでテストする必要があるのはCountクラスのadd関数ですが、この関数はまだ書かれていません.
''' '''
class Count(object):
def add(self):
pass
''' '''
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
完了機能セクション
''' '''
class Count(object):
def add(self, a, b):
return a + b
''' '''
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.元のモジュール
''' '''
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)
''' '''
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モジュールが必要です.
''' '''
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()