2016-05-19 27 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

相关问题