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