2

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

ご覧のとおり、ここには特に派手なものはありません。メソッドで見つけたいものをデータベースに書き込むテストメソッドがあります。これはほんの一例です。このようなテストは他にもたくさんあります。

私のテストの論理は正しいようです。テストが失敗するだけでなく、散発的にユーザーをテーブルからロックアウトする原因は何ですか?

4

1 に答える 1

2

問題が見つかりました。私がテストしていたメソッドの 1 つは、SqlDataReaderオブジェクトを使用します。どうやら、接続を解放するには、スコープから出るClose()前にメソッドを呼び出す必要があるようSqlDataReaderですが、私の場合はそうしませんでした。

mySqlDataReader.Close()テスト中のメソッドの最後に追加するだけで問題が解決しました。また、この特定のメソッドをテストするためのテスト メソッドは、100 を超えるテスト ケースでデータ駆動型だったため、接続が不足する可能性がありました。

于 2010-06-21T19:22:48.347 に答える