Split TestMethodRunner.cs into focused partial-class files - #9729

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/split-testmethodrunner
Jul 8, 2026
Merged

Split TestMethodRunner.cs into focused partial-class files#9729
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/split-testmethodrunner

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Overview

Fixes#9711.

TestMethodRunner.cs had grown to 591 lines and was the only class in src/Adapter/MSTestAdapter.PlatformServices/Execution/ not following the ClassName.Responsibility.cs partial-class split pattern used by its neighbors (TestMethodInfo, TestExecutionManager, TypeCache, TestClassInfo, UnitTestRunner).

Changes

Split into four focused partial-class files:

FileLinesResponsibility
TestMethodRunner.cs266Fields, constructor, ExecuteAsync, RunTestMethodAsync, IsDataDrivenTest, GetAggregateOutcome — entry points & routing
TestMethodRunner.DataSource.cs177DataSourceAttribute-based data-driven tests
TestMethodRunner.DataRow.cs107Folded / DynamicData-style (ITestDataSource) data-driven tests
TestMethodRunner.Execution.cs89Core single-test execution (ExecuteTestAsync, UpdateResultsWithParentInfo)

This is a pure structural refactor — no logic changes. Method bodies were moved verbatim; the class is marked partial; usings were trimmed per-file.

GetAggregateOutcome was kept in the entry-point file since it's used by the routing logic in RunTestMethodAsync.

Acceptance criteria

  • Split into 4 partial-class files following the ClassName.Responsibility.cs convention
  • Each new file is under 300 lines
  • Build succeeds (0 warnings, 0 errors across all target frameworks)
  • All 898 MSTestAdapter.PlatformServices.UnitTests pass
  • No behavioral changes — pure structural refactor

Splits the 591-line TestMethodRunner.cs into four partial-class files
following the ClassName.Responsibility.cs convention already used by
neighboring classes in the Execution/ folder:
- TestMethodRunner.cs: entry points and routing (ExecuteAsync,
RunTestMethodAsync, IsDataDrivenTest, GetAggregateOutcome)
- TestMethodRunner.DataSource.cs: DataSourceAttribute-based tests
- TestMethodRunner.DataRow.cs: folded / DynamicData-style tests
- TestMethodRunner.Execution.cs: core single-test execution
Pure structural refactor with no behavioral changes.
Fixes#9711
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 8, 2026 11:07

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors TestMethodRunner in MSTestAdapter.PlatformServices to match the existing ClassName.Responsibility.cs partial-class organization used by other classes in Execution/, improving navigability without changing behavior.

Changes:

  • Converted TestMethodRunner to a partial type and retained entry-point/routing logic in TestMethodRunner.cs.
  • Extracted data-driven execution paths into dedicated partial files (.DataSource.cs and .DataRow.cs).
  • Moved core single-test execution helpers into TestMethodRunner.Execution.cs.
Show a summary per file
FileDescription
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.csMarks the type partial and keeps the primary entry points/routing plus aggregate outcome logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.DataSource.csContains DataSourceAttribute-based data-driven execution logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.DataRow.csContains folded / ITestDataSource (DynamicData-style) execution logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.Execution.csContains core single-test execution (ExecuteTestAsync) and result parent/execution id updates.

Review details

  • Files reviewed: 4/4 changed files
  • Comments generated: 0
  • Review effort level: Low

@Evangelink
Amaury Levé (Evangelink) enabled auto-merge (squash) July 8, 2026 11:14
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jul 8, 2026

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review Summary

Clean structural refactor — no issues found. All 22 review dimensions assessed.

Verification

CheckResult
All original methods accounted for✅ 11/11 methods preserved with identical signatures
File naming convention✅ Follows established ClassName.Responsibility.cs pattern (matches TestMethodInfo, TestExecutionManager, TypeCache, etc.)
using directives per file✅ Properly trimmed — each partial imports only what it needs
Removed using from main fileMicrosoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices correctly removed — no longer directly referenced
partial keyword✅ Applied to class declaration in all 4 files
CI build (Linux Release)✅ Passed

Dimension Assessment

#DimensionVerdict
1Algorithmic CorrectnessN/A — no logic changes
2Threading & ConcurrencyN/A — ConfigureAwait(false) patterns preserved verbatim
3Security & IPCN/A
4Public APIN/A — class is internal sealed
5PerformanceN/A — zero runtime impact
6Cross-TFMN/A — no TFM-specific changes
7Resource & IDisposableN/A — dispose patterns preserved
8Defensive CodingN/A
9LocalizationN/A
10Test IsolationN/A — no test files
11Assertion QualityN/A
12FlakinessN/A
13Test CompletenessN/A
14Data-Driven CoverageN/A
15Code StructureLGTM — this PR improves structure
16NamingLGTM — consistent with neighbors
17DocumentationLGTM — XML doc summaries on each partial describe responsibility
18Analyzer QualityN/A
19IPC WireN/A
20Build InfrastructureN/A
21Scope & PR DisciplineLGTM — single concern, well-scoped
22PowerShellN/A

No blocking or major issues. Well-executed refactor that brings TestMethodRunner in line with the established partial-class conventions in its directory.

