當我運行我的xUnit單元測試時,有時會出現一個錯誤消息,例如「事務(進程ID 58)在另一個進程上死鎖在鎖資源上並且已被選爲死鎖受害者」測試,看似隨機。如果我自己重新運行任何失敗的測試,它會通過。x單元測試死鎖
我應該怎麼做才能防止這種情況?是否有一個選項可以一次又一次地運行測試,而不是一次全部運行?
這裏(NB我的Visual Studio 2015年中運行了我的ASP.Net MVC 5控制器API方法測試)是我偶爾的失敗測試中的一個例子:
[Fact]
private void TestREAD()
{
Linq2SQLTestHelpers.SQLCommands.AddCollections(TestCollections.Select(collection => Convert.Collection2DB(collection)).ToList(), TestSettings.LocalConnectionString);
foreach (var testCollection in TestCollections)
{
var testCollectionFromDB = CollectionsController.Get(testCollection.Id);
Assert.Equal(testCollection.Description, testCollectionFromDB.Description);
Assert.Equal(testCollection.Id, testCollectionFromDB.Id);
Assert.Equal(testCollection.IsPublic, testCollectionFromDB.IsPublic);
Assert.Equal(testCollection.LayoutSettings, testCollectionFromDB.LayoutSettings);
Assert.Equal(testCollection.Name, testCollectionFromDB.Name);
Assert.Equal(testCollection.UserId, testCollectionFromDB.UserId);
}
}
有兩種方法的測試呼叫,這裏的控制器方法:
[HttpGet("{id}")]
public Collection Get(Guid id)
{
var sql = @"SELECT * FROM Collections WHERE id = @id";
using (var connection = new SqlConnection(ConnectionString))
{
var collection = connection.Query<Collection>(sql, new { id = id }).First();
return collection;
}
}
和這裏的輔助方法:
public static void AddCollections(List<Collection> collections, string connectionString)
{
using (var db = new DataClassesDataContext(connectionString))
{
db.Collections.InsertAllOnSubmit(collections);
db.SubmitChanges();
}
}
(請注意,我在控制器方法中使用Dapper作爲微型ORM,因此爲避免可能在測試中重複出現錯誤,我使用LINQ to SQL代替測試中的設置和清理測試數據)。
單元測試的類的構造函數和Dispose方法中還有數據庫調用。如果需要,我可以將它們添加到帖子中。
您可能要分享您正在編寫的測試類型 - 對「異步」/「任務」管理等的一些洞察。現在你可以做任何事情,顯然有一些人正在取得成功,我們只需要弄清楚你的背景下有什麼泄露/鎖定...... –
完成了,這足夠嗎? – dumbledad
嗯 - 看起來不像那些可以歸咎於xUnit那麼多。你是否在打斷連接[及其相關的鎖]? –