xUnit 테스트 교착 상태

dapper linq-to-sql xunit.net

문제

내 xUnit 유닛 테스트를 실행할 때 "트랜잭션 (프로세스 ID 58)이 다른 프로세스의 잠금 리소스에서 교착 상태에 빠졌으며 교착 상태로 선택되었습니다"라는 오류 메시지가 표시되는 경우가 있습니다. 실패한 테스트를 다시 실행하면 테스트가 통과됩니다.

이것을 막기 위해 무엇을해야합니까? 테스트를 한 번에 하나씩 실행하는 옵션이 있습니까?

(주의 : Visual Studio 2015에서 ASP.Net 5 MVC 컨트롤러의 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();
    }
}

(컨트롤러에서 마이크로 ORM으로 Dapper를 사용하고 있으므로 테스트에서 중복되는 오류를 방지하기 위해 테스트에서 SQL 대신 LINQ를 사용하여 테스트 데이터를 설정 및 정리합니다. .)

유닛 테스트의 클래스 생성자와 Dispose 메소드에도 데이터베이스 호출이 있습니다. 필요한 경우 게시물에 추가 할 수 있습니다.

수락 된 답변

좋아요, 앱에 교착 상태가있는 단순한 바닐라 케이스와이를 처리 할 필요가있는 것 같습니다. 앱 측의 계획은 무엇입니까?

테스트와 데이터 조작은 잠재적으로 동일한 문제에 빠질 수 있습니다. xUnit은이 문제를 해결할만한 것이 없으며 나는 그것을 강력하게 주장하지 않을 것입니다.

따라서 테스트와 앱 모두에서 실패 / 재시도 관리가 필요합니다.

웹 응용 프로그램의 경우 고래 사진을 촬영하여 패턴을 다시 시도하게하지만 궁극적으로는 실제 솔루션을 원합니다.

테스트를 위해서 고래는 원하지 않고 그것을 다루기를 원합니다.

폴리곤을 사용하여 중대한 오류가 발생하기 쉬운 응용 프로그램이나 테스트에서 재검토 장식을 감싸는 데 사용할 것입니다. 귀하의 상황에서 심각한 실패가 무엇인지 알아내는 것입니다.


정상적인 상황에서 동 기적으로 작동하는 단일 리더 / 라이터가있는 데이터베이스는 교착 상태가되어서는 안됩니다. 왜 그것이 발생하는지 분석하는 것은 DB 측에서 분석을 수행하는 문제입니다. 그 옆에있는 도구는 경쟁 테스트 결과 인 전반적인 System Under의 일부면을 가지고있는 경우 예를 들어 신속하게 알려줄 것입니다.

(물론 CollectionsController.Get(testCollection.Id) 와 컨트롤러 메소드가 static 이 아니기 때문에 연결이 끊어지기 때문에 미리보기가 불완전합니다.이 토론의 요점은 IMO 수준이 아니어야합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.