@Evangelink
Amaury Levé (Evangelink) merged commit 0b9248a into mainJul 8, 2026
35 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/split-testmethodrunner branch July 8, 2026 12:43
github-actionsBot added a commit that referenced this pull request Jul 8, 2026
Apply two project-convention improvements to files added in recent PRs:
- MSTestTestNodeConverter.cs (added in #9706): replace Substring calls
with range operators per csharp_style_prefer_range_operator = true
- TestMethodRunner.DataSource.cs (added in #9729): replace == null with
is null per the project's 'always use is null / is not null' rule
No behavioral change; builds verified to succeed with 0 errors.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[file-diet] Split TestMethodRunner.cs into focused partial-class files

3 participants

@Evangelink@0101
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Split TestMethodRunner.cs into focused partial-class files - #9729

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/split-testmethodrunner
Jul 8, 2026
Merged

Split TestMethodRunner.cs into focused partial-class files#9729
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/split-testmethodrunner

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Overview

Fixes#9711.

TestMethodRunner.cs had grown to 591 lines and was the only class in src/Adapter/MSTestAdapter.PlatformServices/Execution/ not following the ClassName.Responsibility.cs partial-class split pattern used by its neighbors (TestMethodInfo, TestExecutionManager, TypeCache, TestClassInfo, UnitTestRunner).

Changes

Split into four focused partial-class files:

FileLinesResponsibility
TestMethodRunner.cs266Fields, constructor, ExecuteAsync, RunTestMethodAsync, IsDataDrivenTest, GetAggregateOutcome — entry points & routing
TestMethodRunner.DataSource.cs177DataSourceAttribute-based data-driven tests
TestMethodRunner.DataRow.cs107Folded / DynamicData-style (ITestDataSource) data-driven tests
TestMethodRunner.Execution.cs89Core single-test execution (ExecuteTestAsync, UpdateResultsWithParentInfo)

This is a pure structural refactor — no logic changes. Method bodies were moved verbatim; the class is marked partial; usings were trimmed per-file.

GetAggregateOutcome was kept in the entry-point file since it's used by the routing logic in RunTestMethodAsync.

Acceptance criteria

  • Split into 4 partial-class files following the ClassName.Responsibility.cs convention
  • Each new file is under 300 lines
  • Build succeeds (0 warnings, 0 errors across all target frameworks)
  • All 898 MSTestAdapter.PlatformServices.UnitTests pass
  • No behavioral changes — pure structural refactor

Splits the 591-line TestMethodRunner.cs into four partial-class files
following the ClassName.Responsibility.cs convention already used by
neighboring classes in the Execution/ folder:
- TestMethodRunner.cs: entry points and routing (ExecuteAsync,
RunTestMethodAsync, IsDataDrivenTest, GetAggregateOutcome)
- TestMethodRunner.DataSource.cs: DataSourceAttribute-based tests
- TestMethodRunner.DataRow.cs: folded / DynamicData-style tests
- TestMethodRunner.Execution.cs: core single-test execution
Pure structural refactor with no behavioral changes.
Fixes#9711
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 8, 2026 11:07

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors TestMethodRunner in MSTestAdapter.PlatformServices to match the existing ClassName.Responsibility.cs partial-class organization used by other classes in Execution/, improving navigability without changing behavior.

Changes:

  • Converted TestMethodRunner to a partial type and retained entry-point/routing logic in TestMethodRunner.cs.
  • Extracted data-driven execution paths into dedicated partial files (.DataSource.cs and .DataRow.cs).
  • Moved core single-test execution helpers into TestMethodRunner.Execution.cs.
Show a summary per file
FileDescription
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.csMarks the type partial and keeps the primary entry points/routing plus aggregate outcome logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.DataSource.csContains DataSourceAttribute-based data-driven execution logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.DataRow.csContains folded / ITestDataSource (DynamicData-style) execution logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.Execution.csContains core single-test execution (ExecuteTestAsync) and result parent/execution id updates.

Review details

  • Files reviewed: 4/4 changed files
  • Comments generated: 0
  • Review effort level: Low

@Evangelink
Amaury Levé (Evangelink) enabled auto-merge (squash) July 8, 2026 11:14
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jul 8, 2026

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review Summary

Clean structural refactor — no issues found. All 22 review dimensions assessed.

Verification

CheckResult
All original methods accounted for✅ 11/11 methods preserved with identical signatures
File naming convention✅ Follows established ClassName.Responsibility.cs pattern (matches TestMethodInfo, TestExecutionManager, TypeCache, etc.)
using directives per file✅ Properly trimmed — each partial imports only what it needs
Removed using from main fileMicrosoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices correctly removed — no longer directly referenced
partial keyword✅ Applied to class declaration in all 4 files
CI build (Linux Release)✅ Passed

Dimension Assessment

#DimensionVerdict
1Algorithmic CorrectnessN/A — no logic changes
2Threading & ConcurrencyN/A — ConfigureAwait(false) patterns preserved verbatim
3Security & IPCN/A
4Public APIN/A — class is internal sealed
5PerformanceN/A — zero runtime impact
6Cross-TFMN/A — no TFM-specific changes
7Resource & IDisposableN/A — dispose patterns preserved
8Defensive CodingN/A
9LocalizationN/A
10Test IsolationN/A — no test files
11Assertion QualityN/A
12FlakinessN/A
13Test CompletenessN/A
14Data-Driven CoverageN/A
15Code StructureLGTM — this PR improves structure
16NamingLGTM — consistent with neighbors
17DocumentationLGTM — XML doc summaries on each partial describe responsibility
18Analyzer QualityN/A
19IPC WireN/A
20Build InfrastructureN/A
21Scope & PR DisciplineLGTM — single concern, well-scoped
22PowerShellN/A

No blocking or major issues. Well-executed refactor that brings TestMethodRunner in line with the established partial-class conventions in its directory.

@Evangelink
Amaury Levé (Evangelink) merged commit 0b9248a into mainJul 8, 2026
35 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/split-testmethodrunner branch July 8, 2026 12:43
github-actionsBot added a commit that referenced this pull request Jul 8, 2026
Apply two project-convention improvements to files added in recent PRs:
- MSTestTestNodeConverter.cs (added in #9706): replace Substring calls
with range operators per csharp_style_prefer_range_operator = true
- TestMethodRunner.DataSource.cs (added in #9729): replace == null with
is null per the project's 'always use is null / is not null' rule
No behavioral change; builds verified to succeed with 0 errors.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[file-diet] Split TestMethodRunner.cs into focused partial-class files

3 participants

@Evangelink@0101
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Split TestMethodRunner.cs into focused partial-class files - #9729

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/split-testmethodrunner
Jul 8, 2026
Merged

Split TestMethodRunner.cs into focused partial-class files#9729
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/split-testmethodrunner

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Overview

Fixes#9711.

TestMethodRunner.cs had grown to 591 lines and was the only class in src/Adapter/MSTestAdapter.PlatformServices/Execution/ not following the ClassName.Responsibility.cs partial-class split pattern used by its neighbors (TestMethodInfo, TestExecutionManager, TypeCache, TestClassInfo, UnitTestRunner).

Changes

Split into four focused partial-class files:

FileLinesResponsibility
TestMethodRunner.cs266Fields, constructor, ExecuteAsync, RunTestMethodAsync, IsDataDrivenTest, GetAggregateOutcome — entry points & routing
TestMethodRunner.DataSource.cs177DataSourceAttribute-based data-driven tests
TestMethodRunner.DataRow.cs107Folded / DynamicData-style (ITestDataSource) data-driven tests
TestMethodRunner.Execution.cs89Core single-test execution (ExecuteTestAsync, UpdateResultsWithParentInfo)

This is a pure structural refactor — no logic changes. Method bodies were moved verbatim; the class is marked partial; usings were trimmed per-file.

GetAggregateOutcome was kept in the entry-point file since it's used by the routing logic in RunTestMethodAsync.

Acceptance criteria

  • Split into 4 partial-class files following the ClassName.Responsibility.cs convention
  • Each new file is under 300 lines
  • Build succeeds (0 warnings, 0 errors across all target frameworks)
  • All 898 MSTestAdapter.PlatformServices.UnitTests pass
  • No behavioral changes — pure structural refactor

Splits the 591-line TestMethodRunner.cs into four partial-class files
following the ClassName.Responsibility.cs convention already used by
neighboring classes in the Execution/ folder:
- TestMethodRunner.cs: entry points and routing (ExecuteAsync,
RunTestMethodAsync, IsDataDrivenTest, GetAggregateOutcome)
- TestMethodRunner.DataSource.cs: DataSourceAttribute-based tests
- TestMethodRunner.DataRow.cs: folded / DynamicData-style tests
- TestMethodRunner.Execution.cs: core single-test execution
Pure structural refactor with no behavioral changes.
Fixes#9711
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 8, 2026 11:07

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors TestMethodRunner in MSTestAdapter.PlatformServices to match the existing ClassName.Responsibility.cs partial-class organization used by other classes in Execution/, improving navigability without changing behavior.

Changes:

  • Converted TestMethodRunner to a partial type and retained entry-point/routing logic in TestMethodRunner.cs.
  • Extracted data-driven execution paths into dedicated partial files (.DataSource.cs and .DataRow.cs).
  • Moved core single-test execution helpers into TestMethodRunner.Execution.cs.
Show a summary per file
FileDescription
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.csMarks the type partial and keeps the primary entry points/routing plus aggregate outcome logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.DataSource.csContains DataSourceAttribute-based data-driven execution logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.DataRow.csContains folded / ITestDataSource (DynamicData-style) execution logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.Execution.csContains core single-test execution (ExecuteTestAsync) and result parent/execution id updates.

Review details

  • Files reviewed: 4/4 changed files
  • Comments generated: 0
  • Review effort level: Low

@Evangelink
Amaury Levé (Evangelink) enabled auto-merge (squash) July 8, 2026 11:14
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jul 8, 2026

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review Summary

Clean structural refactor — no issues found. All 22 review dimensions assessed.

Verification

CheckResult
All original methods accounted for✅ 11/11 methods preserved with identical signatures
File naming convention✅ Follows established ClassName.Responsibility.cs pattern (matches TestMethodInfo, TestExecutionManager, TypeCache, etc.)
using directives per file✅ Properly trimmed — each partial imports only what it needs
Removed using from main fileMicrosoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices correctly removed — no longer directly referenced
partial keyword✅ Applied to class declaration in all 4 files
CI build (Linux Release)✅ Passed

Dimension Assessment

#DimensionVerdict
1Algorithmic CorrectnessN/A — no logic changes
2Threading & ConcurrencyN/A — ConfigureAwait(false) patterns preserved verbatim
3Security & IPCN/A
4Public APIN/A — class is internal sealed
5PerformanceN/A — zero runtime impact
6Cross-TFMN/A — no TFM-specific changes
7Resource & IDisposableN/A — dispose patterns preserved
8Defensive CodingN/A
9LocalizationN/A
10Test IsolationN/A — no test files
11Assertion QualityN/A
12FlakinessN/A
13Test CompletenessN/A
14Data-Driven CoverageN/A
15Code StructureLGTM — this PR improves structure
16NamingLGTM — consistent with neighbors
17DocumentationLGTM — XML doc summaries on each partial describe responsibility
18Analyzer QualityN/A
19IPC WireN/A
20Build InfrastructureN/A
21Scope & PR DisciplineLGTM — single concern, well-scoped
22PowerShellN/A

No blocking or major issues. Well-executed refactor that brings TestMethodRunner in line with the established partial-class conventions in its directory.

@Evangelink
Amaury Levé (Evangelink) merged commit 0b9248a into mainJul 8, 2026
35 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/split-testmethodrunner branch July 8, 2026 12:43
github-actionsBot added a commit that referenced this pull request Jul 8, 2026
Apply two project-convention improvements to files added in recent PRs:
- MSTestTestNodeConverter.cs (added in #9706): replace Substring calls
with range operators per csharp_style_prefer_range_operator = true
- TestMethodRunner.DataSource.cs (added in #9729): replace == null with
is null per the project's 'always use is null / is not null' rule
No behavioral change; builds verified to succeed with 0 errors.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[file-diet] Split TestMethodRunner.cs into focused partial-class files

3 participants

@Evangelink@0101
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Split TestMethodRunner.cs into focused partial-class files - #9729

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/split-testmethodrunner
Jul 8, 2026
Merged

Split TestMethodRunner.cs into focused partial-class files#9729
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/split-testmethodrunner

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Overview

Fixes#9711.

TestMethodRunner.cs had grown to 591 lines and was the only class in src/Adapter/MSTestAdapter.PlatformServices/Execution/ not following the ClassName.Responsibility.cs partial-class split pattern used by its neighbors (TestMethodInfo, TestExecutionManager, TypeCache, TestClassInfo, UnitTestRunner).

Changes

Split into four focused partial-class files:

FileLinesResponsibility
TestMethodRunner.cs266Fields, constructor, ExecuteAsync, RunTestMethodAsync, IsDataDrivenTest, GetAggregateOutcome — entry points & routing
TestMethodRunner.DataSource.cs177DataSourceAttribute-based data-driven tests
TestMethodRunner.DataRow.cs107Folded / DynamicData-style (ITestDataSource) data-driven tests
TestMethodRunner.Execution.cs89Core single-test execution (ExecuteTestAsync, UpdateResultsWithParentInfo)

This is a pure structural refactor — no logic changes. Method bodies were moved verbatim; the class is marked partial; usings were trimmed per-file.

GetAggregateOutcome was kept in the entry-point file since it's used by the routing logic in RunTestMethodAsync.

Acceptance criteria

  • Split into 4 partial-class files following the ClassName.Responsibility.cs convention
  • Each new file is under 300 lines
  • Build succeeds (0 warnings, 0 errors across all target frameworks)
  • All 898 MSTestAdapter.PlatformServices.UnitTests pass
  • No behavioral changes — pure structural refactor

Splits the 591-line TestMethodRunner.cs into four partial-class files
following the ClassName.Responsibility.cs convention already used by
neighboring classes in the Execution/ folder:
- TestMethodRunner.cs: entry points and routing (ExecuteAsync,
RunTestMethodAsync, IsDataDrivenTest, GetAggregateOutcome)
- TestMethodRunner.DataSource.cs: DataSourceAttribute-based tests
- TestMethodRunner.DataRow.cs: folded / DynamicData-style tests
- TestMethodRunner.Execution.cs: core single-test execution
Pure structural refactor with no behavioral changes.
Fixes#9711
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 8, 2026 11:07

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors TestMethodRunner in MSTestAdapter.PlatformServices to match the existing ClassName.Responsibility.cs partial-class organization used by other classes in Execution/, improving navigability without changing behavior.

Changes:

  • Converted TestMethodRunner to a partial type and retained entry-point/routing logic in TestMethodRunner.cs.
  • Extracted data-driven execution paths into dedicated partial files (.DataSource.cs and .DataRow.cs).
  • Moved core single-test execution helpers into TestMethodRunner.Execution.cs.
Show a summary per file
FileDescription
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.csMarks the type partial and keeps the primary entry points/routing plus aggregate outcome logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.DataSource.csContains DataSourceAttribute-based data-driven execution logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.DataRow.csContains folded / ITestDataSource (DynamicData-style) execution logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.Execution.csContains core single-test execution (ExecuteTestAsync) and result parent/execution id updates.

Review details

  • Files reviewed: 4/4 changed files
  • Comments generated: 0
  • Review effort level: Low

@Evangelink
Amaury Levé (Evangelink) enabled auto-merge (squash) July 8, 2026 11:14
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jul 8, 2026

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review Summary

Clean structural refactor — no issues found. All 22 review dimensions assessed.

Verification

CheckResult
All original methods accounted for✅ 11/11 methods preserved with identical signatures
File naming convention✅ Follows established ClassName.Responsibility.cs pattern (matches TestMethodInfo, TestExecutionManager, TypeCache, etc.)
using directives per file✅ Properly trimmed — each partial imports only what it needs
Removed using from main fileMicrosoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices correctly removed — no longer directly referenced
partial keyword✅ Applied to class declaration in all 4 files
CI build (Linux Release)✅ Passed

Dimension Assessment

#DimensionVerdict
1Algorithmic CorrectnessN/A — no logic changes
2Threading & ConcurrencyN/A — ConfigureAwait(false) patterns preserved verbatim
3Security & IPCN/A
4Public APIN/A — class is internal sealed
5PerformanceN/A — zero runtime impact
6Cross-TFMN/A — no TFM-specific changes
7Resource & IDisposableN/A — dispose patterns preserved
8Defensive CodingN/A
9LocalizationN/A
10Test IsolationN/A — no test files
11Assertion QualityN/A
12FlakinessN/A
13Test CompletenessN/A
14Data-Driven CoverageN/A
15Code StructureLGTM — this PR improves structure
16NamingLGTM — consistent with neighbors
17DocumentationLGTM — XML doc summaries on each partial describe responsibility
18Analyzer QualityN/A
19IPC WireN/A
20Build InfrastructureN/A
21Scope & PR DisciplineLGTM — single concern, well-scoped
22PowerShellN/A

No blocking or major issues. Well-executed refactor that brings TestMethodRunner in line with the established partial-class conventions in its directory.

@Evangelink
Amaury Levé (Evangelink) merged commit 0b9248a into mainJul 8, 2026
35 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/split-testmethodrunner branch July 8, 2026 12:43
github-actionsBot added a commit that referenced this pull request Jul 8, 2026
Apply two project-convention improvements to files added in recent PRs:
- MSTestTestNodeConverter.cs (added in #9706): replace Substring calls
with range operators per csharp_style_prefer_range_operator = true
- TestMethodRunner.DataSource.cs (added in #9729): replace == null with
is null per the project's 'always use is null / is not null' rule
No behavioral change; builds verified to succeed with 0 errors.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[file-diet] Split TestMethodRunner.cs into focused partial-class files

3 participants

@Evangelink@0101
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Split TestMethodRunner.cs into focused partial-class files - #9729

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/split-testmethodrunner
Jul 8, 2026
Merged

Split TestMethodRunner.cs into focused partial-class files#9729
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/split-testmethodrunner

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Overview

Fixes#9711.

TestMethodRunner.cs had grown to 591 lines and was the only class in src/Adapter/MSTestAdapter.PlatformServices/Execution/ not following the ClassName.Responsibility.cs partial-class split pattern used by its neighbors (TestMethodInfo, TestExecutionManager, TypeCache, TestClassInfo, UnitTestRunner).

Changes

Split into four focused partial-class files:

FileLinesResponsibility
TestMethodRunner.cs266Fields, constructor, ExecuteAsync, RunTestMethodAsync, IsDataDrivenTest, GetAggregateOutcome — entry points & routing
TestMethodRunner.DataSource.cs177DataSourceAttribute-based data-driven tests
TestMethodRunner.DataRow.cs107Folded / DynamicData-style (ITestDataSource) data-driven tests
TestMethodRunner.Execution.cs89Core single-test execution (ExecuteTestAsync, UpdateResultsWithParentInfo)

This is a pure structural refactor — no logic changes. Method bodies were moved verbatim; the class is marked partial; usings were trimmed per-file.

GetAggregateOutcome was kept in the entry-point file since it's used by the routing logic in RunTestMethodAsync.

Acceptance criteria

  • Split into 4 partial-class files following the ClassName.Responsibility.cs convention
  • Each new file is under 300 lines
  • Build succeeds (0 warnings, 0 errors across all target frameworks)
  • All 898 MSTestAdapter.PlatformServices.UnitTests pass
  • No behavioral changes — pure structural refactor

Splits the 591-line TestMethodRunner.cs into four partial-class files
following the ClassName.Responsibility.cs convention already used by
neighboring classes in the Execution/ folder:
- TestMethodRunner.cs: entry points and routing (ExecuteAsync,
RunTestMethodAsync, IsDataDrivenTest, GetAggregateOutcome)
- TestMethodRunner.DataSource.cs: DataSourceAttribute-based tests
- TestMethodRunner.DataRow.cs: folded / DynamicData-style tests
- TestMethodRunner.Execution.cs: core single-test execution
Pure structural refactor with no behavioral changes.
Fixes#9711
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 8, 2026 11:07

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors TestMethodRunner in MSTestAdapter.PlatformServices to match the existing ClassName.Responsibility.cs partial-class organization used by other classes in Execution/, improving navigability without changing behavior.

Changes:

  • Converted TestMethodRunner to a partial type and retained entry-point/routing logic in TestMethodRunner.cs.
  • Extracted data-driven execution paths into dedicated partial files (.DataSource.cs and .DataRow.cs).
  • Moved core single-test execution helpers into TestMethodRunner.Execution.cs.
Show a summary per file
FileDescription
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.csMarks the type partial and keeps the primary entry points/routing plus aggregate outcome logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.DataSource.csContains DataSourceAttribute-based data-driven execution logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.DataRow.csContains folded / ITestDataSource (DynamicData-style) execution logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.Execution.csContains core single-test execution (ExecuteTestAsync) and result parent/execution id updates.

Review details

  • Files reviewed: 4/4 changed files
  • Comments generated: 0
  • Review effort level: Low

@Evangelink
Amaury Levé (Evangelink) enabled auto-merge (squash) July 8, 2026 11:14
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jul 8, 2026

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review Summary

Clean structural refactor — no issues found. All 22 review dimensions assessed.

Verification

CheckResult
All original methods accounted for✅ 11/11 methods preserved with identical signatures
File naming convention✅ Follows established ClassName.Responsibility.cs pattern (matches TestMethodInfo, TestExecutionManager, TypeCache, etc.)
using directives per file✅ Properly trimmed — each partial imports only what it needs
Removed using from main fileMicrosoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices correctly removed — no longer directly referenced
partial keyword✅ Applied to class declaration in all 4 files
CI build (Linux Release)✅ Passed

Dimension Assessment

#DimensionVerdict
1Algorithmic CorrectnessN/A — no logic changes
2Threading & ConcurrencyN/A — ConfigureAwait(false) patterns preserved verbatim
3Security & IPCN/A
4Public APIN/A — class is internal sealed
5PerformanceN/A — zero runtime impact
6Cross-TFMN/A — no TFM-specific changes
7Resource & IDisposableN/A — dispose patterns preserved
8Defensive CodingN/A
9LocalizationN/A
10Test IsolationN/A — no test files
11Assertion QualityN/A
12FlakinessN/A
13Test CompletenessN/A
14Data-Driven CoverageN/A
15Code StructureLGTM — this PR improves structure
16NamingLGTM — consistent with neighbors
17DocumentationLGTM — XML doc summaries on each partial describe responsibility
18Analyzer QualityN/A
19IPC WireN/A
20Build InfrastructureN/A
21Scope & PR DisciplineLGTM — single concern, well-scoped
22PowerShellN/A

No blocking or major issues. Well-executed refactor that brings TestMethodRunner in line with the established partial-class conventions in its directory.

@Evangelink
Amaury Levé (Evangelink) merged commit 0b9248a into mainJul 8, 2026
35 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/split-testmethodrunner branch July 8, 2026 12:43
github-actionsBot added a commit that referenced this pull request Jul 8, 2026
Apply two project-convention improvements to files added in recent PRs:
- MSTestTestNodeConverter.cs (added in #9706): replace Substring calls
with range operators per csharp_style_prefer_range_operator = true
- TestMethodRunner.DataSource.cs (added in #9729): replace == null with
is null per the project's 'always use is null / is not null' rule
No behavioral change; builds verified to succeed with 0 errors.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[file-diet] Split TestMethodRunner.cs into focused partial-class files

3 participants

@Evangelink@0101
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Split TestMethodRunner.cs into focused partial-class files - #9729

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/split-testmethodrunner
Jul 8, 2026
Merged

Split TestMethodRunner.cs into focused partial-class files#9729
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/split-testmethodrunner

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Overview

Fixes#9711.

TestMethodRunner.cs had grown to 591 lines and was the only class in src/Adapter/MSTestAdapter.PlatformServices/Execution/ not following the ClassName.Responsibility.cs partial-class split pattern used by its neighbors (TestMethodInfo, TestExecutionManager, TypeCache, TestClassInfo, UnitTestRunner).

Changes

Split into four focused partial-class files:

FileLinesResponsibility
TestMethodRunner.cs266Fields, constructor, ExecuteAsync, RunTestMethodAsync, IsDataDrivenTest, GetAggregateOutcome — entry points & routing
TestMethodRunner.DataSource.cs177DataSourceAttribute-based data-driven tests
TestMethodRunner.DataRow.cs107Folded / DynamicData-style (ITestDataSource) data-driven tests
TestMethodRunner.Execution.cs89Core single-test execution (ExecuteTestAsync, UpdateResultsWithParentInfo)

This is a pure structural refactor — no logic changes. Method bodies were moved verbatim; the class is marked partial; usings were trimmed per-file.

GetAggregateOutcome was kept in the entry-point file since it's used by the routing logic in RunTestMethodAsync.

Acceptance criteria

  • Split into 4 partial-class files following the ClassName.Responsibility.cs convention
  • Each new file is under 300 lines
  • Build succeeds (0 warnings, 0 errors across all target frameworks)
  • All 898 MSTestAdapter.PlatformServices.UnitTests pass
  • No behavioral changes — pure structural refactor

Splits the 591-line TestMethodRunner.cs into four partial-class files
following the ClassName.Responsibility.cs convention already used by
neighboring classes in the Execution/ folder:
- TestMethodRunner.cs: entry points and routing (ExecuteAsync,
RunTestMethodAsync, IsDataDrivenTest, GetAggregateOutcome)
- TestMethodRunner.DataSource.cs: DataSourceAttribute-based tests
- TestMethodRunner.DataRow.cs: folded / DynamicData-style tests
- TestMethodRunner.Execution.cs: core single-test execution
Pure structural refactor with no behavioral changes.
Fixes#9711
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 8, 2026 11:07

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors TestMethodRunner in MSTestAdapter.PlatformServices to match the existing ClassName.Responsibility.cs partial-class organization used by other classes in Execution/, improving navigability without changing behavior.

Changes:

  • Converted TestMethodRunner to a partial type and retained entry-point/routing logic in TestMethodRunner.cs.
  • Extracted data-driven execution paths into dedicated partial files (.DataSource.cs and .DataRow.cs).
  • Moved core single-test execution helpers into TestMethodRunner.Execution.cs.
Show a summary per file
FileDescription
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.csMarks the type partial and keeps the primary entry points/routing plus aggregate outcome logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.DataSource.csContains DataSourceAttribute-based data-driven execution logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.DataRow.csContains folded / ITestDataSource (DynamicData-style) execution logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.Execution.csContains core single-test execution (ExecuteTestAsync) and result parent/execution id updates.

Review details

  • Files reviewed: 4/4 changed files
  • Comments generated: 0
  • Review effort level: Low

@Evangelink
Amaury Levé (Evangelink) enabled auto-merge (squash) July 8, 2026 11:14
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jul 8, 2026

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review Summary

Clean structural refactor — no issues found. All 22 review dimensions assessed.

Verification

CheckResult
All original methods accounted for✅ 11/11 methods preserved with identical signatures
File naming convention✅ Follows established ClassName.Responsibility.cs pattern (matches TestMethodInfo, TestExecutionManager, TypeCache, etc.)
using directives per file✅ Properly trimmed — each partial imports only what it needs
Removed using from main fileMicrosoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices correctly removed — no longer directly referenced
partial keyword✅ Applied to class declaration in all 4 files
CI build (Linux Release)✅ Passed

Dimension Assessment

#DimensionVerdict
1Algorithmic CorrectnessN/A — no logic changes
2Threading & ConcurrencyN/A — ConfigureAwait(false) patterns preserved verbatim
3Security & IPCN/A
4Public APIN/A — class is internal sealed
5PerformanceN/A — zero runtime impact
6Cross-TFMN/A — no TFM-specific changes
7Resource & IDisposableN/A — dispose patterns preserved
8Defensive CodingN/A
9LocalizationN/A
10Test IsolationN/A — no test files
11Assertion QualityN/A
12FlakinessN/A
13Test CompletenessN/A
14Data-Driven CoverageN/A
15Code StructureLGTM — this PR improves structure
16NamingLGTM — consistent with neighbors
17DocumentationLGTM — XML doc summaries on each partial describe responsibility
18Analyzer QualityN/A
19IPC WireN/A
20Build InfrastructureN/A
21Scope & PR DisciplineLGTM — single concern, well-scoped
22PowerShellN/A

No blocking or major issues. Well-executed refactor that brings TestMethodRunner in line with the established partial-class conventions in its directory.

@Evangelink
Amaury Levé (Evangelink) merged commit 0b9248a into mainJul 8, 2026
35 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/split-testmethodrunner branch July 8, 2026 12:43
github-actionsBot added a commit that referenced this pull request Jul 8, 2026
Apply two project-convention improvements to files added in recent PRs:
- MSTestTestNodeConverter.cs (added in #9706): replace Substring calls
with range operators per csharp_style_prefer_range_operator = true
- TestMethodRunner.DataSource.cs (added in #9729): replace == null with
is null per the project's 'always use is null / is not null' rule
No behavioral change; builds verified to succeed with 0 errors.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[file-diet] Split TestMethodRunner.cs into focused partial-class files

3 participants

@Evangelink@0101
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Split TestMethodRunner.cs into focused partial-class files - #9729

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/split-testmethodrunner
Jul 8, 2026
Merged

Split TestMethodRunner.cs into focused partial-class files#9729
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/split-testmethodrunner

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Overview

Fixes#9711.

TestMethodRunner.cs had grown to 591 lines and was the only class in src/Adapter/MSTestAdapter.PlatformServices/Execution/ not following the ClassName.Responsibility.cs partial-class split pattern used by its neighbors (TestMethodInfo, TestExecutionManager, TypeCache, TestClassInfo, UnitTestRunner).

Changes

Split into four focused partial-class files:

FileLinesResponsibility
TestMethodRunner.cs266Fields, constructor, ExecuteAsync, RunTestMethodAsync, IsDataDrivenTest, GetAggregateOutcome — entry points & routing
TestMethodRunner.DataSource.cs177DataSourceAttribute-based data-driven tests
TestMethodRunner.DataRow.cs107Folded / DynamicData-style (ITestDataSource) data-driven tests
TestMethodRunner.Execution.cs89Core single-test execution (ExecuteTestAsync, UpdateResultsWithParentInfo)

This is a pure structural refactor — no logic changes. Method bodies were moved verbatim; the class is marked partial; usings were trimmed per-file.

GetAggregateOutcome was kept in the entry-point file since it's used by the routing logic in RunTestMethodAsync.

Acceptance criteria

  • Split into 4 partial-class files following the ClassName.Responsibility.cs convention
  • Each new file is under 300 lines
  • Build succeeds (0 warnings, 0 errors across all target frameworks)
  • All 898 MSTestAdapter.PlatformServices.UnitTests pass
  • No behavioral changes — pure structural refactor

Splits the 591-line TestMethodRunner.cs into four partial-class files
following the ClassName.Responsibility.cs convention already used by
neighboring classes in the Execution/ folder:
- TestMethodRunner.cs: entry points and routing (ExecuteAsync,
RunTestMethodAsync, IsDataDrivenTest, GetAggregateOutcome)
- TestMethodRunner.DataSource.cs: DataSourceAttribute-based tests
- TestMethodRunner.DataRow.cs: folded / DynamicData-style tests
- TestMethodRunner.Execution.cs: core single-test execution
Pure structural refactor with no behavioral changes.
Fixes#9711
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 8, 2026 11:07

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors TestMethodRunner in MSTestAdapter.PlatformServices to match the existing ClassName.Responsibility.cs partial-class organization used by other classes in Execution/, improving navigability without changing behavior.

Changes:

  • Converted TestMethodRunner to a partial type and retained entry-point/routing logic in TestMethodRunner.cs.
  • Extracted data-driven execution paths into dedicated partial files (.DataSource.cs and .DataRow.cs).
  • Moved core single-test execution helpers into TestMethodRunner.Execution.cs.
Show a summary per file
FileDescription
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.csMarks the type partial and keeps the primary entry points/routing plus aggregate outcome logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.DataSource.csContains DataSourceAttribute-based data-driven execution logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.DataRow.csContains folded / ITestDataSource (DynamicData-style) execution logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.Execution.csContains core single-test execution (ExecuteTestAsync) and result parent/execution id updates.

Review details

  • Files reviewed: 4/4 changed files
  • Comments generated: 0
  • Review effort level: Low

@Evangelink
Amaury Levé (Evangelink) enabled auto-merge (squash) July 8, 2026 11:14
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jul 8, 2026

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review Summary

Clean structural refactor — no issues found. All 22 review dimensions assessed.

Verification

CheckResult
All original methods accounted for✅ 11/11 methods preserved with identical signatures
File naming convention✅ Follows established ClassName.Responsibility.cs pattern (matches TestMethodInfo, TestExecutionManager, TypeCache, etc.)
using directives per file✅ Properly trimmed — each partial imports only what it needs
Removed using from main fileMicrosoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices correctly removed — no longer directly referenced
partial keyword✅ Applied to class declaration in all 4 files
CI build (Linux Release)✅ Passed

Dimension Assessment

#DimensionVerdict
1Algorithmic CorrectnessN/A — no logic changes
2Threading & ConcurrencyN/A — ConfigureAwait(false) patterns preserved verbatim
3Security & IPCN/A
4Public APIN/A — class is internal sealed
5PerformanceN/A — zero runtime impact
6Cross-TFMN/A — no TFM-specific changes
7Resource & IDisposableN/A — dispose patterns preserved
8Defensive CodingN/A
9LocalizationN/A
10Test IsolationN/A — no test files
11Assertion QualityN/A
12FlakinessN/A
13Test CompletenessN/A
14Data-Driven CoverageN/A
15Code StructureLGTM — this PR improves structure
16NamingLGTM — consistent with neighbors
17DocumentationLGTM — XML doc summaries on each partial describe responsibility
18Analyzer QualityN/A
19IPC WireN/A
20Build InfrastructureN/A
21Scope & PR DisciplineLGTM — single concern, well-scoped
22PowerShellN/A

No blocking or major issues. Well-executed refactor that brings TestMethodRunner in line with the established partial-class conventions in its directory.

@Evangelink
Amaury Levé (Evangelink) merged commit 0b9248a into mainJul 8, 2026
35 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/split-testmethodrunner branch July 8, 2026 12:43
github-actionsBot added a commit that referenced this pull request Jul 8, 2026
Apply two project-convention improvements to files added in recent PRs:
- MSTestTestNodeConverter.cs (added in #9706): replace Substring calls
with range operators per csharp_style_prefer_range_operator = true
- TestMethodRunner.DataSource.cs (added in #9729): replace == null with
is null per the project's 'always use is null / is not null' rule
No behavioral change; builds verified to succeed with 0 errors.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[file-diet] Split TestMethodRunner.cs into focused partial-class files

3 participants

@Evangelink@0101
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Split TestMethodRunner.cs into focused partial-class files - #9729

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/split-testmethodrunner
Jul 8, 2026
Merged

Split TestMethodRunner.cs into focused partial-class files#9729
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/split-testmethodrunner

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Overview

Fixes#9711.

TestMethodRunner.cs had grown to 591 lines and was the only class in src/Adapter/MSTestAdapter.PlatformServices/Execution/ not following the ClassName.Responsibility.cs partial-class split pattern used by its neighbors (TestMethodInfo, TestExecutionManager, TypeCache, TestClassInfo, UnitTestRunner).

Changes

Split into four focused partial-class files:

FileLinesResponsibility
TestMethodRunner.cs266Fields, constructor, ExecuteAsync, RunTestMethodAsync, IsDataDrivenTest, GetAggregateOutcome — entry points & routing
TestMethodRunner.DataSource.cs177DataSourceAttribute-based data-driven tests
TestMethodRunner.DataRow.cs107Folded / DynamicData-style (ITestDataSource) data-driven tests
TestMethodRunner.Execution.cs89Core single-test execution (ExecuteTestAsync, UpdateResultsWithParentInfo)

This is a pure structural refactor — no logic changes. Method bodies were moved verbatim; the class is marked partial; usings were trimmed per-file.

GetAggregateOutcome was kept in the entry-point file since it's used by the routing logic in RunTestMethodAsync.

Acceptance criteria

  • Split into 4 partial-class files following the ClassName.Responsibility.cs convention
  • Each new file is under 300 lines
  • Build succeeds (0 warnings, 0 errors across all target frameworks)
  • All 898 MSTestAdapter.PlatformServices.UnitTests pass
  • No behavioral changes — pure structural refactor

Splits the 591-line TestMethodRunner.cs into four partial-class files
following the ClassName.Responsibility.cs convention already used by
neighboring classes in the Execution/ folder:
- TestMethodRunner.cs: entry points and routing (ExecuteAsync,
RunTestMethodAsync, IsDataDrivenTest, GetAggregateOutcome)
- TestMethodRunner.DataSource.cs: DataSourceAttribute-based tests
- TestMethodRunner.DataRow.cs: folded / DynamicData-style tests
- TestMethodRunner.Execution.cs: core single-test execution
Pure structural refactor with no behavioral changes.
Fixes#9711
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 8, 2026 11:07

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors TestMethodRunner in MSTestAdapter.PlatformServices to match the existing ClassName.Responsibility.cs partial-class organization used by other classes in Execution/, improving navigability without changing behavior.

Changes:

  • Converted TestMethodRunner to a partial type and retained entry-point/routing logic in TestMethodRunner.cs.
  • Extracted data-driven execution paths into dedicated partial files (.DataSource.cs and .DataRow.cs).
  • Moved core single-test execution helpers into TestMethodRunner.Execution.cs.
Show a summary per file
FileDescription
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.csMarks the type partial and keeps the primary entry points/routing plus aggregate outcome logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.DataSource.csContains DataSourceAttribute-based data-driven execution logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.DataRow.csContains folded / ITestDataSource (DynamicData-style) execution logic.
src/Adapter/MSTestAdapter.PlatformServices/Execution/TestMethodRunner.Execution.csContains core single-test execution (ExecuteTestAsync) and result parent/execution id updates.

Review details

  • Files reviewed: 4/4 changed files
  • Comments generated: 0
  • Review effort level: Low

@Evangelink
Amaury Levé (Evangelink) enabled auto-merge (squash) July 8, 2026 11:14
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jul 8, 2026

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review Summary

Clean structural refactor — no issues found. All 22 review dimensions assessed.

Verification

CheckResult
All original methods accounted for✅ 11/11 methods preserved with identical signatures
File naming convention✅ Follows established ClassName.Responsibility.cs pattern (matches TestMethodInfo, TestExecutionManager, TypeCache, etc.)
using directives per file✅ Properly trimmed — each partial imports only what it needs
Removed using from main fileMicrosoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices correctly removed — no longer directly referenced
partial keyword✅ Applied to class declaration in all 4 files
CI build (Linux Release)✅ Passed

Dimension Assessment

#DimensionVerdict
1Algorithmic CorrectnessN/A — no logic changes
2Threading & ConcurrencyN/A — ConfigureAwait(false) patterns preserved verbatim
3Security & IPCN/A
4Public APIN/A — class is internal sealed
5PerformanceN/A — zero runtime impact
6Cross-TFMN/A — no TFM-specific changes
7Resource & IDisposableN/A — dispose patterns preserved
8Defensive CodingN/A
9LocalizationN/A
10Test IsolationN/A — no test files
11Assertion QualityN/A
12FlakinessN/A
13Test CompletenessN/A
14Data-Driven CoverageN/A
15Code StructureLGTM — this PR improves structure
16NamingLGTM — consistent with neighbors
17DocumentationLGTM — XML doc summaries on each partial describe responsibility
18Analyzer QualityN/A
19IPC WireN/A
20Build InfrastructureN/A
21Scope & PR DisciplineLGTM — single concern, well-scoped
22PowerShellN/A

No blocking or major issues. Well-executed refactor that brings TestMethodRunner in line with the established partial-class conventions in its directory.

@Evangelink
Amaury Levé (Evangelink) merged commit 0b9248a into mainJul 8, 2026
35 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/split-testmethodrunner branch July 8, 2026 12:43
github-actionsBot added a commit that referenced this pull request Jul 8, 2026
Apply two project-convention improvements to files added in recent PRs:
- MSTestTestNodeConverter.cs (added in #9706): replace Substring calls
with range operators per csharp_style_prefer_range_operator = true
- TestMethodRunner.DataSource.cs (added in #9729): replace == null with
is null per the project's 'always use is null / is not null' rule
No behavioral change; builds verified to succeed with 0 errors.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[file-diet] Split TestMethodRunner.cs into focused partial-class files

3 participants

@Evangelink@0101