C# 处理数据库数据时xUnit测试上的死锁
所以我有两个类,每个类都包含数据库集成测试。在每个类的构造函数中,我放置了一个重置数据库的方法:C# 处理数据库数据时xUnit测试上的死锁,c#,visual-studio-2015,database-connection,integration-testing,xunit,C#,Visual Studio 2015,Database Connection,Integration Testing,Xunit,所以我有两个类,每个类都包含数据库集成测试。在每个类的构造函数中,我放置了一个重置数据库的方法: public class FirstClassSpec { public FirstClassSpec() { var dataSetup = new DataSetup(); dataSetup.CleanTables(); } [Fact] public async Task FirstTest() { using
public class FirstClassSpec {
public FirstClassSpec() {
var dataSetup = new DataSetup();
dataSetup.CleanTables();
}
[Fact]
public async Task FirstTest() {
using(var conn = new SqlConnection("connStringHere")){
var result = await conn.ExecuteAsync("someSqlCommand");
Assert.True(result > 0);
}
}
}
public class SecondClassSpec {
public SecondClassSpec() {
var dataSetup = new DataSetup();
dataSetup.CleanTables();
}
[Fact]
public async Task SecondTest() {
using(var conn = new SqlConnection("connStringHere")){
var result = await conn.ExecuteAsync("someSqlCommand");
Assert.True(result > 0);
}
}
}
public class DataSetup {
public void CleanTables() {
using(var conn = new SqlConnection("connStringHere")){
await conn.Execute("someSqlCommandToCleanTables");
}
}
}
为了运行Visual Studio 2015测试,我使用测试资源管理器中的运行所有测试。我得到了他的消息
事务(进程ID{someID})在锁资源上处于死锁状态
用另一种方法
只有运行所有测试时,才会出现此问题。如果我一个接一个地运行每个测试,或者从同一个类运行多个测试,死锁永远不会发生。
我发现类的构造函数中调用的CleanTables()
方法导致了这种情况。我假设测试并行运行,并且两个类同时调用了CleanTables()
。
因此,我尝试将CleanTables()
转换为异步方法:
public async Task<int> CleanTables() {
using(var conn = new SqlConnection("connStringHere")){
return await conn.Execute("someSqlCommandToCleanTables");
}
}
但现在,当我尝试运行所有测试时,测试都在运行,但它们从未完成,我也从未得到结果
我的问题是,为什么会出现僵局?为什么将CleanTables()
方法更改为async会使运行的测试无法完成?我真的需要在每次测试运行之前清理表
-----------更新-----------------
我尝试过用[Collection[“CollectionName”]]
装饰所有测试类,每个类都有不同的名称:
[Collection["FirstSpec"]]
public class FirstClassSpec {
//....
}
[Collection["SecondSpec"]]
public class FirstClassSpec {
//....
}
但僵局仍然存在
--------------更新2-----------------
结果表明,具有相同集合名称的类将按顺序执行,这解决了死锁问题。关于并行运行的测试,您的猜测是正确的。默认情况下,xUnit不会并行运行同一类中的测试。因此,为了解决问题,您可以将所有测试移到一个类中。或者,您可以使用[Collection(“My Collection”)]
来装饰类,以指示两个类中的测试不应并行运行
您可以在此处了解更多关于xUnit如何决定如何并行运行测试的信息:您是否尝试过使用?它在过去帮助过我。谢谢你的解决方案!但是不,我不想把所有的测试移到一个类中(这将变得很难维护)。今天晚些时候,我将尝试用[Collection[“我的收藏”]
装饰我的课堂。如果这是工作,我会把你的答案标记为答案!:)我尝试过用[Collection[“CollectionName”]]装饰所有测试类,每个类都有不同的名称。。但僵局仍然存在。。我已经更新了我的问题。每个类都应该有相同的集合名称。它可以工作!现在这对我来说很有意义,因为类的collectionName是相同的,它们是按顺序执行的。。谢谢你的时间,伙计!哇,我不认为这将在与ConfigureWait混战了几天之后起作用,但我还是在绝望中尝试了它。。。瞧!给这个人一个铃铛!:-)
[Collection["FirstSpec"]]
public class FirstClassSpec {
//....
}
[Collection["SecondSpec"]]
public class FirstClassSpec {
//....
}