2016-05-19 24 views
14

Getting started with xUnit.net (.NET Core/ASP.NET Core)頁面描述瞭如何使用dotnet test命令行運行測試。.NET Core 1.0 - 如何使用xUnit命令行運行「解決方案中的所有測試」

它指出,它需要特定project.json,在這裏我們添加的xUnit依賴性和測試運行:

"testRunner": "xunit", 
    "dependencies": { 
     "xunit": "2.1.0", 
     "dotnet-test-xunit": "1.0.0-rc2-build10015" 
    } 

,如果我嘗試從父目錄調用它:

C:\git\Project\test [master ≡]> dotnet test 
dotnet-test Error: 0 : System.InvalidOperationException: C:\git\Project\test\project.json does not exist. 
    at Microsoft.DotNet.Tools.Test.TestCommand.GetProjectPath(String projectPath) 
    at Microsoft.DotNet.Tools.Test.TestCommand.DoRun(String[] args) 
C:\git\Project\test [master ≡]> 

問題:是否有一種方法可以運行所有測試(多個project.json)與一個dotnet test

+0

我不認爲有任何。這個'dotnet'驅動程序需要更聰明。這是他們爲什麼會轉回到.NET Core構建系統的msbuild的論點之一。 – Thomas

回答

6

由於已經差不多一個月,也沒有答案,我至少會分享我一直在做的事情。

只需用所有project.json一個for循環(這不會是一次有關Visual Studio的「15」 RTM是因爲project.json is dead推出):

本地,從測試目錄,我就跑:

for /f %a in ('dir /b /s project.json ^| find /v "TestUtilities"') do dotnet test %a 

所有project.json運行它,除非該路徑有:TestUtilities

心靈上的TeamCity你需要逃脫%(在腳本中,你需要加倍:%%),所以它的推移:

for /f %%%a in ('dir /b /s project.json ^| find /v "TestUtilities"') do dotnet test %%%a 

注意%%%。由於TeamCity中的%用於變量,因此第三個%會將其轉義。

+0

做一些與@Bruno非常相似的事情,但增加更多的幫助。在我的項目的根目錄下'dotnet publish'之後,將其作爲我的CI作業中的powershell腳本運行,多個單元測試項目位於'/ test'中:$ dir = dir -dir test foreach($ d in $ dir){ \t dotnet test test \ $ d --no-build -xml ../TEST-$d.xml }' – steamrolla

1

對於跨平臺解決方案,您可以使用包含foreach-cli包的Node和NPM。如果你沒有在根文件夾中package.json做什麼,npm init,則:

npm install foreach-cli -D 

package.json

"scripts : { 
    ... 
    "test": "foreach -g 'test/**/project.json' -x 'cd #{dir} && dotnet test'" 
} 

運行測試:

npm test 
8

如果有人看起來對於Windows的答案,這裏是PowerShell中的oneliner,它可以完成這項工作:

dir test | % { dotnet test $_.FullName }

+0

這個人在VSTS和本地做過訣竅 老學校的腳本總是做這個工作! – Raffaeu

2

謝謝Andrzej Lichnerowicz初始指針。我一直在嘗試與AppVeyor集成,並且在此修復執行所有測試程序集時,如果任何測試失敗,構建將不再中斷。

考慮到一個新的水平,我創建一個PowerShell宏,到appveyor構建進口...

version: 1.0.{build} 
install: 
    - ps: Import-Module .\Appveyor.psm1 
before_build: 
- ps: dotnet restore 
build: 
    verbosity: minimal 
test_script: 
- ps: Invoke-AppVeyorTest 

...然後執行以下宏:

function Invoke-AppVeyorTest 
{ 
    [CmdletBinding()] 
    param() 

    $result = "true" 
    Get-ChildItem NetCoreXunit* -Recurse -Directory | % { 
     $test_path = $_.FullName 
     $output = & dotnet test $test_path 
     if ($output -Match ", Failed: 0, ") 
     { 
      Write-Output "All tests passed in $test_path" 
     } 
     else 
     { 
      Write-Output "Located failed tests in $test_path" 
      $result = "false" 
     }  
    } 
    if ($result -eq "false") 
    { 
     $host.ui.WriteErrorLine("Failed tests detected.") 
     exit 1 
    } 
} 

Appveyor會整理所有測試結果,如果任何測試失敗,則構建再次失敗。

1

它看起來並不像這將是不可能的通過命令行,因爲從CLI隊在最近的一個github issue regarding the project search algorithm最新反饋:

...雖然球隊決定在移動不同的方向。具體來說,我們決定讓所有的命令都需要一個到確定閉包的根僞像的路徑。

但是,如果你正在使用TFS建立確實存在着在dotnet構建步驟(目前「預覽」)的選項被稱爲「項目(S)」,它接受通配符,這樣你就可以使用下面的設置運行所有dotnet中的所有測試;然而

Command: 'test' Projects: '**/project.json'

當心,**/project.json將嘗試在所有項目中,以執行測試,即使他們沒有testrunner定義,這可能會導致生成失敗。

+0

這正是我想要實現的,仍然,測試結果看起來不對, – Raffaeu

+0

測試結果看起來很奇怪嗎?你能詳細解釋一下嗎? 我有這種方法在VSTS中工作,到目前爲止還沒有任何問題。 – Squiggle

相關問題