2

私はdjangoと単体テストの両方に不慣れで、モデルの単体テストを構築しようとしていますが、いくつかの問題があります。

私はいくつかのモデルを密接に連携させています:

Resourceファイルリソースを維持します

MetadataFieldリソースに追加できるメタデータ フィールドを表し、フィールドでいっぱいのテーブルに対応します

MetadataValueMetadataField ID をリソース ID および対応する値と照合します。これは、Resource - MetadataField 多対多関係の中間テーブルです。

MetadataSchema多くの からなるスキーマを表しますMetadataFields。それぞれResourceが割り当てられ、MetadataSchemaどのコントロールMetadataFieldsによって表されるかを制御します

関係:

Resource - MetadataField       : Many-to-Many through MetadataValue
MetadataValue - MetadataSchema : Many-to-Many
Resource - MetadataSchema      : One-to-Many

これらのモデルを処理するためのテストの書き方がわかりません。Test Driven Djangoチュートリアルのモデル テストでは、ほとんどの場合、オブジェクトの初期化と属性の検証がカバーされているようです。これらのオブジェクトのセットアップを行うと、他のすべてのオブジェクトを使用する必要があるため、テストはすべて、テストすることを意図していないコードに依存します。たとえば、リソースを作成する場合は、メタデータ スキーマとそのスキーマ内のフィールドの値も割り当てる必要があります。

私はdjangoで単体テストされたモデルの良い例を探しましたが、何も見つけることができませんでした(djangoのWebサイトには単体テストがないようです.これらのプロジェクトはすべて、テストが不十分/不足しているか、いくつかのケースで発生しています.テストは良好ですが、モデルはほとんど使用されていません。

私が見る可能なアプローチは次のとおりです。

  • 多くのモッキングを行って、1 つのクラスのみをテストしていることを確認し、モデルの単体テストを非常にシンプルに保ち、メソッド/属性のみをテストしますが、関係が正しく機能していることは確認しません。次に、より高いレベルの統合テストに依存して、関係などの問題を検出します。
  • 他の機能に依存するユニットテストを設計し、障害が発生した場所を簡単に確認できる場合は、1 つの関数の中断によって複数のテストが中断されることを受け入れます。したがって、リソースに を正常に追加できるかどうかをテストするメソッドが必要になる可能性があります。MetadataValueこれには、少なくとも 1 つの と を設定する必要がありMetadataSchemaますResource。次に、try - exceptブロックを使用して、実際にテストしようとしているものを処理するアサーションの前にテストが失敗した場合、障害が別の場所にあることを示唆する特定のエラー メッセージが表示されるようにすることができます。このようにして、複数の失敗したテスト メッセージをすばやくスキャンして、本当の原因を見つけることができました。ただし、すべてのテストでこの分離を確実に行うことはできません。

私はこれを理解するのに苦労しているので、これがすべて理にかなっているのかどうかはわかりませんが、この種の状況のベストプラクティスがあれば教えてください! ありがとう

4

3 に答える 3

1

django フィクスチャを使用して、テスト用のデータをロードできます。これは、モデルが大幅に変更されると、非常に時間がかかり、保守が困難になる可能性があります。

Factory Boyのようなライブラリを使用することをお勧めします。これにより、必要なときにテスト用のオブジェクトをオンデマンドで作成できます。ファクトリはいくつでも設定できます。いくつかの例をここで見ることができます。ここでは、モッカー ライブラリを使用したモックの例と、django アプリをテストするための多くのヒントも見ることができます。

于 2012-12-29T21:04:17.343 に答える
1

私にとって、単体テストの目的は、コードの UNITS を分離してそれらのみをテストすることであり、すべての依存関係について心配する必要はありません。私があなたの考えを正しく理解していれば、あなたは統合テスト (2 つ以上のモデル間の関係) である何かを作成したいと考えています。

個別のモジュールをテストするには、特に多くのコードを使用する場合は、依存関係をモックすることを好みます。Google はこれを Python モックの最初のオプションとして返しました (世の中にはたくさんあると思います)。

もう1つは、依存関係が多すぎる場合です。モックする必要があるのは、おそらく密結合のためにアーキテクチャを再考する必要があることを意味します:)

幸運を!

于 2012-12-25T15:14:24.127 に答える
0

フィクスチャを使用すると、コードを記述せずにモデル データをロードできます。

于 2012-12-25T11:02:04.383 に答える