作为ASP.NET Core 2.0构建过程的一部分,我添加了一个dotnet测试命令,我将其添加为Windows批处理文件.
这是我的命令.
dotnet test "MyProject.csproj" --no-restore --results-directory "MyProject\TestResults" --verbosity minimal
Run Code Online (Sandbox Code Playgroud)
这是从命令行运行时的输出.
所以它似乎都正常工作,但没有创建测试结果/测试输出.
本文介绍如何设置 VS Code 设置以将调试目标指向单元测试项目的构建输出。因此,我将我的设置如下:
{
"explorer.confirmDragAndDrop": false,
"git.allowForcePush": true,
"git.autofetch": true,
"window.zoomLevel": 0,
"csharp.unitTestDebuggingOptions": {
"sourceFileMap": {
"C:\\git\\MsTester\\bin\\Debug\\netcoreapp2.1": "C:\\git\\MsTester\\bin\\Debug\\netcoreapp2.1"
}
},
"files.autoSave": "afterDelay",
"files.exclude": {
"**/bin": true,
"**/node_modules": true,
"**/obj": true
},
"csharpfixformat.style.spaces.insideEmptyBraces": false,
"csharpfixformat.style.braces.allowInlines": false,
"csharpfixformat.style.spaces.beforeParenthesis": false,
"csharpfixformat.style.spaces.afterParenthesis": false,
"csharp.format.enable": false,
"extensions.ignoreRecommendations": true
}
Run Code Online (Sandbox Code Playgroud)
但是,我不确定如何设置launch.json以启动dotnet test它以便它可以附加调试器。
这是我目前所拥有的:
{
"version": "0.2.0",
"configurations": [
{
"name": "MsTester",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/MsTester/bin/Debug/netcoreapp2.1/MsTester.dll",
"windows": {
"args": [
"--filter",
"TestCategory=lbshell",
"--logger",
"trx",
"--results-directory",
".\\TestResults",
"--settings", …Run Code Online (Sandbox Code Playgroud) 我们有一个项目依赖于自定义 NuGet feed(也托管在 VSTS 中)。
我正在尝试整合一个新阶段来生成代码覆盖率报告,如这篇博客文章中所示。我的新阶段如下所示:
并由以下步骤组成:
dotnet restore在“使用此 VSTS/TFS feed 中的包”下拉列表中选择我的自定义 feeddotnet test使用相关参数来收集代码覆盖率问题是dotnet test坚持尝试恢复包本身。由于我找不到方法告诉它使用自定义源,因此在尝试恢复这些包时失败:
D:\a\1\s\MyProject\MyProject.csproj : error NU1101: Unable to find package My.Package. No packages exist with this id in source(s): Microsoft Visual Studio Offline Packages, nuget.org
我的主要构建过程运行良好,并且能够从自定义源恢复包。区别在于使用 Visual Studio(即非dotnet)版本的命令:
处理这个问题的正确方法是什么?
我是否需要找到某种方式来讲述dotnet test我的自定义 Feed?
或者(假设我restore之前正在运行)我是否需要说服它完全跳过恢复?
continuous-integration azure-devops dotnet-cli dotnet-restore dotnet-test
我有一个 .Net 解决方案,其中包含两个 dotnet 核心类库及其相关的单元测试项目。
当我运行dotnet test **\*.Tests.csproj --collect "Code Coverage"命令时,它会为每个单元测试项目生成单独的 .coveragexml 文件。
我的要求是将所有 .coveragexml 文件合并到一个文件中,并使用它来获得整个解决方案的总覆盖矩阵。
是否有任何工具或脚本可以实现这一目标?
笔记:
我正在编写一个脚本来在存储库中构建和测试项目。现在,我使用 PowerShell 命令Get-ChildItem -Path test -Filter *.csproj -Recurse | ForEach-Object { dotnet test $_.FullName -c $Configuration }获取我的测试文件夹中的所有 .csproj 文件并在其中运行测试。但是,例如,当我运行时,我注意到dotnet test test/ProjectA/ProjectA.csproj我收到以下消息:
共有 1 个测试文件与指定的模式匹配。
看到这一点,我认为可以使用一种模式通过一个命令在多个项目中运行测试,但我找不到它的文档或让它工作。当我尝试时,dotnet test test/**/*.csproj我得到:
MSBUILD:错误 MSB1009:项目文件不存在。
我有一个 .Net Core 应用程序,其中有一个 .Net Standard 2.1 项目。我正在使用 Coverlet 来获取 Cobertura 格式的代码覆盖率。
我在所有测试项目中使用“coverlet.msbuild”nuget 包。
我想在程序集级别添加 [ExcludeFromCodeCoverage] 属性,以便 Coverlet 在执行分析时忽略此项目。
我在 .Net Core / .Net Standard 项目中找不到 AssemblyInfo.cs 文件。
我尝试在 proejct 的 .csproj 文件中添加以下标签
<ItemGroup>
<AssemblyAttribute Include="System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
但仍然没有运气。
对我来说唯一的解决方法是在所有类文件中手动添加 [ExcludeFromCodeCoverage] 属性,这不是最好的方法。
假设我有一个测试:
[Theory]
[InlineData("one")]
[InlineData("two")]
public void ShouldSelectSingleTheoryFromDotnetTest(string s)
{
Assert.True(true);
}
Run Code Online (Sandbox Code Playgroud)
我想仅使用 Theory data = "one" 从命令行执行测试dotnet test...。这可能吗?
我知道我们可以使用特征选择测试,但我不知道如何将单个特征与理论数据的每一行关联起来。
作为一种解决方法,我想也许我可以使用动态跳过测试的技术,但仍然要做到这一点,我需要从命令行读取参数,并且也不知道如何做到这一点。一种解决方法可能是在命令行上设置环境变量,然后使用动态跳过模式运行测试,其中动态跳过逻辑将读取命令行参数。但这非常笨拙。
首先,一些背景信息:我有一个 Visual Studio 解决方案,其中包含几个生产类库和九个单元测试项目。所有项目都针对 .NET 5。我正在运行 .NET 5.0.401。所有单元测试项目都引用了coverlet.collector. 我不使用旧的coverlet.msbuild软件包。根据我的阅读,使用XPlat Code Coverage现在是 .NET Core 的惯用法。
我有一个用于 CI 构建的 Azure Pipelines 管道。作为此管道的一部分,我想运行所有单元测试,生成单元测试结果以上传到管道,并生成代码覆盖率结果以上传到管道。我已经阅读了几篇博客文章和文档,这些文章和文档似乎使这一切变得简单;然而,我发现事实并非如此。
让我们从在本地工作站上运行一些命令开始简单。出于本练习的目的,我们假设我已经使用以下命令成功构建了解决方案:
dotnet build Solution.sln --configuration Debug
Run Code Online (Sandbox Code Playgroud)
如果我运行这样的测试:
dotnet test Solution.sln --configuration Debug --no-build --no-restore --collect:"XPlat Code Coverage" --results-directory artifacts/test-results
Run Code Online (Sandbox Code Playgroud)
然后我看到代码覆盖率结果存储在以 GUID 命名的子目录中。我不知道微软为什么决定这样做,但这不是我所能控制的。
(运行此命令并截图后,我删除了该test-results目录。)
请记住,我还想生成单元测试结果。为此,我将--logger trx参数添加到同一命令行中。这次,创建了许多其他文件夹,其中包含看似重复的代码覆盖率结果。此外,我还得到了.trx我正在寻找的文件。
您会注意到,除了.trx我想要的九个文件之外,还有另外九个代码覆盖率报告。
我的自托管 Pipelines 构建代理上会生成类似的重复文件。在管道中,如果我尝试执行以下任务:
dotnet build Solution.sln --configuration Debug
Run Code Online (Sandbox Code Playgroud)
我收到错误:
##[warning]Multiple file or directory matches were found. Using the …Run Code Online (Sandbox Code Playgroud) 最近,在没有对测试解决方案进行任何直接更改的情况下,在我的 azure 管道上执行 VSTEST@2 任务期间开始出现此错误。
##[warning]DiscoveryMessage : Failed to load extensions from file 'D:\a\1\s\src\...\NUnit3.TestAdapter.dll'. Please use /diag for more information.
Run Code Online (Sandbox Code Playgroud)
它不会破坏测试发现或执行阶段,但它会破坏我的警告对话框,并可能使我忽略一些更重要的警告。到目前为止,你们中有人遇到过类似的问题吗?一段时间以来尝试寻找此类错误,但找不到任何解决方案。
我还认为,也许我的 vstest 任务尝试从 TestAdapter 发现测试,但定义中排除子句不应该是这种情况
- task: VSTest@2
inputs:
testSelector: 'testAssemblies'
testAssemblyVer2: |
**\*.Tests.dll
!**\*TestAdapter.dll
!**\NUnit3.TestAdapter.dll
!**\obj\**
searchFolder: '$(System.DefaultWorkingDirectory)'
distributionBatchType: basedOnExecutionTime
codeCoverageEnabled: true
Run Code Online (Sandbox Code Playgroud) dotnet-test ×10
.net-core ×4
.net ×3
dotnet-cli ×2
asp.net-core ×1
azure-devops ×1
coverlet ×1
nunit ×1
testing ×1
tfs ×1
tfs-2015 ×1
tfsbuild ×1
traits ×1
unit-testing ×1
vstest ×1
xunit ×1