SQL Server への呼び出しを呼び出す .net コードのテストをいくつか作成しました。結果として生じるデータベースへの変更をロールバックするには、使用System.Transactions
が優れた選択肢のようです。一部の純粋主義者がデータベースをモックしたいと提案することは承知していますが、私はその道をたどりません。これは厳密に純粋な単体テストではありません。
いくつかのテストを作成して実行すると、これは期待どおりに機能します。テスト セットアップ メソッドとテスト ティアダウン メソッドで、.net トランザクションを初期化および中止するためのコードを単純に記述しました。それは素晴らしい解決策のように思えました。
しかし、私が抱えている問題は、これらのテストを 100 回実行しようとすると、それらの多くが、1 つずつ実行すると合格したにもかかわらず、SQL Server に接続できないという例外をスローすることです。さらに悪いことに、テストを実行すると、データベース内のテーブルが散発的にロックされることがあります。ロックを手動で削除するよう DBA に依頼する必要があります。
多くの人が知っているように、SQL サーバーに対して (このテストを実行する場合のように) 開発ワークステーションで実行されるコードで TransactionScope を使用すると、.net フレームワークで MSDTC が使用されます。
私がやっていることを説明するためのコードサンプルは次のとおりです。
<TestInitialize()> Public Sub MyTestInitialize() _scope = New System.Transactions.TransactionScope( _ System.Transactions.TransactionScopeOption.Required, New TimeSpan(0, 2, 0)) End Sub
<TestCleanup()> Public Sub MyTestCleanup()
_scope.Dispose()
End Sub
<TestMethod()> Public Sub CurrentProgramUser_Get_UserID()
Dim ProgramSessionId As String
Dim CurrentProgramUserId As Integer
Dim dSession As ProgramSession
CurrentDCMAUserId = Convert.ToInt32( _
SqlHelper.ExecuteScalar(testDcmaConnString, System.Data.CommandType.Text, _
"INSERT into Program_Users(UserName,FirstName,LastName) " & _
"VALUES('GuitarPlayer','Bob','Marley')" & _
"SELECT IDENT_CURRENT('Program_users') ") _
)
ProgramSessionId = session.getCurrentSession()
session.WriteUserParam("Program", ProgramSessionId, "USERID", CurrentProgramUserId.ToString(), testSource, testConnString)
Dim readValue As Integer
readValue = session.User.UserID
Assert.AreEqual(CurrentProgramUserId, readValue)
End Sub
ご覧のとおり、ここには特に派手なものはありません。メソッドで見つけたいものをデータベースに書き込むテストメソッドがあります。これはほんの一例です。このようなテストは他にもたくさんあります。
私のテストの論理は正しいようです。テストが失敗するだけでなく、散発的にユーザーをテーブルからロックアウトする原因は何ですか?