Как вы запускаете тесты NUnit от Jenkins? - PullRequest
103 голосов
/ 03 февраля 2012

Я хочу запускать автоматические тесты NUnit для приложения C # по ночам и при каждом коммите в svn.

Может ли это сделать Дженкинс-Си?
Есть ли онлайн-учебник или документ с инструкциями, в которых описаны подобные настройки, на которые я могу посмотреть?

Ответы [ 8 ]

113 голосов
/ 18 апреля 2012

Мне нужно было сделать именно то, что вы делаете, вот как я настроил Jenkins для этого:

  1. Добавьте плагин NUnit к Jenkins
  2. В вашем проекте перейдите на Настроить -> Build -> Добавить шаг сборки
  3. В раскрывающемся меню прокрутить вниз до -> Выполнить пакетную команду Windows
  4. Убедитесь, что этот шаг размещен после шага MSBuild
  5. Добавьте следующее, заменив переменные:

Тест одиночной DLL:

[PathToNUnit] \ bin \ nunit-console.exe [PathToTestDll] \ Selenium.Tests.dll /xml=nunit-result.xml

Несколько тестов DLL с использованием Тестовые проекты NUnit :

[PathToNUnit] \ bin \ nunit-console.exe [PathToTests] \ Selenium.Tests.nunit /xml=nunit-result.xml

  1. Под Действия после сборки , отметка Опубликовать отчет о результатах теста NUnit
  2. Для текстового поля Отчет о тестированииXML , введите nunit-result.xml

После того, как ваш проект будет создан, NUNit теперь будет запускаться, и результаты будут отображаться либо на панели инструментов (если вы наводите курсор мыши на значок отчета о погоде), либо в проекте.страница под Последний результат теста .

Вы также можете запустить команду из Visual Studio или как часть вашего локального процесса сборки.

Вот две записи блога, которые я использовал дляссылка.Я не нашел ни одного, который бы точно соответствовал моим требованиям: 1-часовое руководство по настройке непрерывной интеграции: Дженкинс встречается .Net (2011) Руководство по созданию проектов .NET с использованием Hudson (2008)

16 голосов
/ 24 мая 2014

Если вы не хотите жестко кодировать свои проекты модульных тестов, вам лучше написать сценарий, чтобы получить все ваши dll-файлы проектов модульных тестов.Мы делаем это с помощью Powershell и следуем определенному соглашению по именованию наших проектов модульного тестирования.Вот содержимое файла powershell, который запускает наши модульные тесты:

param(
[string] $sourceDirectory = $env:WORKSPACE
, $fileFilters = @("*.UnitTests.dll", "*_UnitTests.dll", "*UnitTests.dll")
, [string]$filterText = "*\bin\Debug*"
)

#script that executes all unit tests available.
$nUnitLog = Join-Path $sourceDirectory "UnitTestResults.txt"
$nUnitErrorLog = Join-Path $sourceDirectory "UnitTestErrors.txt"

Write-Host "Source: $sourceDirectory"
Write-Host "NUnit Results: $nUnitLog"
Write-Host "NUnit Error Log: $nUnitErrorLog"
Write-Host "File Filters: $fileFilters"
Write-Host "Filter Text: $filterText"

$cFiles = ""
$nUnitExecutable = "C:\Program Files (x86)\NUnit 2.6.3\bin\nunit-console-x86.exe"

# look through all subdirectories of the source folder and get any unit test assemblies. To avoid duplicates, only use the assemblies in the Debug folder
[array]$files = get-childitem $sourceDirectory -include $fileFilters -recurse | select -expand FullName | where {$_ -like $filterText}

foreach ($file in $files)
{
    $cFiles = $cFiles + $file + " "
}

# set all arguments and execute the unit console
$argumentList = @("$cFiles", "/framework:net-4.5", "/xml=UnitTestResults.xml")

$unitTestProcess = start-process -filepath $nUnitExecutable -argumentlist $argumentList -wait -nonewwindow -passthru -RedirectStandardOutput $nUnitLog -RedirectStandardError $nUnitErrorLog

if ($unitTestProcess.ExitCode -ne 0)
{
    "Unit Test Process Exit Code: " + $unitTestProcess.ExitCode
    "See $nUnitLog for more information or $nUnitErrorLog for any possible errors."
    "Errors from NUnit Log File ($nUnitLog):"
    Get-Content $nUnitLog | Write-Host
}

$exitCode = $unitTestProcess.ExitCode

exit $exitCode

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

Затем мы помещаем файл RunUnitTests.ps1 на наш сервер сборки и используем следующую пакетную команду:

powershell.exe -file "{full-path-to-script-direcory}\RunUnitTests.ps1"
13 голосов
/ 05 января 2017

Для фермы Nunit 3 или выше:

  1. Шаг сборки (командная строка Windows) "c:\Program Files (x86)\NUnit.org\nunit-console\nunit3-console.exe" c:\AutomationTraining\CSharpSelenium\bin\Debug\test.dll --result=TestR.xml;format=nunit2

  2. Шаг после публикации отчета Nunit, он показывает только файл результатов теста в каталоге рабочей области Jenkins, а не в вашем проекте: TestR.xml

