Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ Unittestにおけるセットアップとティアダウン:テスト環境の管理 | Unittestフレームワークの習得
Python構造化プログラミング
セクション 5.  3
single

single

bookUnittestにおけるセットアップとティアダウン:テスト環境の管理

メニューを表示するにはスワイプしてください

テストの4つのフェーズ:

  1. SetUp:環境の準備。データベース内のオブジェクト作成、サービスの起動やデータベース接続の設定など、システム状態の構成が含まれる場合がある;
  2. Act:テスト対象の関数やメソッドの実行;
  3. Assert:結果を期待値と照合し、検証;
  4. TearDown:各テスト後のクリーンアップ。これにより、環境への変更が後続のテストに影響しないようにする。

SetUpとTearDownは任意のフェーズ。

SetUpとTearDownの実装

UnittestのsetUpおよびtearDownメソッドは、それぞれ各テストメソッドの前後に呼び出されるインスタンスメソッド

ここでは、カスタムのBookおよび__repr__メソッドを持つsaleクラスを例に説明。

class Book:
    def __init__(self, title, author, amount):
        self.title = title
        self.author = author
        self.amount = amount

    def __repr__(self):
        return f"<Book {self.title}, written by {self.author}, {self.amount} pieces>"

    def sale(self):
        if self.amount > 0:
            self.amount -= 1
        else:
            return "This book sold out"

次に、TestBookクラス内にテストケースを定義。

import unittest

class TestBook(unittest.TestCase):
    def setUp(self):
        print("Setting up the environment for each test.")
        self.book = Book("1984", "George Orwell", 2)

    def tearDown(self):
        print("Cleaning up after each test.")
        del self.book

    def test_sale(self):
        self.book.sale()
        assert self.book.sale() == "This book sold out"

    def test_book_repr(self):
        self.assertEqual(repr(self.book), "<Book 1984, written by George Orwell, 2 pieces>")

test_saleケースが通過した後、setUpメソッドが各テストの前に実行されるため、test_book_reprでは本の冊数が元の値にリセットされる。

メソッドレベルのSetUpとTearDownにより、各テストがクリーンな環境で実行され、テストの予測性と独立性が確保される。

SetUpClassとTearDownClassの実装

これらはテストクラス全体で一度だけ、テストスイートの開始時と終了時に実行されるクラスメソッド。

class TestBook(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        """This code will run before all tests"""
        print("Setting up the environment for all tests.")
        cls.book = Book("1984", "George Orwell", 2)

    @classmethod
    def tearDownClass(cls):
        """This code will run after all tests"""
        print("Cleaning up after all tests.")

    def test_sale(self):
        self.book.sale()
        assert self.book.sale() == "This book sold out"

    def test_book_repr(self):
        self.assertEqual(repr(self.book), "<Book 1984, written by George Orwell, 2 pieces>")
        # An AssertionError will occur because the amount was changed in the
        # 'test_sale' and the book was not updated prior to this test.

クラスレベルのSetUpとTearDownは、作成や破棄にコストがかかるリソースの準備やクリーンアップのオーバーヘッドを削減する。

タスク

スワイプしてコーディングを開始

unittestのsetUpおよびtearDownメソッドを使い、Bookクラスのテストを実践します。

  • TestBookを継承したテストクラスunittest.TestCaseを定義します。
  • setUpメソッドを実装し、タイトルがBook、著者が'1984'、冊数が'George Orwell'2インスタンスを作成し、self.bookに代入します。
  • tearDownメソッドを実装し、self.bookインスタンスを削除します。
  • test_saleという名前のメソッドを追加し、以下を行います:
    • self.booksaleメソッドを2回呼び出す;
    • 2回目の呼び出しの戻り値が'This book sold out'であることをアサートします。
  • test_book_reprという名前のメソッドを追加し、self.bookの文字列表現が'<Book 1984, written by George Orwell, 2 pieces>'であることをアサートします。
  • テストが通るように、必ずこれらの関数名およびクラス名を正確に使用してください。

解答

Switch to desktop実践的な練習のためにデスクトップに切り替える下記のオプションのいずれかを利用して、現在の場所から続行する
すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 5.  3
single

single

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

some-alt