Вопрос

Мы используем TeamCity в качестве нашего CI-сервера, и я только начал видеть "TestFixtureSetUp Failed" в окне "сбой теста".

Есть какие-нибудь идеи, как мне приступить к отладке этой проблемы?Тесты отлично выполняются на моей рабочей станции (R # test runner в VS2008).

Это было полезно?

Решение

В реализации TestFixtureSetUp (и TestFixtureTearDown) есть небольшой недостаток: о каких-либо исключениях не сообщается. Я написал их первую реализацию, и я так и не смог заставить ее работать так, как предполагалось. В то время концепции в коде NUnit были тесно связаны с идеей, что действия были напрямую связаны с одним тестом. Таким образом, отчетность обо всем была связана с результатом теста. На самом деле не было места для сообщения о том, что произошло на уровне комплекта, без огромного переписывания (это не рефакторинг, когда вы превращаете овцу в эскалатор).

Из-за этой истории трудно понять, что на самом деле произошло в TestFixtureSetUp. Нет хорошего места, чтобы прикрепить ошибку. Вызов TestFixtureSetUp является побочным эффектом запуска теста, а не связан с ним напрямую.

@TrueWill имеет правильную идею. Проверьте журналы, а затем измените тест, чтобы добавить дополнительные журналы при необходимости. Возможно, вы захотите поместить в try / catch внутри TestFixtureSetup и много регистрировать в блоке catch. Я просто подумал, что мог бы добавить к этому некоторую предысторию (другими словами, это моя вина).

Другие советы

Сначала я бы проверил Журнал сборки.

Если это не очевидно из этого, вы могли бы попробовать включить Console.Строки записи в тестах - я не уверен, но я думаю, что они записываются в журнал сборки.В качестве альтернативы вы могли бы войти в файл (даже используя log4net, если хотите пофантазировать).

Если у вас установлена Visual Studio на сервере CI, вы могли бы попробовать запустить сборку / тесты оттуда.Если это проблема с подключением, это может решить ее.

Однако я видел проблемы с путями, когда относительные пути к файлам больше не были корректными или использовались абсолютные пути.Их сложнее отлаживать, и может потребоваться протоколирование путей, а затем проверка, существуют ли они на сервере сборки.

Я столкнулся с этим сегодня, когда создавал некоторые интеграционные тесты, которые долго выполнялись, и которые я не хочу дублировать. В итоге я обернул всю логику настройки тестового прибора в try / catch. Затем я добавляю метод SetUp, единственной целью которого является проверка того, произошел ли сбой во время настройки устройства, и обеспечение лучшей регистрации.

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);
    }
 }

Я получал ту же ошибку при запуске любого теста с SpecFlow с использованием Visual NUnit. Когда я попытался сделать то же самое из модуля Unit Test Explorer (предоставленного Resharper), он выдал немного более полезное сообщение: методы привязки с более чем 10 параметрами не поддерживаются. Я понял, что у меня не может быть метода SpecFlow с более чем 10 параметрами, пришлось удалить тест.

Я смог увидеть, что не правильно создавал свою тестовую базу данных, быстро переключившись на VS Unit Testing. В моем случае он смог лучше ответить на причину, по которой это не удалось. Я обычно использую NUnit. " Невозможно создать экземпляр класса X. Ошибка: System.Data.SqlClient.SqlException: произошла ошибка активации файла. Физическое имя файла '\ DbTest.mdf' может быть неправильным. Диагностируйте и исправьте дополнительные ошибки и повторите операцию. СОЗДАТЬ БАЗУ ДАННЫХ не удалось. Некоторые имена файлов не могут быть созданы. Проверьте связанные ошибки. & Quot;

Запустите модульный тест в режиме отладки . Вы можете найти ошибку времени выполнения в настройке.

Если вы используете SpecFlow и C # в Visual Studio, посмотрите на автоматически сгенерированный файл < what > .feature.cs после сбоя теста. В строке открытый частичный класс < what > Feature вы должны увидеть символ, который при наведении курсора покажет причину сбоя установки устройства NUnit. В моем случае некоторые мои методы BeforeFeature в моем классе TestHooks не были статичными. Все методы BeforeTestRun , AfterTestRun , BeforeFeature и AfterFeature должны быть статическими.

У меня была эта проблема, и она была вызвана добавлением в класс частного только для чтения Dictionary , почти так же, как вы добавили приватную константную строку .

Я пытался сделать 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 и SetUp, если таковые имеются, а затем выполняет целевой метод теста.

(2) Добавьте код обработки исключений для нового кода выше и зарегистрируйте / выведите фактическое исключение куда-нибудь.

В случае, если это может кому-то помочь: Вы можете поймать исключение и записать его в консоли на TearDown

Что-то вроде:

[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