入門 テストコード¶
テストコードが書けると何がいいのか¶
良いコード(変更しやすい、言語の機能を引き出している)に 近づけていく
今の全霊をかけたコードだが、よりよい書き方を知ったら書き換えたい
変更するたびに、壊していないか不安
壊す=振る舞いを変えてしまう
3つのアプローチ
祈る 🙏🙏「どうか変わっていませんように」🙏🙏
不安だけど確認はしない
手で動作確認 ✋
対話モードでimportして動作確認
確認するので安心できるが、関数の数が増えると現実的でない
コードを書いて動作確認 🤖(自動テスト)
「手で動作確認」の自動化
プログラムで使う部品のコードは、プログラムを書いて動作確認(ちょうぜつ本)
自動化しているので繰り返し確認できる
自動テストにより、変更して振る舞いを変えていないかという不安は 退屈 に変わる
「自動テストが1つも失敗していないから振る舞いは変わってない!」(回帰テスト)
このテストは開発者のためのもの(開発中に自信を持てる)
品質保証のためのテストは別に必要です
IMO:テストコード書かないなんて、 もったいない ですよ
assert
文¶
- 前提:
start
ディレクトリにいます
対話モード
>>> assert True
>>> assert False
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
True
と評価される式と assert
¶>>> 1 == 1
True
>>> assert 1 == 1
False
と評価される式と assert
¶>>> 1 == 2
False
>>> assert 1 == 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
書いてみて練習しよう(別の数字、別の型)
注釈
表明なるもの
「assert
って(pytestのテストコード以外で)どこで使うの?」と思った方へ
ディレクトリ構成¶
pytestは
ファイルを置く
assert
を使って関数を書く(後述)
現在
start/
├── src/
│ └── fizzbuzz/
│ ├── __init__.py
│ └── core.py
├── tests/
│ ├── __init__.py
│ └── test_practice.py
└── pyproject.toml
このように育ちます(イメージです)
start/
├── src/
│ └── fizzbuzz/
│ ├── __init__.py
│ └── core.py
├── tests/
│ ├── __init__.py
│ ├── test_core.py
│ └── test_fizzbuzz.py
└── pyproject.toml
テストを実行¶
テストが1つ用意されています。
def test_環境構築の確認():
assert False
このテストを実行してみましょう。
pytest
(.venv) $ pytest
================================== test session starts ==================================
platform darwin -- Python 3.12.6, pytest-8.3.3, pluggy-1.5.0
rootdir: /.../first-python-test-2024/start
configfile: pyproject.toml
collected 1 item
tests/test_practice.py F [100%]
======================================= FAILURES ========================================
_____________________________________ test_環境構築の確認 ______________________________________
def test_環境構築の確認():
> assert False
E assert False
tests/test_practice.py:2: AssertionError
================================ short test summary info ================================
FAILED tests/test_practice.py::test_環境構築の確認 - assert False
=================================== 1 failed in 0.02s ===================================
用語紹介
- pass:
テストが通る(すべてのテストが成功。pytestでは . が並ぶ)
- fail:
テストが落ちる(1つでもテストが失敗。F(やE)が1つ以上ある)
何をしたのか¶
pytest と実行したら
test_環境構築の確認
が落ちたassert False
と書いているので、落ちるのは当然なぜこんなことをした?
assert False
で落ちることを確認したかった
環境構築に失敗したら他のところで落ちる
環境構築できているから
assert False
で落ちる
assert True
に書き換えたら? -> 通る!🙌
(.venv) $ pytest
================================== test session starts ==================================
platform darwin -- Python 3.12.6, pytest-8.3.3, pluggy-1.5.0
rootdir: /.../first-python-test-2024/start
configfile: pyproject.toml
collected 1 item
tests/test_practice.py . [100%]
=================================== 1 passed in 0.01s ===================================
準備ができました!
tests/test_practice.py
は環境構築の確認のためのものなので消して構いません