Нам нужно сделать результаты теста в формате nunit2, потому что теперь плагин Jenkins Nunit не распознает формат результатов Nunit3. Также параметры строки формата отличаются: --result=TestR.xml;format=nunit2 НЕ /xml=nunit-result.xml

8 голосов
/ 03 февраля 2012

Это хорошо работает, я настроил это раньше.

Сконфигурируйте NUnit для вывода результатов в файл XML и сконфигурируйте NUnit Jenkins Plugin для использования этого XML-файла.Результаты будут доступны на панели инструментов.

Теперь, как вы вызываете NUnit, зависит от вас.Мы сделали это следующим образом: задание Jenkins выполняет задание NAnt, выполняет набор тестов NUnit.

Вы можете настроить задания Jenkins для запуска при фиксации и / или по расписанию в определенное время.

4 голосов
/ 14 января 2014

Решение от Ralph Willgoss работает хорошо, но я изменил 2 вещи, чтобы сделать его великолепным:

a) Я использовал проект NUnit вместо файла DLL напрямую.Это упрощает добавление дополнительных сборок или настройку теста в графическом интерфейсе NUnit.

b) Я добавил еще одну строку в пакет, чтобы предотвратить сбой сборки при сбое теста:

[PathToNUnit]\bin\nunit-console.exe [PathToTestProject]\UnitTests.nunit /xml=nunit-result.xm
exit 0

Упомянутый плагин NUnit помечает сборку UNSTABLE автоматически, а это именно то, что я хочу, когда тест не пройден.Это показано с желтой точкой.

2 голосов
/ 13 ноября 2013

Я думаю, что лучше провалить сборку, если она не прошла, чтобы вы ее не развернули. Сделайте что-то вроде этого:

C:\YourNUnitDir\nunit-console.exe C:\YourOutDir\YourLib.dll /noshadow
if defined ERRORLEVEL if %ERRORLEVEL% neq 0 goto fail_build

:: any other command

: fail_build
endlocal
exit %ERRORLEVEL%

Ссылка: http://www.greengingerwine.com/index.php/2013/01/tip-check-errorlevel-in-your-post-build-steps-when-using-nunit/

1 голос
/ 31 мая 2016

Это мое решение для запуска OpenCover с vstest в Jenkins:

param(
[string] $sourceDirectory = $env:WORKSPACE
, $includedFiles = @("*Test.dll")
, $excludedFiles = @("*.IGNORE.dll")
, [string]$filterFolder = "*\bin\Debug*"
)

# Executables
$openCoverExecutable = "C:\Users\tfsbuild\AppData\Local\Apps\OpenCover\OpenCover.Console.exe"
$unitExecutable = "F:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe"

# Logs
$openCoverReport = Join-Path $sourceDirectory "opencover.xml"
$openCoverFilter = "+[*]* -[*Test]*"

Write-Host "`r`n==== Configuration for executing tests ===="
Write-Host "Source: `"$sourceDirectory`""
Write-Host "Included files: `"$includedFiles`""
Write-Host "Excluded files: `"$excludedFiles`""
Write-Host "Folder filter: `"$filterFolder`""
Write-Host ""
Write-Host "OpenCover Report: `"$openCoverReport`""
Write-Host "OpenCover filter: `"$openCoverFilter`""

# look through all subdirectories of the source folder and get any unit test assemblies. To avoid duplicates, only use the assemblies in the Debug folder
[array]$files = get-childitem $sourceDirectory -include $includedFiles -exclude $excludedFiles -recurse | select -expand FullName | where {$_ -like $filterFolder} | Resolve-Path -Relative

$exitCode = 0
$failedTestDlls = ""

foreach ($file in $files)
{
    Write-Host "`r`nCurrent test dll: $file"

    # set all arguments and execute OpenCover
    $argumentList = @("-target:`"$unitExecutable`"", "-targetargs:`"$file /UseVsixExtensions:false /Logger:trx`"", "-register:user -filter:`"$openCoverFilter`" -mergeoutput -mergebyhash -skipautoprops -returntargetcode -output:`"$openCoverReport`"")

    $unitTestProcess = start-process -filepath $openCoverExecutable -argumentlist $argumentList -wait -nonewwindow -passthru -WorkingDirectory $sourceDirectory

    if ($unitTestProcess.ExitCode -ne 0)
    {
        $failedTestDlls = $failedTestDlls + $file + "`r`n"
        $exitCode = $unitTestProcess.ExitCode
    }
}

if ($exitCode -ne 0)
{
    Write-Host "`r`n==== Executing tests in following dlls failed ===="
    Write-Host "$failedTestDlls"
}

exit $exitCode

Каждый тестовый dll выполняется в собственном процессе, потому что у нас были проблемы свыполнить все тестовые библиотеки за один проход (пробмелы с загрузкой сборки).

1 голос
/ 03 февраля 2012

Дженкинс действительно имеет плагины, которые будут поддерживать это. Точная конфигурация будет сильно зависеть от настроек вашего проекта. Существуют специальные плагины для nUnit, MSBuild, nAnt и т. Д. Начните с просмотра страницы плагинов, но это не должно быть очень сложно выяснить.

...