2018年7月18日水曜日

Fabric2 で Mock テストをやる方法

概要

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 件のコメント:

コメントを投稿