うちの開発チームではすべてのプログラムにテストコードを書こうとしています。
pythonをメインに使うので、pytestに慣れています。
ある日、pytestの実行をシェルスクリプトで書こうとしました。
そのシェルスクリプトのテストコードをまたpytestを使って書いてみました。
シェルスクリプトの名前はctestとします。中身はこれだけです。
# !/bin/sh
pytest
この2行のシェルスクリプトのテストをpytestで書いてみました。
import os
import pytest
import subprocess
PATH = os.path.join(os.path.dirname(__file__), '..', 'ctest')
# 共通部分を関数化
def create_dummy_test(tmpdir, result):
p = tmpdir.mkdir('tests').join('test_dummy.py')
p.write("""\
def test_dummy():
assert {}
""".format("True" if result else "False"))
os.chdir(tmpdir)
# 成功したらexit 0を返す
def test_exit_0_when_success(tmpdir):
create_dummy_test(tmpdir, True)
status = subprocess.call((PATH,))
assert status == 0
# 失敗したらexit 1を返す
def test_exit_1_when_fail(tmpdir):
create_dummy_test(tmpdir, False)
status = subprocess.call((PATH,))
assert status == 1
# 実行するとpytestが実行される
def test_execute_pytest_when_execute_ctest():
res = subprocess.run(
["/bin/sh", "-x", PATH], stderr=subprocess.PIPE)
assert b'+ pytest' in res.stderr
# 実行するとfailedと結果が表示される
def test_show_failed_result_when_execute_ctest(tmpdir):
create_dummy_test(tmpdir, False)
res = subprocess.run(
[PATH], stdout=subprocess.PIPE)
assert b"failed" in res.stdout
# 実行するとpassedと結果が表示される
def test_show_passed_result_when_execute_ctest(tmpdir):
create_dummy_test(tmpdir, True)
res = subprocess.run(
[PATH], stdout=subprocess.PIPE)
assert b"passed" in res.stdout
改行含めて60行になりました。これはさすがにテスト書き過ぎでしょうか。
(終わり)