ユニットテストと検証

Skip to content

これは機械翻訳されたテキストであり、誤りを含む可能性があります!

クラスを作成し、検証に取り組んできたので、テストを開始するための良い基盤ができました。テストは開発プロセスにおける重要な部分であり、コードが期待どおりに機能することを確認するのに役立ちます。

どのようにしてコードが正しく機能することを確認できるでしょうか?テストを行わなければ、どうでしょうか?

Unit Testingとは?

Unit Testingは、コードの小さな部分を自動的かつ体系的にテストする方法です。Pythonでは、pytestというモジュールを使用してテストを記述および実行します。「unit」は、アプリケーションの最小のテスト可能な部分であり、多くの場合、単一の関数またはメソッドです。pytestを使用する際には、pytestがテストを見つけられるように、テストファイルをtest_で始まる名前で付けたり、テスト関数をtest_で始まる名前で付けたりするなど、適切な命名規則に従うことが重要です。

Unitテストの例:

def test_add():
    # Dette er en testfunksjon for å sjekke addisjon.
    # これは加算を確認するためのテスト関数です。
    assert 0.3 + 0.3 + 0.3 == 0.9

ターミナルで pytest と入力して実行します。

Fun fact

上記のコードは失敗します。なぜなら、Pythonでは.3+.3+.3が0.8999999999になるからです!

Easy 課題 1 - pytest をインストールする

仮想環境に pytest をインストールしてください。ターミナルで次のコマンドを実行することで行います。

pip install pytest
# pytestをインストールします

Easy 課題 2 - テストを作成する

プロジェクトフォルダーに test_data.py という新しいファイルを作成します。このファイルで、前のモジュールで作成した Person クラスのテストを作成します。テストは、有効な値で Person が作成できることを確認する必要があります。

テストの例を以下に示します。

from main import Person

def test_person_working():
    bob_kaare = Person(name="Bob Kåre",
                       eye_color=EyeColor.BLUE,
                       phone_number=PhoneNumber("12345678"),
                       email=Email("bob_kaare@example.com"))
    # ボブ・コーレという名前の人物を作成します
    assert bob_kaare.name == "Bob Kåre"
    # 名前が正しいことを確認します
    assert bob_kaare.eye_color == EyeColor.BLUE
    # 目の色が青であることを確認します

このタイプのテストは「ハッピーパス」テストと呼ばれます。なぜなら、有効な値を入力したときにすべてが期待通りに機能するかどうかをテストするものであり、あまり役に立たないからです。

Medium 課題 3 - テストの検証

test_person.py に、EmailPhoneNumber のバリデーションが正しく機能するかを確認するためのテストをさらに作成します。有効な値と無効な値の両方をテストしてください。ここでは、特定の例外がスローされることを確認する pytest の関数 raises を使用する必要があります。

import pytest

def test_exception():
    with pytest.raises(KeyError):
        my_dict = {"a": 1, "b": 2}
        value = my_dict["c"]  # これはKeyErrorを「発生させる」でしょう

Tip

test_ で始まる関数名であれば、好きなだけ関数を作成できます。

Løsning: Eksempel på en test for ugyldig e-post
from main import Email

import pytest

def test_invalid_email():
    with pytest.raises(ValueError):
        email = Email("not-an-email")

なぜこれを行うのか?

コードに対する優れたテストを持つことで、コードが意図したとおりに機能することを確認でき、コードに変更を加えた場合に問題が発生したかどうかを簡単に把握できます。 これは、多くの開発者が協力し、間違いを犯しやすい大規模なプロジェクトでは特に重要です。

例えば、JestやSeleniumなどのソフトウェアを使用することで、ウェブサイトを自動的にテストし、コードの変更ごとにすべてが意図したとおりに機能することを確認できます。「ユーザー登録」、「支払い」、および「ログイン」が意図したとおりに機能することを私たちは知りたいのではないでしょうか?

Tenk over følgende scenarioer

何が起こる(または起こるべきか)..:

  • 既に使われているメールアドレスでユーザーが登録しようとした場合?
  • ユーザーの生年月日が未来の場合?
  • ユーザーが名前を “jOHN dOE” と入力した場合?

A software tester walks into a bar...

Hard 課題 4 - 自動テスト (CI)

GitHub にコードを公開する際、GitHub Actions を設定することで、コードを変更するたびにテストを自動的に実行できます。これは Continuous Integration (CI) と呼ばれ、コードが常に期待どおりに機能することを確認するのに役立ちます。

プロジェクトフォルダーに .github/workflows/pytest.yml というファイルを作成します。このファイルに次のコードを追加します。

name: Pytest

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.11'
    - name: Install dependencies
      run: |

        python -m pip install --upgrade pip
        pip install pytest
        # プロジェクトに必要な他の依存関係をインストールします
        pip install -r requirements.txt
    - name: Run tests with pytest
      run: pytest

もし正しく設定していれば、GitHubリポジトリに「Actions」という新しいタブが表示されるはずです。そこで、コードを変更するたびにテストが自動的に実行されていることや、テストが失敗した場合(赤い×印とメールで通知)を確認できます。

Merknad om filstruktur

ファイル構造がGitHub Actionsの動作を左右します。.github フォルダがプロジェクトのルートディレクトリにあり、テストファイルが配置されている tests フォルダも同様であることを確認してください。

必要に応じて、pytest.yml ファイルを編集して正しいフォルダを指すように変更できます。

このような Actions ファイルは、コードを複数の Python バージョンまたはオペレーティングシステムでテストするためにも使用できます。また、ソフトウェアを自動的にビルドおよび公開するためにも使用できます。たとえば、ウェブサイトを公開したり、App Store または Google Play でアプリを更新したりできます。

Code Coverage

コードカバレッジと呼ばれるものもあり、コードのどの程度が実際にテストされているかを確認するのに役立ちます。 これは、テストが十分かどうか、またはコードの一部がまったくテストされていないかどうかを判断するのに役立ちます。

一部の職場では、コードが堅牢であり、期待どおりに機能することを保証するために、デプロイする前にコードの一定の割合がテストでカバーされていることを要求しています。

Unit Test Meme