PTYEST-Djangoクラススコープで作成されたDBトランザクションをロールバックしない方法 -- python フィールド と django フィールド と pytest フィールド と pytest-django フィールド 関連 問題

How to not roll back db transactions created in pytest-django fixture of class scope












1
vote

問題

日本語

私はDjango(via href="htptps://pypi.python.org/pypi/pytest-django" real="nofollownoreferrer"> Pytest-Django )と私を使っています。データベース内にいくつかのモデルを作成し、次に NOT を作成する範囲の class の固定具を持つことが可能であるかどうか疑問に思う。例えば;

<事前> <コード> @pytest.fixture(scope='class') def expensive(): return MyModel.objects.create() @pytest.mark.django_db() class TestMyModel: def test_a(self, expensive): MyModel.objects.get() # All good def test_b(self, expensive): MyModel.objects.get() # raises MyModel.DoesNotExist

これは単純化された例です。実際のコードでは、フィクスチャ<コード> expensive は実際には時間がかかることをしています(そして私は実際にはパラメータテストを使用していますが、それを作ることは想像しています)。違います。私の欲求は、フィクスチャで作成されたデータは、他のテストと干渉しないようにクラスの範囲外に一度ロールバックされることです。

私が私がしようとしていることのように見えているように見えているように見えます。 DJANGO_DB_BLOCKER これは私が欲しかったときに振る舞うことができませんでした。

英語

I'm using pytest with Django (via pytest-django) and I'm wondering if it's possible to have a fixture of scope class that creates some models in the database and then not have those models removed at the end of each test.

For example;

@pytest.fixture(scope='class') def expensive():     return MyModel.objects.create()   @pytest.mark.django_db() class TestMyModel:      def test_a(self, expensive):           MyModel.objects.get()  # All good      def test_b(self, expensive):           MyModel.objects.get()  # raises MyModel.DoesNotExist              

This is just a simplified example, in my actual code the fixture expensive is actually doing something that takes some time (and I'm actually using a parametrize test but I imagine that won't make any difference). My desire is that the data created in the fixture expensive is rolled back once out of the scope of the class so as to not interfere with other tests.

It appears as if what I'm trying to do might be possible using the fixture django_db_blocker however I was not able to get this to behave as I wanted.

</div
           
   
   

回答リスト

0
 
vote

私は最後の数日間同じ問題に苦労していて、ほとんどすべての場合に働く解決策を思い付くことができました。 - (NSInteger)age:(NSDate *)dateOfBirth { NSCalendar *calendar = [NSCalendar currentCalendar]; unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; NSDateComponents *dateComponentsNow = [calendar components:unitFlags fromDate:[NSDate date]]; NSDateComponents *dateComponentsBirth = [calendar components:unitFlags fromDate:dateOfBirth]; if (([dateComponentsNow month] < [dateComponentsBirth month]) || (([dateComponentsNow month] == [dateComponentsBirth month]) && ([dateComponentsNow day] < [dateComponentsBirth day]))) { return [dateComponentsNow year] - [dateComponentsBirth year] - 1; } else { return [dateComponentsNow year] - [dateComponentsBirth year]; } } 2 Sourceに基づいて一緒にハッキングされました。テストクラスに追加した場合は、必ず組み込まれていない - (NSInteger)age:(NSDate *)dateOfBirth { NSCalendar *calendar = [NSCalendar currentCalendar]; unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; NSDateComponents *dateComponentsNow = [calendar components:unitFlags fromDate:[NSDate date]]; NSDateComponents *dateComponentsBirth = [calendar components:unitFlags fromDate:dateOfBirth]; if (([dateComponentsNow month] < [dateComponentsBirth month]) || (([dateComponentsNow month] == [dateComponentsBirth month]) && ([dateComponentsNow day] < [dateComponentsBirth day]))) { return [dateComponentsNow year] - [dateComponentsBirth year] - 1; } else { return [dateComponentsNow year] - [dateComponentsBirth year]; } } 3 DBマークを付けてください。

<事前> <コード> - (NSInteger)age:(NSDate *)dateOfBirth { NSCalendar *calendar = [NSCalendar currentCalendar]; unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; NSDateComponents *dateComponentsNow = [calendar components:unitFlags fromDate:[NSDate date]]; NSDateComponents *dateComponentsBirth = [calendar components:unitFlags fromDate:dateOfBirth]; if (([dateComponentsNow month] < [dateComponentsBirth month]) || (([dateComponentsNow month] == [dateComponentsBirth month]) && ([dateComponentsNow day] < [dateComponentsBirth day]))) { return [dateComponentsNow year] - [dateComponentsBirth year] - 1; } else { return [dateComponentsNow year] - [dateComponentsBirth year]; } } 4

うまくいった1つのケースは、DB Accessを必要とする実行の最初のテストが - (NSInteger)age:(NSDate *)dateOfBirth { NSCalendar *calendar = [NSCalendar currentCalendar]; unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; NSDateComponents *dateComponentsNow = [calendar components:unitFlags fromDate:[NSDate date]]; NSDateComponents *dateComponentsBirth = [calendar components:unitFlags fromDate:dateOfBirth]; if (([dateComponentsNow month] < [dateComponentsBirth month]) || (([dateComponentsNow month] == [dateComponentsBirth month]) && ([dateComponentsNow day] < [dateComponentsBirth day]))) { return [dateComponentsNow year] - [dateComponentsBirth year] - 1; } else { return [dateComponentsNow year] - [dateComponentsBirth year]; } } 5 を使用している場合、TearDownメソッドはデータベース接続を残すと思います。残りのテストが機能できないという奇妙な状態。フルテスト実行で、または個々のテストクラスまたはモジュールをテストするとき、または個々のテストクラスまたはモジュールをテストするとき

 

