LoginSignup
2
1

More than 3 years have passed since last update.

2行のシェルスクリプトのテストコードが60行になった話

Last updated at Posted at 2019-03-25

うちの開発チームではすべてのプログラムにテストコードを書こうとしています。
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行になりました。これはさすがにテスト書き過ぎでしょうか。
(終わり)

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1