Как сообщить о прогрессе при сбое тестов NUnit на сервере CruiseControl.NET? - PullRequest
2 голосов
/ 12 июля 2009

Nunit довольно хорошо работает с CruiseControl.NET, но есть одна вещь, которая меня сильно раздражает. Если есть тест, приводящий к сбою Nunit, я получу лишь небольшую информацию о сбое, поскольку XML-отчет Nunit не может быть создан и объединен с отчетом CruiseControl.

Мне нужен способ сообщить о прогрессе, даже если во время выполнения происходит сбой Nunit.

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

Ответы [ 4 ]

1 голос
/ 21 июля 2009

Я думаю, что лучшим решением было бы создание надстройки NUnit, реализующей интерфейс EventListener для захвата события TestStarted для вывода хода выполнения на консоль или в файл.

Интерфейс EventListener документирован на веб-сайте NUnit: http://nunit.org/index.php?p=eventListeners&r=2.5

Кроме того, мы можем улучшить отчет Dashboard даже в случае сбоя NUnit во время его выполнения. Мы можем использовать следующую процедуру, чтобы DashBoard всегда показывал что-то о тестах.

  1. Запуск тестов с помощью EventListener, который выводит прогресс в отдельный файл
  2. После запуска тестов используйте другую программу для проверки файла
  3. Если файл не содержит определенной «конечной строки», создайте специальный XML-отчет на основе этого файла и объедините его с журналом CruiseControl
0 голосов
/ 13 июля 2009

CruiseControl.net рекомендует использовать NUnit через своего компоновщика (т.е. NAnt / MSBuild). Смотрите здесь: http://confluence.public.thoughtworks.org/display/CCNET/NUnit+Task. Как они описывают - это позволит вам сначала запустить эти тесты локально - что должно дать вам исключение, которое вы можете очистить.

Как говорится, ваши разработчики выполняют эти модульные тесты перед проверкой кода? Это может облегчить эту проблему. Если это проблема интеграции - я бы предложил взять самую последнюю кодовую базу и запустить тесты локально, чтобы посмотреть, что не в порядке.

Я не знаю, может ли NUnit создать файл результатов даже в случае его сбоя. Даже если это произойдет - вы можете столкнуться с проблемами, если этот файл не будет правильно сформирован из-за сбоя.

0 голосов
/ 15 июля 2009

Вы могли бы использовать подход @ jpoh, но сделать это в методе TestSetup, который потребовал бы, чтобы вы делали это для каждого прибора. Если это действительно необходимо, вы можете написать базовый класс, который наследует все ваши тестовые приложения, которые реализуют этот метод.

Другое решение - использовать MSBuild для запуска NUnit и использовать задачу в библиотеке MSBuildCommunityTasks. Это позволяет продолжить при ошибке, а также получить код ошибки от NUnit. Вы не поймете, какой метод вызвал проблему, но может помочь некоторым. Вот моя цель MSBuild:

  <Target Name="UnitTest"
            DependsOnTargets="BuildIt">

    <NUnit Assemblies="@(TestAssemblies)"
              ToolPath="$(NUnitx86Path)"
              WorkingDirectory="%(TestAssemblies.RootDir)%(TestAssemblies.Directory)"
              OutputXmlFile="@(TestAssemblies->'%(FullPath).$(NUnitFile)')"
              Condition="'@(TestAssemblies)' != ''"
              ExcludeCategory="$(ExcludeNUnitCategories)"
              ContinueOnError="true">
      <Output TaskParameter="ExitCode" ItemName="NUnitExitCodes"/>
    </NUnit>

    <!-- Copy the test results for the CCNet build before a possible build failure (see next step) -->
    <CallTarget Targets="CopyTestResults" Condition="'@(TestAssemblies)' != ''"/>
    <Error Text="Test error(s) occured" Code="%(NUnitExitCodes.Identity)" Condition=" '%(NUnitExitCodes.Identity)' != '0' And '@(TestAssemblies)' != ''"/>

  </Target>

Это, вероятно, не будет соответствовать вашим потребностям, как есть, но есть кое-что, что можно попробовать.

Тем не менее, я согласен с @rifferte в том, что, похоже, вам нужно отладить проблему локально, а не полагаться на CC.NET для обработки отчетов.

0 голосов
/ 13 июля 2009

Если вы хотите получить имя текущего текущего теста, вы можете получить его с помощью следующего:

using System.Diagnostics;

...

[Test]
public void SomeTestThatWillCrash()
{
    StackFrame sf = new StackFrame();
    Console.WriteLine("Now running method: " + sf.GetMethod().Name);
    ...

} 
...