Incremental Test Runner for dotnet.Tests
Prerequisites
- A full build must have been completed at least once (via
build.cmdorbuild.sh) so that the redist SDK layout exists atartifacts\bin\redist\Debug\dotnet\sdk\<version>\. - The repo-local
.dotnetSDK must match the version expected by the test projects. If the runtime or SDK version is out of date (e.g., test build fails with a missing framework error), run.\restore.cmd(or./restore.shon macOS/Linux) to download the correct SDK into.dotnet. - This workflow uses Windows/PowerShell commands and paths. On macOS/Linux, substitute forward slashes and use
cpinstead ofCopy-Item.
Workflow
Step 1: Identify modified projects
Determine which projects have been modified. Use context from:
- The files you just edited in this session.
- Or
git status/git diffto find changed.csfiles and map them to their.csprojprojects.
Step 2: Build modified projects
Build each modified project individually using the repo-local dotnet:
.\.dotnet\dotnet build <path-to-project.csproj> -c Debug
For example:
.\.dotnet\dotnet build src\Cli\Microsoft.DotNet.Cli.Utils\Microsoft.DotNet.Cli.Utils.csproj -c Debug
If the dotnet CLI project itself was modified, build it:
.\.dotnet\dotnet build src\Cli\dotnet\dotnet.csproj -c Debug
Step 3: Copy output DLLs to the redist SDK layout
Discover the SDK version directory name:
$sdkVersion = (Get-ChildItem artifacts\bin\redist\Debug\dotnet\sdk -Directory | Sort-Object LastWriteTime -Descending | Select-Object -First 1).Name
For each modified project, copy its output DLL (and any satellite assemblies) from the project's build output to the redist SDK directory:
Source: artifacts\bin\<ProjectName>\Debug\net10.0\<AssemblyName>.dll
Target: artifacts\bin\redist\Debug\dotnet\sdk\<version>\
For example:
Copy-Item artifacts\bin\Microsoft.DotNet.ProjectTools\Debug\net10.0\Microsoft.DotNet.ProjectTools.dll artifacts\bin\redist\Debug\dotnet\sdk\$sdkVersion\
Copy-Item artifacts\bin\Microsoft.DotNet.Cli.Utils\Debug\net10.0\Microsoft.DotNet.Cli.Utils.dll artifacts\bin\redist\Debug\dotnet\sdk\$sdkVersion\
The dotnet project is special — it builds into artifacts\bin\dotnet\Debug\net10.0\ and its dotnet.dll must be copied to the SDK directory:
Copy-Item artifacts\bin\dotnet\Debug\net10.0\dotnet.dll artifacts\bin\redist\Debug\dotnet\sdk\$sdkVersion\
Important notes:
- For typical incremental edits, only copy DLLs that are already present in the target directory. If your change introduces a new shipped assembly or moves assemblies, you will need a full
build.cmd/build.shto update the layout correctly. - Some projects multi-target (e.g.,
net10.0andnet472). Always use thenet10.0output. - If localization resource DLLs were changed (in subdirectories like
cs\,de\, etc.), copy those too.
Step 4: Run the tests
Invoke the run-tests skill for test/dotnet.Tests/dotnet.Tests.csproj with a filter for
the affected tests. It builds the test project incrementally and retains detailed output,
a TRX, and a binlog.
Common project paths
| Assembly | Project Path |
|---|---|
dotnet.dll |
src\Cli\dotnet\dotnet.csproj |
Microsoft.DotNet.Cli.Utils.dll |
src\Cli\Microsoft.DotNet.Cli.Utils\Microsoft.DotNet.Cli.Utils.csproj |
Microsoft.DotNet.Cli.Definitions.dll |
src\Cli\Microsoft.DotNet.Cli.Definitions\Microsoft.DotNet.Cli.Definitions.csproj |
Microsoft.DotNet.Cli.CoreUtils.dll |
src\Cli\Microsoft.DotNet.Cli.CoreUtils\Microsoft.DotNet.Cli.CoreUtils.csproj |
Microsoft.DotNet.Configurer.dll |
src\Cli\Microsoft.DotNet.Configurer\Microsoft.DotNet.Configurer.csproj |
Microsoft.DotNet.ProjectTools.dll |
src\Microsoft.DotNet.ProjectTools\Microsoft.DotNet.ProjectTools.csproj |
Microsoft.DotNet.NativeWrapper.dll |
src\Resolvers\Microsoft.DotNet.NativeWrapper\Microsoft.DotNet.NativeWrapper.csproj |
Microsoft.DotNet.TemplateLocator.dll |
src\Microsoft.DotNet.TemplateLocator\Microsoft.DotNet.TemplateLocator.csproj |
Microsoft.DotNet.InternalAbstractions.dll |
src\Cli\Microsoft.DotNet.InternalAbstractions\Microsoft.DotNet.InternalAbstractions.csproj |
dotnet.Tests.dll |
test\dotnet.Tests\dotnet.Tests.csproj |