RSCG – MSTest
name | MSTest |
nuget | https://www.nuget.org/packages/MSTest.SourceGeneration/ |
link | https://github.com/microsoft/testfx |
author | Microsoft |
AOP for MSTest
This is how you can use MSTest .
The code that you start with is
<!-- file: UnitTestProject1.csproj --> <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <OutputType>exe</OutputType> <PublishAot>true</PublishAot> </PropertyGroup> <ItemGroup> <!-- Experimental MSTest Engine & source generator, close sourced, licensed the same as our extensions with Microsoft Testing Platform Tools license. --> <PackageReference Include="MSTest.Engine" Version="1.0.0-alpha.24163.4" /> <PackageReference Include="MSTest.SourceGeneration" Version="1.0.0-alpha.24163.4" /> <PackageReference Include="Microsoft.CodeCoverage.MSBuild" Version="17.10.4" /> <PackageReference Include="Microsoft.Testing.Extensions.CodeCoverage" Version="17.10.4" /> <PackageReference Include="Microsoft.Testing.Extensions.TrxReport" Version="1.0.2" /> <PackageReference Include="Microsoft.Testing.Platform.MSBuild" Version="1.0.2" /> <PackageReference Include="MSTest.TestFramework" Version="3.2.2" /> <PackageReference Include="MSTest.Analyzers" Version="3.2.2" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\MyImportantClass\MyImportantClass.csproj" /> </ItemGroup> <ItemGroup> <Using Include="Microsoft.VisualStudio.TestTools.UnitTesting" /> </ItemGroup> <PropertyGroup> <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath> </PropertyGroup> </Project>
The code that you will use is
// file: UnitTest1.cs using MyImportantClass; namespace DemoTest; [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { Assert.AreEqual(3, new Class1().Add(1, 2)); } [TestMethod] [DataRow(1, 2)] [DataRow(100, -97)] public void TestMethod2(int left, int right) { Assert.AreEqual(3, new Class1().Add(left, right)); } }
The code that is generated is
//------------------------------------------------------------------------------ // <auto-generated> // This code was generated by Microsoft Testing Framework Generator. // </auto-generated> //------------------------------------------------------------------------------ namespace DemoTest { using Threading = global::System.Threading; using ColGen = global::System.Collections.Generic; using CA = global::System.Diagnostics.CodeAnalysis; using Sys = global::System; using Msg = global::Microsoft.Testing.Platform.Extensions.Messages; using MSTF = global::Microsoft.Testing.Framework; [CA::ExcludeFromCodeCoverage] public static class DemoTest_UnitTest1 { public static readonly MSTF::TestNode TestNode = new MSTF::TestNode { StableUid = "DemoTest.DemoTest.UnitTest1", DisplayName = "UnitTest1", Properties = new Msg::IProperty[1] { new Msg::TestFileLocationProperty(@"D:\gth\RSCG_Examples\v2\rscg_examples\MSTest\src\DemoTest\UnitTest1.cs", new(new(6, -1), new(22, -1))), }, Tests = new MSTF::TestNode[] { new MSTF::InternalUnsafeActionTestNode { StableUid = "DemoTest.DemoTest.UnitTest1.TestMethod1()", DisplayName = "TestMethod1", Properties = new Msg::IProperty[2] { new Msg::TestMethodIdentifierProperty( "DemoTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "DemoTest", "UnitTest1", "TestMethod1", Sys::Array.Empty<string>(), "System.Void"), new Msg::TestFileLocationProperty(@"D:\gth\RSCG_Examples\v2\rscg_examples\MSTest\src\DemoTest\UnitTest1.cs", new(new(9, -1), new(13, -1))), }, Body = static testExecutionContext => { var instance = new UnitTest1(); try { instance.TestMethod1(); } catch (global::System.Exception ex) { testExecutionContext.ReportException(ex, null); } }, }, new MSTF::InternalUnsafeActionParameterizedTestNode<MSTF::InternalUnsafeTestArgumentsEntry<(int left, int right)>> { StableUid = "DemoTest.DemoTest.UnitTest1.TestMethod2(int, int)", DisplayName = "TestMethod2", Properties = new Msg::IProperty[2] { new Msg::TestMethodIdentifierProperty( "DemoTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "DemoTest", "UnitTest1", "TestMethod2", new string[2] { "System.Int32", "System.Int32", }, "System.Void"), new Msg::TestFileLocationProperty(@"D:\gth\RSCG_Examples\v2\rscg_examples\MSTest\src\DemoTest\UnitTest1.cs", new(new(15, -1), new(21, -1))), }, GetArguments = static () => new MSTF::InternalUnsafeTestArgumentsEntry<(int left, int right)>[] { new MSTF::InternalUnsafeTestArgumentsEntry<(int left, int right)>((1, 2), "left: 1, right: 2"), new MSTF::InternalUnsafeTestArgumentsEntry<(int left, int right)>((100, -97), "left: 100, right: -97"), }, Body = static (testExecutionContext, data) => { var instance = new UnitTest1(); try { instance.TestMethod2(data.Arguments.left, data.Arguments.right); } catch (global::System.Exception ex) { testExecutionContext.ReportException(ex, null); } }, }, }, }; } }
namespace Microsoft.Testing.Framework.SourceGeneration { public static class SourceGeneratedTestingPlatformBuilderHook { public static void AddExtensions(Microsoft.Testing.Platform.Builder.ITestApplicationBuilder testApplicationBuilder, string[] _) { testApplicationBuilder.AddTestFramework(new Microsoft.Testing.Framework.Configurations.TestFrameworkConfiguration(System.Environment.ProcessorCount), new DemoTest.SourceGeneratedTestNodesBuilder()); } } }
//------------------------------------------------------------------------------ // <auto-generated> // This code was generated by Microsoft Testing Framework Generator. // </auto-generated> //------------------------------------------------------------------------------ namespace DemoTest { using DemoTest; using ColGen = global::System.Collections.Generic; using CA = global::System.Diagnostics.CodeAnalysis; using Sys = global::System; using Tasks = global::System.Threading.Tasks; using Msg = global::Microsoft.Testing.Platform.Extensions.Messages; using MSTF = global::Microsoft.Testing.Framework; using Cap = global::Microsoft.Testing.Platform.Capabilities.TestFramework; using TrxReport = global::Microsoft.Testing.Extensions.TrxReport.Abstractions; [CA::ExcludeFromCodeCoverage] public sealed class SourceGeneratedTestNodesBuilder : MSTF::ITestNodesBuilder { private sealed class ClassCapabilities : TrxReport::ITrxReportCapability { bool TrxReport::ITrxReportCapability.IsSupported { get; } = true; void TrxReport::ITrxReportCapability.Enable() {} } public ColGen::IReadOnlyCollection<Cap::ITestFrameworkCapability> Capabilities { get; } = new Cap::ITestFrameworkCapability[1] { new ClassCapabilities() }; public Tasks::Task<MSTF::TestNode[]> BuildAsync(MSTF::ITestSessionContext testSessionContext) { ColGen::List<MSTF::TestNode> namespace1Tests = new(); namespace1Tests.Add(DemoTest_UnitTest1.TestNode); MSTF::TestNode root = new MSTF::TestNode { StableUid = "DemoTest", DisplayName = "DemoTest", Properties = Sys::Array.Empty<Msg::IProperty>(), Tests = new MSTF::TestNode[] { new MSTF::TestNode { StableUid = "DemoTest.DemoTest", DisplayName = "DemoTest", Properties = Sys::Array.Empty<Msg::IProperty>(), Tests = namespace1Tests.ToArray(), }, }, }; return Tasks::Task.FromResult(new MSTF::TestNode[1] { root }); } } }
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/MSTest
Leave a Reply