문제

우리는 TeamCity를 CI 서버로 사용하고 방금보기 시작했습니다. "TestFixtureSetUp Failed" 테스트 실패 창에서.

이 문제를 어떻게 디버깅하는지 아십니까? 테스트는 내 워크 스테이션 (VS2008의 R# 테스트 러너)에서 잘 실행됩니다.

도움이 되었습니까?

해결책

TestFixTuresEtup (및 TestFixTureTearDown)의 구현에 약간의 결함이 예외는 잘보고되지 않았습니다. 나는 그것들의 첫 번째 구현을 썼고 나는 그것이 예상되는 방식대로 작동하지 않았다. 당시 Nunit 코드의 개념은 행동이 단일 테스트와 직접 관련이 있다는 아이디어와 밀접하게 결합되었습니다. 따라서 모든 것에 대한보고는 테스트 결과와 관련이있었습니다. 큰 재 작성없이 스위트 레벨에서 일어난 일을보고 할 공간은 없었습니다 (양을 에스컬레이터로 바꿀 때 리팩토링이 아닙니다).

그 역사 때문에 TestFixTuresEtup에서 실제로 일어난 일을 찾기가 어렵습니다. 오류를 첨부하기에 좋은 장소는 없습니다. TestFixTuresEtup 호출은 테스트와 직접 관련이있는 대신 테스트를 실행하는 부작용입니다.

@truewill은 올바른 아이디어를 가지고 있습니다. 로그를 확인한 다음 테스트를 수정하여 필요한 경우 더 많은 로깅을 추가하십시오. TestFixTuresEtup 내부에 시도/캐치에 넣고 캐치 블록에 많이 로그인 할 수 있습니다. 방금 배경을 추가 할 수 있다고 생각했습니다 (다시 말해 내 잘못입니다).

다른 팁

먼저 빌드 로그를 확인하겠습니다.

그것이 분명하지 않다면, 당신은 테스트에 console.writelines를 포함 시키려고 시도 할 수 있습니다 - 나는 긍정적이지 않지만, 그것들은 빌드 로그에 기록된다고 생각합니다. 또는 파일에 로그인 할 수 있습니다 (공상을 원한다면 log4net을 사용하더라도).

CI 서버에 Visual Studio가 설치되어 있으면 빌드/테스트를 실행해 볼 수 있습니다. 연결 문제라면 해결할 수 있습니다.

그러나 파일에 대한 상대 경로가 더 이상 정확하지 않거나 절대 경로가 사용되지 않은 경로 문제를 보았습니다. 이들은 디버그하기가 더 어렵고 경로를 기록한 다음 빌드 서버에 존재하는지 확인해야 할 수도 있습니다.

나는 오늘 오랫동안 실행중인 설정이있는 통합 테스트를 만들 때 오늘이 문제를 해결했습니다. 시도/캐치로 모든 테스트 고정 장치 설정 로직을 포장했습니다. 그런 다음 고정 장치 설정 중에 고장이 발생했는지 확인하고 더 나은 로깅을 제공하는 유일한 목적이있는 설정 방법을 추가합니다.

Exception testFixtureSetupException = null;

[TestFixtureSetUp]
public void FixtureSetup()
{
    try
    {
        // DoTestFixtureSetup
    }
    catch (Exception ex)
    {
        testFixtureSetupException = ex;
    }
}

[SetUp]
// NUnit doesn't support very useful logging of failures from a TestFixtureSetUp method. We'll do the logging here.
public void CheckForTestFixturefailure()
{         
    if (testFixtureSetupException != null)
    {
        string msg = string.Format("There was a failure during test fixture setup, resulting in a {1} exception. You should check the state of the storage accounts in Azure before re-running the RenewStorageAccountE2ETests. {0}Exception Message: {3}{0}Stack Trace:{4}",
            Environment.NewLine, testFixtureSetupException.GetType(), accountNamePrefix, testFixtureSetupException.Message, testFixtureSetupException.StackTrace);
        Assert.Fail(msg);
    }
 }

Visual Nunit을 사용하여 Specflow로 테스트를 실행하는 동안 동일한 오류가 발생했습니다. Unit Test Explorer (Resharper가 제공)에서 동일한 작업을 시도했을 때 조금 더 도움이되는 메시지를 제공했습니다. 10 개 이상의 매개 변수를 가진 바인딩 방법은 지원되지 않습니다. 10 개 이상의 매개 변수가있는 사양 메소드가없고 테스트를 제거해야한다는 것을 깨달았습니다.

VS 장치 테스트로 빠른 전환을 통해 테스트 데이터베이스를 올바르게 만들지 않았다는 것을 알 수있었습니다. 제 경우에는 실패한 이유에 대한 더 나은 응답을 반환 할 수있었습니다. 나는 보통 Nunit을 사용합니다. "클래스 X의 인스턴스를 만들 수 없음. 오류 : System.Data.sqlclient.sqlexection : 파일 활성화 오류가 발생했습니다. 실제 파일 이름 ' dbtest.mdf'가 잘못 될 수 있습니다. 추가 오류를 진단하고 수정하고 작업을 다시 시도합니다. 데이터베이스 생성 실패. 나열된 일부 파일 이름을 생성 할 수 없습니다. 관련 오류를 확인하십시오. "

단위 테스트를 실행하십시오 디버그 모드. 설정에서 런타임 오류를 찾을 수 있습니다.

Visual Studio에서 Specflow 및 C#을 사용하는 경우 자동 생성 된 것을보십시오. <whatever>.feature.cs 테스트가 실패한 후 파일. 에 public partial class <whatever>Feature 라인, 당신은 호버링 될 때 Nunit Fixture 설정이 실패한 이유를 보여줄 기호를 볼 수 있습니다. 제 경우에는 내 BeforeFeature 내 방법 TestHooks 클래스는 정적이 아니었다. 모두 BeforeTestRun, AfterTestRun, BeforeFeature, 그리고 AfterFeature 방법은 정적이어야합니다.

이 문제가 있었는데 개인을 추가로 추가하여 발생했습니다. Dictionary 수업에서 당신이 추가하는 것과 거의 같은 방식으로 private const string.

나는 만들려고 노력했다 Dictionary 일정하지만 컴파일 시간에는 그렇게 할 수 없습니다. 나는 내 넣어 이것을 해결했다 Dictionary 그것을 반환하는 방법에서.

필드 초기화 중 오류로 인해이 증상이 발생했습니다. 당신이 당신의 필드를 초기화하는 경우 [SetUp] 방법, 더 나은 오류 메시지가 표시됩니다.

[TestFixture]
internal class CommandParserTest
{
    // obscure error message
    private CommandParser parser = new CommandParser(...);
    ...
}

[TestFixture]
internal class CommandParserTest
{
    private CommandParser parser;

    [SetUp]
    public void BeforeTest()
    {
        // better error message
        parser = new CommandParser(...);
    }
    ...
}

나는 오늘 이것에 어려움을 겪었다. 실제 오류를 얻기 위해 다음을 수행했습니다.

(1) 문제가되는 테스트 고정물의 인스턴스를 초기화하는 별도의 고정물에 다른 테스트를 작성하고 TestFixTuresEtup과 같은 설정 방법을 명시 적으로 호출하고 대상 테스트 방법을 실행합니다.

(2) 위의 새 코드에 대한 예외 처리 코드를 추가하고 실제 예외를 어딘가에 로그 / 출력하십시오.

누군가를 도울 수있는 경우 : 예외를 포착하여 분해시 콘솔에 쓸 수 있습니다.

같은 것 :

[SetUpFixture]
public class BaseTest
{
    private Exception caughtException = null;

    [SetUp]
    public void RunBeforeAnyTests()
    {
        try
        {
            throw new Exception("On purpose");
        }
        catch (Exception ex)
        {
            caughtException = ex;               
        }
    }

    [TearDown]
    public void RunAfterAnyTests()
    {
        if (caughtException != null)
        {
            Console.WriteLine(string.Format("TestFixtureSetUp failed in {0} - {1}", this.GetType(), caughtException.Message));
        }           
    }

}

결과는 다음과 같습니다.

TestFixTuresEtup은 IntegratedTests.services.baseTest에서 실패했습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top