AnsibleモジュールのテストをPy.testで書いてみる
ちょっと
前提
ローカルモジュールと
して 動かす ことを 前提に した コードを 書く -
モジュール全体の
テストは、 "Exercising module code locally" セクションを 真似に 行く
https://github.com/ansible/ansible/blob/devel/lib/ansible/module_utils/basic.py この
辺を 読みつつ解決してる
課題1: AnsibleModuleのexit_json,fail_jsonがSystemExitを返すのでテストが死ぬ
内容
AnsibleモジュールをAnsibleModule
オブジェクトを
パラメーターの
読み込みと チェック 正否の
結果を Ansibleに 通知
を
で、exit_json
, fail_json
をsys.exit
が
py.testでsys.exit
だ途中に
対策
import pytest
import local_module # テスト対象のモジュール。ちゃんと処理内で、パラメーターのチェックをする
def test_no_args():
"""何もパラメーターが無いと、リターンコード1が返る
"""
with pytest.raises(SystemExit) as exited:
local_module.main()
assert exited.value.code == 1
sys.exit() がSystemExit
を
課題2: テスト中にパラメーター読み込みで結果が変わらず、テストが機能しない
この
import io
import json
import pytest
import local_module # テスト対象のモジュール。ちゃんと処理内で、パラメーターのチェックをする
def test_no_args():
"""何もパラメーターが無いと、リターンコード1が返る
"""
with pytest.raises(SystemExit) as exited:
local_module.main()
assert exited.value.code == 1
def test_with_args(monkeypatch):
"""nameパラメーターがあれば、リターンコード0が返る
"""
with pytest.raises(SystemExit) as exited:
stdin = json.dumps({'ANSIBLE_MODULE_ARGS': {'name': 'hello'}})
monkeypatch('sys.stdin', io.String(stdin))
local_module.main()
assert exited.value.code == 0
なにもAnsibleModule
を_load_params
と_ANSIBLE_ARGS
をglobal
宣言して_load_params
を
対策
_ANSIBLE_ARGS
にも
import io
import json
import pytest
import local_module # テスト対象のモジュール。ちゃんと処理内で、パラメーターのチェックをする
def test_no_args(monkeypatch):
"""何もパラメーターが無いと、リターンコード1が返る
"""
monkeypatch('sys.stdin', None)
with pytest.raises(SystemExit) as exited:
local_module.main()
assert exited.value.code == 1
def test_with_args(monkeypatch):
"""nameパラメーターがあれば、リターンコード0が返る
"""
monkeypatch('sys.stdin', None)
with pytest.raises(SystemExit) as exited:
stdin = json.dumps({'ANSIBLE_MODULE_ARGS': {'name': 'hello'}})
monkeypatch('sys.stdin', io.String(stdin))
local_module.main()