I was struggling with the same issue for the last couple of days and managed to come up with a solution that works in almost all cases. Its kind of hacked together based on the pytest-django source. If you add it to a test class make sure to not add any built in pytest-django db marks.

import psycopg2 from django.apps import apps from django.test.utils import setup_databases, teardown_databases # alternatively if you're not on django 1.11 you need # from pytest_django.compat import setup_databases, teardown_databases  @pytest.fixture(scope='class') def class_scoped_db(django_db_blocker):     try:         django_db_blocker.unblock()         # if test db exists use it and delete all objects once done         _ = psycopg2.connect(dbname='test_{your_db_name}')         yield         # drop all objects created once we are out of scope         for app_name in {list of your django apps}:             for model in apps.get_app_config(app_name).get_models():                 model.objects.all().delete()      except psycopg2.OperationalError:         # if test db doesn't exist then create one and tear down once done         db_cfg = setup_databases(verbosity=pytest.config.option.verbose,                                  interactive=False)         yield         teardown_databases(db_cfg, verbosity=pytest.config.option.verbose)      finally:         django_db_blocker.restore() 

The one case I've found in which it doesn't work is when the first test to run that needs db access uses the class_scoped_db, I think the teardown method leaves the database connection in a strange state that the remaining tests cannot work with. Works fine for me in a full test run or when testing the individual test class or module

</div
 
 

関連する質問

1  特定のIPを使用したDjango RESTクライアントテスト  ( Django rest client test with specific ip ) 
django rest docs META 。 そのため、IPアドレス/サブネットを格納する 99887761 モデルを作成する必要があります。私のデータベースのすべての 302 サブネットをすでに持っていました。 <事前> <コード> from res...

1  Python Manage.pyテストからPytest-Djangoを呼び出す方法  ( How to call pytest django from python manage py test ) 
私はPytest_Wrp と呼ばれるカスタム管理コマンドを作成しました だからを呼び出すとき <事前> <コード> python manage.py test このコードのビットは呼び出されます。 <事前> <コード> class Command(test...

0  テストデータベースの移行のカスタム順序  ( Custom order of test database migrations ) 
大規模なアプリケーションでDjangoテストを実行しています。テストデータベースを必要とするため、テストを実行する前にテストデータベースを作成する必要があります。しかし、問題は - いくつかの依存関係の問題のために、移行は次の順序で実行する必要があります。 m...

3  PytestとPytest-Django:各テストをさまざまなコンテキストで複数回実行するにはどうすればよいですか。  ( Pytest and pytest django how can i run each test complete with setup and teard ) 
マルチテナントシステムのテストプラットフォームを設定しています。 書込テストごとに、テナントごとにテストを作成し、テスト実行全体をラップして、データベースの接続前のデータベースの接続前のスレッドローカル変数をフラッシュしているところでは、データベースのティア...

2  PytestでDjango API ListViewを正しくテストする方法  ( How to properly test django api listview with pytest ) 
Postmanで撮影したときに正しく機能するAPI ListViewエンドポイントを持っていますが、テストで空のQuerySetとステータス404を返します。 テスト結果: <事前> <コード> web_1 | > assert respons...

1  SQLiteからPostgresへ移行するときに未解決を更新する方法(Django)  ( How to update unittests when migrating from sqlite to postgres django ) 
多くの景色/モデルを使ってやや大きいDjangoプロジェクトを持っています。私は最近SQLite3からPostgresへのプロジェクトをローカルに移行し、さらに縮小するように計画しました(Postgresを別のマシンに置きます)。 SQLiteからPostg...

3  Pytest-DjangoでPostgresデータベースを設定する方法  ( How to set up postgres database with pytest django ) 
Pytest-Djangoは、テストデータベースを作成するときにPostgres拡張子をインストールしたいと思います。私はこれを働かせるためにこれを手に入れようとするようにconftest.pyとムックしてきました、しかし私は立ち往生しています。 私のcon...

7  Django Testsをデータベースに書き込むことを強制します  ( Force django tests to write models into database ) 
非常に単純なDjangoプロジェクトと非常に簡単なテストを設定しています。 <事前> <コード> def test_name(self): t = Thing.objects.create(name='a') print(t.id) i...

1  Djangoはテンプレートタグテストで設定を上書きしません  ( Django does not override settings in template tag testing ) 
まあ、私は以下の元のコンテンツ内のコードが彼らの小さなコンテキストにそれほど制限されているので、いくつかの答えや解説をしていません。それの代わりにCodeBase全体をあなたと共有したいと思いました(don 'あなたが望むようにあなたが望む限りを確認することが...

2  選択的なDjango PytestのためにLocMemCacheを使用してください  ( Use locmemcache for selective django pytest ) 
Django REST Frameworkの simpletethrottle と私のカスタムクラスをPytestでテストしたいと思います。デフォルトのテスト設定はDumMyCacheを使用しているため、この特定のテストモジュールのみの場合はLocMemCa...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有