11

Django プロジェクトで管理コマンドとして実行されている一連の統合レベルのテストがあります。これらのテストは、外部ソースからデータベースに取り込まれた大量の気象データの整合性を検証しています。私は非常に大量のデータを持っているため、テストが意味のあるものになるように、実稼働データベースに対してテストする必要があります。私が理解しようとしているのは、そのコマンドまたは接続オブジェクトに固有の読み取り専用データベース接続を定義する方法です。また、これらのテストは ORM を通過できないため、生の SQL を実行する必要があることも付け加えておきます。

私のテストの構造は次のようになります

class Command(BaseCommand):
    help = 'Runs Integration Tests and Query Tests against Prod Database'

    def handle(self,*args, **options):
        suite = unittest.TestLoader().loadTestsFromTestCase(TestWeatherModel)
        ret = unittest.TextTestRunner().run(suite)
        if(len(ret.failures) != 0):
            sys.exit(1)
        else:
            sys.exit(0)

class TestWeatherModel(unittest.TestCase):
    def testCollectWeatherDataHist(self):
        wm = WeatherManager()
        wm.CollectWeatherData()
        self.assertTrue(wm.weatherData is not None)

WeatherManager.CollectWeatherData() メソッドは次のようになります。

def CollecWeatherData(self):
    cur = connection.cursor()
    cur.execute(<Raw SQL Query>)
    wm.WeatherData = cur.fetchall()
    cur.close()

他の誰か (または私) が後でやって来て、誤って運用データベースを変更するテストを作成できないように、これをどうにかしてばかで証明したいと考えています。

4

4 に答える 4

1

繰り返しになりますが、ここに質問を投稿する前に、ドキュメントをもっと注意深く読む必要があります。設定ファイルで本番データベースへの読み取り専用接続を定義し、ドキュメントから直接定義できます。

複数のデータベースを使用している場合は、django.db.connections を使用して特定のデータベースの接続 (およびカーソル) を取得できます。django.db.connections は、エイリアスを使用して特定の接続を取得できる辞書のようなオブジェクトです。

from django.db import connections
cursor = connections['my_db_alias'].cursor()
# Your code here...
于 2016-09-30T14:49:05.193 に答える
0

モデルにシリアライザーを追加すると、読み取り専用モードで動作しているシリアライザーに特化できます

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ('id', 'account_name', 'users', 'created')
        read_only_fields = ('account_name',)

http://www.django-rest-framework.org/api-guide/serializers/#specifying-read-only-fieldsから

于 2016-09-30T14:45:40.697 に答える