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
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <!-- 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
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 | // 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
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | //------------------------------------------------------------------------------ // <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 ); } }, }, }, }; } } |
01 02 03 04 05 06 07 08 09 10 11 | 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()); } } } |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | //------------------------------------------------------------------------------ // <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