第4章. テスト
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
しかし、SQLAlchemy では、単体テストのためにクエリ文やモデルを正しくモックするのは大変な作業です。しかし SQLAlchemy では、単体テストのためにクエリ文やモデルを正しくモックアウトするのは大変な労 力です。その労力は、多くの場合、機能テスト中にデータベースをテストすることよりも大きな利 益にはつながらない。そのため、単体テスト中に簡単にモックアウトできるようなクエリのラッパー関数を作ったり、単体テストと関数テストの両方でデータベースに対してテストしたりするようになる。私自身は、可能であれば小さなラッパー関数を使いたいし、それが何らかの理由で意味をなさない場合やレガシーコードの場合はモックアウトしたい。
この章では、データベースに対して機能テストを行う方法と、SQLAlchemy のクエリとコネクションをモック アウトする方法について述べます。
テストデータベースを使ったテスト
サンプルアプリケーションのために、アプリケーションロジックを含むapp.pyファイルと、データベーステーブルと接続を含むdb.pyファイルを用意する。これらのファイルはサンプルコードのCH05/フォルダに発見できる。
アプリケーションがどのように構造化されているかは実装の詳細であり、どのようにテストを行う必要があるかにかなり影響する。db.pyでは、データベースがDataAccessLayer 。データベーススキーマを初期化して、好きな時にエンジンに接続できるようにするために、このデータアクセスクラスを使っている。このパターンは、SQLAlchemy と結合したときに、Web フレームワークで共通に使われる。DataAccessLayer クラスは、dal 変数でエンジンと接続なしで初期化される。例 4-1にdb.pyファイルのスニペットを示す。
例4-1. DataAccessLayer クラス
fromdatetimeimportdatetimefromsqlalchemyimport(MetaData,Table,Column,Integer,Numeric,String,DateTime,ForeignKey,Boolean,create_engine)classDataAccessLayer:connection=Noneengine=Noneconn_string=Nonemetadata=MetaData()cookies=Table('cookies',metadata,Column('cookie_id',Integer(),primary_key=True),Column('cookie_name',String(50),index=True),Column('cookie_recipe_url',String(255)),Column('cookie_sku',String(55)),Column('quantity',Integer()),Column('unit_cost',Numeric(12,2)))defdb_init(self,conn_string):self.engine=create_engine(conn_string ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access