Language

ResourceLockAttribute クラス

定義

テストまたはテスト クラスが名前付き共有リソースで競合することを宣言します。そのため、アセンブリ内並列スケジューラは、クラス全体またはアセンブリが DoNotParallelizeAttributeによる並列化を強制的にオプトアウトするのではなく、同じリソースを宣言する他のテストにのみ対してシリアル化します。

[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true, Inherited=true)]
[System.Runtime.CompilerServices.Nullable(0)]
public sealed class ResourceLockAttribute : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true, Inherited=true)]
public sealed class ResourceLockAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true, Inherited=true)>]
[<System.Runtime.CompilerServices.Nullable(0)>]
type ResourceLockAttribute = class
    inherit Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true, Inherited=true)>]
type ResourceLockAttribute = class
    inherit Attribute
Public NotInheritable Class ResourceLockAttribute
Inherits Attribute
継承
ResourceLockAttribute
属性

注釈

リソースは、自由形式の不透明な文字列キーによって識別されます。 2 つのロックは、大文字と小文字を区別する序数比較を使用して、 Resource 文字列が等しい場合にのみ、同じリソースを参照します。 キーは、パスではなく識別子です。それらの間に階層リレーションシップは推論されません (たとえば、 C:\out キーと C:\out\sub は関係のないキーです)。 入力ミスがサイレント 競合ではなくコンパイル エラーになるように、インライン文字列リテラルよりも const フィールドと WellKnownResources を優先します。

ロック スコープは、現在のテスト ホスト プロセスのみです。 この属性はプロセスまたはマシン間で調整されないため、並列 dotnet test 呼び出しは相互に排他的になりません。

スケジュール チャンクが開始され、チャンクが終了した後に解放される前にロックが取得されるため、個々のテスト メソッドではなくチャンクによってロックが保持される期間が決まります。 チャンクの形式は、 Scopeによって異なります。

ClassLevel (既定値) では、チャンクはクラス全体であるため、クラス レベルのロックが 1 回実行され、[ClassInitialize]と[ClassCleanup]にまたがるクラス内のすべてのテストにわたって保持されます。 チャンクのロックは、クラスとすべてのメソッドの宣言されたキーの和集合であり、それぞれがクラス内の任意の場所で宣言された最も強力なモードにアップグレードされるため、このスコープでは個々のメソッドに対してロックを宣言しても、ロックがより細かくなります。

MethodLevelではチャンクは 1 つのテストであるため、クラス レベルのロックが各テストに個別に適用され、テストごとに取得および解放されます。 したがって、他のクラスからのテストはこのクラスの 2 つのテスト間でインターリーブする可能性があり、 [ClassInitialize] で確立されたリソースは [ClassCleanup]を通じて継続的に所有されません。

どちらの場合も、テストをカバーするロックは、そのテストの [TestInitialize] と [TestCleanup]にわたって保持されます。 チャンクが複数のロックを保持している場合、ロックは序数順に並べ替えられたキー順序で取得されるため、デッドロックが発生しません。

テストも DoNotParallelizeAttributeマークされている場合、その属性が優先され、宣言されたリソース ロックは影響を与えません。このようなテストはシーケンシャル フェーズで実行され、ロックを取得する並列スケジューラを通過することはありません。

この属性は継承されます。基本テスト クラスで宣言されたロックは、そのクラスから派生するすべてのクラスに適用され、 DoNotParallelizeAttributeに一致します。 これは保守的な方向です。共有リソースに触れる基本フィクスチャは派生クラスから引き続きそれに触れ、オーバーロックは単に低速で、アンダーロックではレースが発生します。 結果に注意してください。派生クラスは継承されたロックを削除することも、継承された ReadWrite を Readに弱くすることもできないため、 ClassLevel では、広く使用されている基底クラスのロックによって階層全体がシリアル化されます。 実際に必要な最も派生型のロックを宣言します。

コンストラクター

名前 説明
ResourceLockAttribute(String)

ReadWrite アクセスを使用して、指定したリソースのResourceLockAttribute クラスの新しいインスタンスを初期化します。

プロパティ

名前 説明
Mode

リソースのアクセス モードを取得または設定します。 既定値は ReadWrite (排他) です。 テストがリソースを読み取るだけで、他のリーダーと同時に実行し、ライターに対してのみブロックできるように、 Read に設定します。

Resource

共有リソースを識別する不透明なキーを取得します。 序数、大文字と小文字を区別する比較を使用して比較します。

適用対象