NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
NuGet · #754 most downloaded on NuGet
This package includes code analyzers and code fixes for MSTest. MSTest is Microsoft supported Test Framework.
Last release today
07 Oct 2026
Ships fairly regularly
a new release about every 3 weeks
Nearly every release is documented
notes for 50 of 50 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
50 releases · first in 2024
See the release notes here
See the release notes here
See full log of v4.5.0...v4.5.1
There was a problem with the release infrastructure preventing us from shipping 4.5.0.
See the release notes here
See the release notes here
One column per month.
See full log of v4.4.0...v4.4.1
SatelliteResourceLanguages when copying MSTest adapter satellite assemblies into Microsoft.Testing.Platform test outputs, by @Evangelink in #10987NaN and infinities, by @Evangelink in #10996Assert overload families, by @Evangelink in #11038Assert.AreEqual string comparison previews, by @Evangelink in #11109MSTEST0032 assertions that intentionally compare an enum member converted to its underlying integral type with a numeric literal, by @Evangelink in #11175See the release notes here
See the release notes here
See full log of v4.3.3...v4.4.0
Span<T> and Memory<T> overloads to Assert.IsEmpty, Assert.IsNotEmpty and the remaining collection assertion APIs by @Evangelink in #9793 and #9798TestOutputCaptureMode configuration for live Console, Trace and TestContext output while a test is running by @Evangelink in #10013 and #10040browser-wasm and wasi-wasm by @Evangelink in #9781 and #9857[AssemblyFixtureProvider] is unsupported under Native AOT; provider discovery is skipped there rather than failing at runtime by @Evangelink in #9941[ResourceLock] for fine-grained parallel-test isolation around named shared resources, plus MSTEST0073 to prefer reusable constant lock names, by @Evangelink in #10234TestContext.TestTempDirectory, a lazily created per-test temporary directory that is deleted after a passing test and retained for diagnostics after a failure, by @Evangelink in #10233[ResourceLock], by @Evangelink in #10248 and #10430[DependsOn] and equivalent testconfig.json declarations (mstest:execution:dependencies, with chains for straight sequences and nodes for fan-in/fan-out) to declare that a test runs after one or more other tests. Declarations form a directed acyclic graph rather than a flat order, so tests that share a prerequisite still run in parallel with each other; a test whose prerequisite does not pass is skipped (transitively) unless it sets ProceedOnFailure, and dependency cycles are reported before the run starts. The attribute works on both hosts; the testconfig.json declarations are Microsoft.Testing.Platform only. MSTEST0078 validates statically decidable references and cycles at build time. See RFC 022, #10260 and #10294[GlobalTestInitialize] / [GlobalTestCleanup] fixtures via the timeout:globalTestInitialize / timeout:globalTestCleanup testconfig.json keys (RunSettings XML: GlobalTestInitializeTimeout / GlobalTestCleanupTimeout). These fall back to the per-test testInitialize / testCleanup timeouts when unset, and global fixture timeout/cancellation diagnostics now use dedicated messages ("Global test initialize/cleanup method ...") in #9985[TestClass] to a type decorated with a ConditionBaseAttribute-derived attribute in #10283RuntimeInformation.ProcessArchitecture guard at the top of a test method (early return or Assert.Inconclusive) with [ArchitectureCondition], along with a code fix in #10271CI environment variable at the top of a test method (early return or Assert.Inconclusive) with [CICondition], along with a code fix in #10271[assembly: TestFilterProvider<TFilter>] attribute, a type-safe alternative to [assembly: TestFilterProvider(typeof(TFilter))] whose ITestFilter, new() constraints let the compiler enforce the filter contract. It is only available when targeting .NET, because .NET Framework reflection cannot materialize a generic custom attribute; multi-targeted projects can select the shape with #if NET. Also add MSTEST0081, which validates the filter type passed to the non-generic attribute (non-generic, instantiable, implements ITestFilter, has a public parameterless constructor, and at most one provider per assembly) at build time instead of failing the run with UTA073-UTA077 and UTA079 in #10318RetryResult.AllResults so custom RetryBaseAttribute implementations can expose every retry attempt in order by @Evangelink in #9936[WorkItem] and [GitHubWorkItem] metadata in Microsoft.Testing.Platform TRX reports so CI dashboards and downstream triage tools retain their work-item links, by @Evangelink in #10861Process.Start calls with [ExecutableCondition], by @Evangelink in #10634CombinatorialData, with explicit, inferred, range and random parameter-value providers, by @AArnott in #10896[Retry] attempt to the test host instead of discarding all but the last one. A retried test now shows its attempts in the terminal (failed (try 1) MyTest), is reconciled in the run summary's flaky: / retried: lines and listed by name under Flaky tests:, and is finally detected as flaky (with retries / retryAttempts[]) by the CTRF report. Superseded attempts do not affect the process exit code and are filtered out of the TRX and JUnit reports, so those keep one row per test in #10292MSTest.TestAdapter no longer depends on Microsoft.Testing.Extensions.VSTestBridge and now references Microsoft.Testing.Extensions.TrxReport.Abstractions, Microsoft.Testing.Extensions.Telemetry, and Microsoft.TestPlatform.ObjectModel directly by @Evangelink in #9755DynamicData and reflection-free source-generation metadata safer under trimming and Native AOT, reducing trim warnings and retaining the members needed for discovery and execution by @Evangelink in #9832, #9861 and #10136[Retry] documentation that a data-driven attempt continues retrying while any row failed or timed out; an inconclusive row only stops retrying when no sibling row in that attempt failed or timed out, by @Evangelink in #9936MSTest.SourceGeneration from its independently versioned alpha line so it ships at the MSTest version. Non-NativeAOT MSTest.Sdk projects can opt in with <EnableMSTestSourceGeneration>true</EnableMSTestSourceGeneration>, by @Evangelink in #10477[TestMethod] and [DataRow] methods on Microsoft.Testing.Platform, while preserving per-method fallback for unsupported shapes and leaving VSTest unchanged, by @Evangelink in #10777ICollection overloads of Assert.HasCount and Assert.IsEmpty use the collection's O(1) Count instead of enumerating it, by @Evangelink in #10575Assert.Matches and Assert.DoesNotMatch through a bounded, culture-aware cache, by @Evangelink in #10661CloneWithUpdatedSource mutating this instead of the clone by @Evangelink in #9581TestContext properties return null consistently for custom property dictionaries, and extend the fixture analyzer to understand string-keyed TestContext.Properties access by @Evangelink in #9701wasi-wasm to avoid a PlatformNotSupportedException from SHA-256 during test startup by @Evangelink in #9930s_testContext ??= tc) and deconstruction ((s_testContext, _) = (tc, 0)) assignments of a TestContext parameter to a static member. Projects treating warnings as errors may see new MSTEST0024 diagnostics on code that previously went unreported by @Evangelink in #10244MSTestAdapter.PlatformServices as non-packable because it is embedded in MSTest.TestAdapter, preventing direct pack invocations from producing an unintended standalone package, by @Evangelink in #10728TestContext.TestTempDirectory creation consistent across supported platforms and extend its acceptance coverage, by @Evangelink in #10800See the release notes here
See the release notes here
See full log of v4.3.2...v4.3.3
IDictionary.Contains calls by @Evangelink in #9968Assert.AreEqual calls that use user-defined equality by @Evangelink in #10008[TestClass] attributes, including [STATestClass] by @Evangelink in #9851[TestProperty], test categories and host-provided properties scoped to the individual test lifecycle by @Evangelink in #10080Assert.AreEqual failure messages by @Evangelink in #10145See the release notes here
See the release notes here
See full log of v4.3.0...v4.3.2
ReflectionFree the default MSTestSourceGenMode for Native AOT / trimmed consumers by @Evangelink in #9777See the release notes here
See the release notes here
See full log of v4.2.3...v4.3.0
orderTestsByNameInClass testconfig.json key to mstest:execution:orderTestsByNameInClass (flat mstest:orderTestsByNameInClass still works but emits a deprecation warning) by @Evangelink in #9430ITestFilter / [TestFilterProviderAttribute] for programmatic per-test filtering (before any class is loaded) by @Evangelink in #8896Assert.AreEqual(x, x) / AreSame(x, x) / AreNotEqual(x, x) / AreNotSame(x, x) by @Evangelink in #9088actual type: line from Assert.Throws* failure message by @Evangelink in #9195[ClassCleanup] resource leak when ITestFilter drops the last test of an initialized class by @Evangelink in #9503MSTEST0050 (GlobalTestFixtureShouldBeValidAnalyzer) severity from Error to Warning, matching the six peer fixture analyzers (MSTEST0008–0013) by @Evangelink in #9670See the release notes here
See the release notes here
See full log of v4.2.2...v4.2.3
See the release notes here
See the release notes here
See full log of v4.2.1...v4.2.2
See the release notes here
See the release notes here
See full log of v4.1.0...v4.2.1
EnableBaseClassTestMethodsFromOtherAssemblies by @Youssef1313 in #7404See the release notes here
See the release notes here
See full log of v4.0.2...v4.1.0
See the release notes here
See the release notes here
See full log of v4.0.1...v4.0.2
See full log of v4.0.0...v4.0.1
See full log of v4.0.0...v4.0.1
Breaking changes: see Migrate from MSTest v3 to MSTest v4.
See full log of v3.11.0...v4.0.0
CallerArgumentExpression in all Assert APIs for better messages of assertion failures.Assert.That, which provides easy way to write any assertion boolean expression with clear error message in case of assertion failures.See the release notes here
See the release notes here
See full log of v3.11.0...v3.11.1
See full log of v3.10.5...v3.11.0
See full log of v3.10.5...v3.11.0
TestContext.CancellationTokenSource.Token to TestContext.CancellationToken by @Copilot in #6429IEnumerable<T> by @Youssef1313 in #6607List<TestCase> allocations by @Youssef1313 in #6370See full log of v3.10.4...v3.10.5
See full log of v3.10.4...v3.10.5
See full log of v3.10.3...v3.10.4
See full log of v3.10.3...v3.10.4
See full log of v3.10.2...v3.10.3
See full log of v3.10.2...v3.10.3
See full log of v3.10.1...v3.10.2
See full log of v3.10.1...v3.10.2
See full log of v3.10.0...v3.10.1
See full log of v3.10.0...v3.10.1
Deprecates That property and suggest Instance instead by @Evangelink in #5811
See full log of v3.9.3...v3.10.0
That property and suggest Instance instead by @Evangelink in #5811TestTimeout by @Evangelink in #6144Func<object?> overload to ThrowsExactly by @Youssef1313 in #6195copilot-instructions.md by @Evangelink in #5798See full log of v3.9.2...v3.9.3
See full log of v3.9.2...v3.9.3
See full log of v3.9.1...v3.9.2
See full log of v3.9.1...v3.9.2
See full log of v3.9.0...v3.9.1
See full log of v3.9.0...v3.9.1
See full log of v3.8.3...v3.9.0
See full log of v3.8.3...v3.9.0
Func<object> overloads for Assert.Throws[Exactly] by @Youssef1313 in #5313See full log of v3.8.2...v3.8.3
See full log of v3.8.2...v3.8.3
parallelism:enabled incorrectly setting OrderTestsByNameInClass by @Youssef1313 in #5114See full log of v3.8.1...v3.8.2
See full log of v3.8.1...v3.8.2
See full log of v3.8.0...v3.8.1
See full log of v3.8.0...v3.8.1
object[] parameter by @Youssef1313 #5022See full log of v3.7.3...v3.8.0
See full log of v3.7.3...v3.8.0
RetryAttribute for test methods by @Youssef1313 in #4586See full log of v3.7.2...v3.7.3
See full log of v3.7.2...v3.7.3
Could not load type 'System.Threading.Lock' error for WinUI when using net9.0 by @dependabot in #4794See full log of v3.7.1...v3.7.2
See full log of v3.7.1...v3.7.2
See full log of v3.7.0...v3.7.1
See full log of v3.7.0...v3.7.1
See full log of v3.6.4...v3.7.0
See full log of v3.6.4...v3.7.0
--config for specifying testconfig.json file by @Youssef1313 in #4124--minimum-expected-tests description is localized by @Youssef1313 in #4125System.Threading.Lock usages by @thomhurst in #4156ValidationResult.ValidTask instead of Task.FromResult(ValidationResult.Valid()) by @Youssef1313 in #4262Attribute[] when possible by @Youssef1313 in #4271List<T> rather than Collection<T> by @Youssef1313 in #4315Bump vulnerable deps by @Evangelink in #4218
See full log of v3.6.3...v3.6.4
See full log of v3.6.2...v3.6.3
See full log of v3.6.2...v3.6.3
See full log of v3.6.1...v3.6.2
See full log of v3.6.1...v3.6.2
See full log of v3.6.0...v3.6.1
See full log of v3.6.0...v3.6.1
See full log of v3.5.2...v3.6.0
See full log of v3.5.2...v3.6.0
[STATestClass] by @Evangelink in #3278See full log of v3.5.1...v3.5.2
See full log of v3.5.1...v3.5.2
See full log of v3.5.0...v3.5.1
See full log of v3.5.0...v3.5.1
See full log of v3.4.3...v3.5.0
See full log of v3.4.3...v3.5.0
CollectionAssert.AreEquivalent/AreNotEquivalent with IEqualityComparer<T> by @engyebrahim in #3130Assert.AreEqual using null dynamic by @Evangelink in #3181See full log of v3.4.2...v3.4.3
See full log of v3.4.2...v3.4.3
See full log of v3.4.1...v3.4.2
See full log of v3.4.1...v3.4.2
See full log of v3.4.0...v3.4.1
See full log of v3.4.0...v3.4.1
See full log of v3.3.1...v3.4.0
See full log of v3.3.1...v3.4.0
See full log of v3.3.0...v3.3.1
See full log of v3.3.0...v3.3.1
MSTest.SDK deps by @MarcoRossignoli in #2650See full log of v3.2.2...v3.3.0
See full log of v3.2.2...v3.3.0
[TestInitialize] should be valid by @engyebrahim in #2292[TestCleanup] should have valid layout by @cvpoienaru in #2312[ClassInitialize] should be valid by @engyebrahim in #2354[ClassCleanup] should be valid by @engyebrahim in #2356[AssemblyInitialize] should be valid by @engyebrahim in #2328[AssemblyCleanup] should be valid by @engyebrahim in #2353[DataRow] should be valid by @cvpoienaru in #2352--exit-on-process-exit by @MarcoRossignoli in #2434TestMethod should be valid analyzer description by @engyebrahim in #2295TestingPlatformServer if the runner is disabled by @MarcoRossignoli in #2409RootDeploymentDirectory name unique by @MarcoRossignoli in #2456Microsoft.Testing.Extensions.Telemetry from the package by @MarcoRossignoli in #2454See full log of v3.2.1...v3.2.2
See full log of v3.2.1...v3.2.2
TestingPlatformServer if the runner is disabled (#2409) by @MarcoRossignoli in #2410See full log of v3.2.0...v3.2.1
See full log of v3.2.0...v3.2.1
See full log of v3.1.1...v.3.2.0
See full log of v3.1.1...v.3.2.0
--ignore-exit-code and TESTINGPLATFORM_EXITCODE_IGNORE by @MarcoRossignoli in #2057IEnumerable extensions by @MarcoRossignoli in #2090ICommandLineOptionsProvider api by @MarcoRossignoli in #2093Your coding agent can read these notes before it upgrades. Set up the MCP server →