概要
Fabric2 はデプロイツールで対象のサーバに SSH してコマンドを実行することができます
fabric を含むコードをテストする場合対象のサーバにアクセスできない状況などあると思います
その場合に unittest.Mock を使うことで擬似的に SSH してテストすることができます
今回はその方法を紹介します
環境
- macOS 10.13.5
- Python 3.6.5
- fabric 2.1.3
テスト対象のコード
vim my_fab.py
from fabric import Connection
class MyFab(object):
def __init__(self):
self.conn = Connection("root@172.28.128.3", connect_kwargs = { "password": "xxxxxxx" })
def call(self):
return self.conn.run('uname -s')
if __name__ == "__main__":
f = MyFab()
res = f.call()
print(res)
これで実行すると当然ですが指定の IP アドレスに SSH 接続しにいきます
これを Mock 化して実際には SSH しないでテストしたいと思います
Mock を使ったテストコード
vim test_my_fab.py
import unittest
from my_fab import MyFab
from unittest.mock import patch, MagicMock
class TestMyFabClass(unittest.TestCase):
@patch('my_fab.Connection')
def test_call(self, mock):
mock_res = MagicMock(return_value='Linux')
mock.return_value.run = mock_res
f = MyFab()
res = f.call()
print(res)
self.assertEqual(res, 'Linux')
if __name__ == '__main__':
unittest.main()
ポイントは @patch('my_fab.Connection')
です
fabric.Connection
ではなく自分で作成したモジュールを指定します
あとは Connection はメソッドなので mock.return_value.run
で返り値を設定します
最後に
fabric2 で Mock を使ったテスト方法を紹介しました
run と同じように put なども Mock 化すればテストできると思います
0 件のコメント:
コメントを投稿