JUnitsからNUnitテストをどのように実行しますか?


108

私はC#アプリケーションの自動化されたNUnitテストを毎晩、svnへのコミットごとに実行したいと考えています。

これはJenkins-CIができることですか?
私が見ることができる同様の設定を文書化したオンラインチュートリアルまたはハウツー文書はありますか?


他に探しているものはありますか?
jglouie

1
同様の設定のチュートリアルまたはハウツードキュメントを探しています。
blueberryfields

1
コマンドラインから希望どおりにNUnitでテストを実行していますか?そうでなければ、それがステップ1です
jglouie

回答:


120

私はあなたがしていることを正確に行う必要がありました、これは私がこれを行うためにJenkinsを設定する方法です:

  1. NUnitプラグインをJenkinsに追加する
  2. プロジェクトで、構成 -> ビルド -> ビルドステップの追加に移動します
  3. ドロップダウンで下にスクロールして-> Windowsバッチコマンドを実行します
  4. このステップがMSBuildステップの後に配置されていることを確認してください
  5. 以下を追加して、変数を置き換えます。

単一DLLテスト:

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

NUnitテストプロジェクトを使用した複数のDLLテスト:

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

  1. [ ビルド後のアクション]で、[ NUnitテスト結果レポートを公開]をオンにします
  2. テキストボックステストレポートXMLの場合は、nunit-result.xmlと入力します。

プロジェクトがビルドされると、NUNitが実行され、ダッシュボード(ウェザーレポートアイコンにカーソルを合わせた場合)またはプロジェクトページの[ 最後のテスト結果]に結果が表示されます。

Visual Studio内から、またはローカルビルドプロセスの一部としてコマンドを実行することもできます。

参考のために使用した2つのブログ投稿を次に示します。私の要件に正確に一致するものは見つかりませんでした:
継続的インテグレーションセットアップの1時間ガイド:Jenkinsは.Net(2011)を満たしてい
ますHudson(2008)を使用した.NETプロジェクトの構築ガイド


これで十分かどうかはわかりません。1つ(またはいくつか)のテストdllだけが通常ですか?私たちにはそれらがたくさんあり、それらは頻繁に作成および削除されます。テストをjenkinsにハードコーディングすることなくこれを行う方法はありませんか?
アンドレ・C.アンデルセン

ビルドステップで、ソース管理下の.batまたは.cmdファイルを使用するように指定します。これにより、NUnitコマンドが開始されます。これで、Jenkinsを変更せずに、必要な頻度で実行されるテストを変更できます。NUnitテストプロジェクトも参考にしてください。重要なのは、テストレポートに使用するxmlファイルをJenkinsに指示することです。
ラルフウィルゴス

4
DLLファイルではなく、*。nunitファイルをパラメーターとして使用するだけ"C:\Program Files (x86)\NUnit 2.6.3\bin\nunit-console-x86.exe" UnitTests/UnitTests.nunitです。私には完璧に働きました。
JCH2k 2014年

3
DLLの代わりに* .slnファイルを使用できます。ドキュメントを
Martin

2
ああ。私の論理的な誤りは、NUnitプラグインが新しい「Build-Task」タイプを作成したことでした。その魔法のブードゥー教は、ビルド後のイベントです。(そして、通常のコマンドラインを使用して.xmlを生成します)
granadaCoder '

16

単体テストプロジェクトをハードコード化したくない場合は、単体テストプロジェクトの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"

うまくいきましたが、2つの問題がありました。最初はソースディレクトリでした。ソースディレクトリをに変更する必要[string] $sourceDirectory = $(get-location)あり、スペースが含まれるパスの場合は、アセンブリパスをnUnitに変更する必要がありました$cFiles = $cFiles + '"' + $file + '"' + " "
Choco Smith

テストがある場合は、テストプレイリストで実行します。.dllを使用して、Jenkinsのこのテストプレイリストを実行できますか?
Ishita Shah

15

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

Jenkins NunitプラグインがNunit3結果形式を認識しないため、テスト結果をnunit2形式で作成する必要があります。オプション文字列の形式も異なります: --result=TestR.xml;format=nunit2 NOT /xml=nunit-result.xml


8

これはうまく機能します。以前に設定しました。

結果をXMLファイルに出力するようにNUnitを構成し、このXMLファイルを使用するようにNUnit Jenkinsプラグインを構成します。結果はダッシュボードに表示されます。

ここで、NUnitをどのように呼び出すかはあなた次第です。JenkinsジョブはNAntターゲットを実行し、NUnitテストスイートを実行しました。

Jenkinsジョブを設定して、コミット時に実行したり、特定の時間にスケジュールしたりできます。


これはほとんど私の目的でしたが、NUnitプラグインをパイプライン/ワークフローから機能させることができませんでした。代わりに、正常に機能するXUnitプラグインを使用しました。
demoncodemonkey

4

Ralph Willgossの解決策はうまく機能していますが、2つの点を変更して素晴らしいものにしました。

a)DLLファイルの代わりにNUnitプロジェクトを直接使用しました。これにより、より簡単にアセンブリを追加したり、NUnit GUIでテストを構成したりできます。

b)テストが失敗したときにビルドが失敗しないように、バッチに1行追加しました。

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

言及されたNUnitプラグインは、テストが失敗するたびに、ビルドが安定しないことを自動的にマークします。黄色の点で表示されます。


3
ユニットテストが失敗した場合、なぜビルドが失敗したくないのですか?失敗したテストは、デプロイを続行したくないことを示しているのではないですか?
Kirk Woll 2014年

1
私はジェンキンスを使用してナイトリーを構築し、コンパイルしても他のすべてをテストできるようにして失敗しないようにしています。「不安定」ステータスは、すべてが想定どおりに実行されているわけではないというヒントを私に与えます。不安定。リリースビルドが不安定な場合は、展開しません。
JCH2k 2014年

2

ビルドをパスしないときに失敗するので、デプロイしない方が良いと思います。このようなことをしてください:

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/


これは最初の行だけでできること以上のことをしますか?私はそうは思いません。nunit-console.exeが!= 0を返した場合、テストが失敗した場合にビルドが失敗します。
JCH2k 2014年

Jenkinsジョブでnunit-console.exeを呼び出した後、いくつかのコマンドがあることを忘れていました。Jenkinsは最後のコマンドERRORLEVELのみを考慮しているため、機能しませんでした。
山本明

これは公開ステップの利点を妨げますか?失敗したテスト構成で、プラグインに「」として単純なマークビルドがあったらいいのに
トミーホルマン

1

Jenkinsには、それをサポートするプラグインがあります。正確な構成は、プロジェクトの設定にかなり依存します。nUnit、MSBuild、nAntなどの特定のプラグインがあります。プラグインページを確認することから始めますが、理解するのはそれほど難しくありません。


1

これは、Jenkinsでvstest使用してOpenCoverを実行するための私のソリューションです。

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を単一の隙間(アセンブリの読み込みを伴う問題)で実行するのに問題があったため、各テストdllは独自のプロセスで実行されます。


0

.Net Coreの場合、次のスクリプトを使用して「実行シェル」ビルドステップを追加するだけで十分です。

#!bash -x

cd $my_project_dir
rm -rf TestResults   # Remove old test results.
dotnet test -l trx

その後、「MSTestテスト結果レポートの発行」ポストビルドアクションを追加して、テスト結果を表示します。

デフォルトのテストレポートパスは**/*.trx、生成されたすべての.trxファイルである必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.