Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理数据库数据时xUnit测试上的死锁_C#_Visual Studio 2015_Database Connection_Integration Testing_Xunit - Fatal编程技术网

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 {
    //....
}