Как диагностировать “Сбой TestFixtureSetUp”
Вопрос
Мы используем 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 - специально