入門 テストコード

テストコードが書けると何がいいのか

  • 良いコード(変更しやすい、言語の機能を引き出している)に 近づけていく

  • 今の全霊をかけたコードだが、よりよい書き方を知ったら書き換えたい

変更するたびに、壊していないか不安
壊す=振る舞いを変えてしまう

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文のドキュメント

言語リファレンス 7.3. assert 文

注釈

表明なるもの

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

注釈

キーワード src-layout

src ディレクトリを作るやり方。OSSのライブラリではこちらが主流

src レイアウト対フラットレイアウト

テストを実行

テストが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 は環境構築の確認のためのものなので消して構いません

注釈

assert False で始める儀式

拙ブログより assert Falseで始める儀式

最初はpytestの導入でつまづくこともあったので、新しいプロジェクトでこの儀式をしてました