How to skip a Unit Test at runtime?





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















Thanks in advance!



We have some Automation tests using the selenium web driver which are great and provide a really good regression pack.



The problem is now we have feature toggles in our code. So I need to say ignore these tests unless that feature toggle is turned On/ Off. I can't find anything really searching Google.



Ideally I don't want a 'if' statement at the top of the Feature tests but it looks like it's going to be the main way. My initial thoughts where to create a custom attribute



public class IsFeatureFlagTurnedOn : Attribute
{
public IsFeatureFlagTurnedOn(string featureToggleName)
{
FeatureToggleName = featureToggleName;
}
public string FeatureToggleName {get;}
}

public class MyTests
{
[TestMethod]
[IsFeatureFlagTurnedOn("MyFeature1")]
public void ItShould()
{
// only run if MyFeature1 is turned on
}
}


I some how need to hook into the MSTest pipeline and say if this attribute is present and the logic for MyFeature1 is turned off then don't run this test - Looked at dynamically adding the [Ignore] but with no luck.



This is running through VSTS and I could use [TestCategories] but I'd have to keep updating the pipeline to which feature is turned on/off which I don't want to do.



Any help or suggestions would be great!










share|improve this question































    0















    Thanks in advance!



    We have some Automation tests using the selenium web driver which are great and provide a really good regression pack.



    The problem is now we have feature toggles in our code. So I need to say ignore these tests unless that feature toggle is turned On/ Off. I can't find anything really searching Google.



    Ideally I don't want a 'if' statement at the top of the Feature tests but it looks like it's going to be the main way. My initial thoughts where to create a custom attribute



    public class IsFeatureFlagTurnedOn : Attribute
    {
    public IsFeatureFlagTurnedOn(string featureToggleName)
    {
    FeatureToggleName = featureToggleName;
    }
    public string FeatureToggleName {get;}
    }

    public class MyTests
    {
    [TestMethod]
    [IsFeatureFlagTurnedOn("MyFeature1")]
    public void ItShould()
    {
    // only run if MyFeature1 is turned on
    }
    }


    I some how need to hook into the MSTest pipeline and say if this attribute is present and the logic for MyFeature1 is turned off then don't run this test - Looked at dynamically adding the [Ignore] but with no luck.



    This is running through VSTS and I could use [TestCategories] but I'd have to keep updating the pipeline to which feature is turned on/off which I don't want to do.



    Any help or suggestions would be great!










    share|improve this question



























      0












      0








      0








      Thanks in advance!



      We have some Automation tests using the selenium web driver which are great and provide a really good regression pack.



      The problem is now we have feature toggles in our code. So I need to say ignore these tests unless that feature toggle is turned On/ Off. I can't find anything really searching Google.



      Ideally I don't want a 'if' statement at the top of the Feature tests but it looks like it's going to be the main way. My initial thoughts where to create a custom attribute



      public class IsFeatureFlagTurnedOn : Attribute
      {
      public IsFeatureFlagTurnedOn(string featureToggleName)
      {
      FeatureToggleName = featureToggleName;
      }
      public string FeatureToggleName {get;}
      }

      public class MyTests
      {
      [TestMethod]
      [IsFeatureFlagTurnedOn("MyFeature1")]
      public void ItShould()
      {
      // only run if MyFeature1 is turned on
      }
      }


      I some how need to hook into the MSTest pipeline and say if this attribute is present and the logic for MyFeature1 is turned off then don't run this test - Looked at dynamically adding the [Ignore] but with no luck.



      This is running through VSTS and I could use [TestCategories] but I'd have to keep updating the pipeline to which feature is turned on/off which I don't want to do.



      Any help or suggestions would be great!










      share|improve this question
















      Thanks in advance!



      We have some Automation tests using the selenium web driver which are great and provide a really good regression pack.



      The problem is now we have feature toggles in our code. So I need to say ignore these tests unless that feature toggle is turned On/ Off. I can't find anything really searching Google.



      Ideally I don't want a 'if' statement at the top of the Feature tests but it looks like it's going to be the main way. My initial thoughts where to create a custom attribute



      public class IsFeatureFlagTurnedOn : Attribute
      {
      public IsFeatureFlagTurnedOn(string featureToggleName)
      {
      FeatureToggleName = featureToggleName;
      }
      public string FeatureToggleName {get;}
      }

      public class MyTests
      {
      [TestMethod]
      [IsFeatureFlagTurnedOn("MyFeature1")]
      public void ItShould()
      {
      // only run if MyFeature1 is turned on
      }
      }


      I some how need to hook into the MSTest pipeline and say if this attribute is present and the logic for MyFeature1 is turned off then don't run this test - Looked at dynamically adding the [Ignore] but with no luck.



      This is running through VSTS and I could use [TestCategories] but I'd have to keep updating the pipeline to which feature is turned on/off which I don't want to do.



      Any help or suggestions would be great!







      c# unit-testing mstest featuretoggle






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 16 '18 at 13:52









      Klors

      2,39011636




      2,39011636










      asked Nov 16 '18 at 13:30









      user1829226user1829226

      205




      205
























          2 Answers
          2






          active

          oldest

          votes


















          0














          MSTest v2 now has a lot of extensibility points, and you can achieve this by extending the TestMethodAttribute. First we add two attribute arguments, a string for a property name and a Type that has the property. Then we override the Execute method and invoke the property via reflection. If the result is true, we'll execute the test as normal, otherwise we return an 'inconclusive` test result.



          public class TestMethodWithConditionAttribute : TestMethodAttribute
          {
          public Type ConditionParentType { get; set; }
          public string ConditionPropertyName { get; set; }

          public TestMethodWithConditionAttribute(string conditionPropertyName, Type conditionParentType)
          {
          ConditionPropertyName = conditionPropertyName;
          ConditionParentType = conditionParentType;
          }

          public override TestResult Execute(ITestMethod testMethod)
          {
          if (ConditionParentType.GetProperty(ConditionPropertyName, BindingFlags.Static | BindingFlags.Public)?.GetValue(null) is bool condiiton && condiiton)
          {
          return base.Execute(testMethod);
          }
          else
          {
          return new TestResult { new TestResult { Outcome = UnitTestOutcome.Inconclusive } };
          }
          }
          }


          Now we can use our new attribute like this:



          [TestClass]
          public class MyTests
          {
          [TestMethodWithCondition(nameof(Configuration.IsMyFeature1Enabled), typeof(Configuration))]
          public void MyTest()
          {
          //...
          }
          }

          public static class Configuration
          {
          public static bool IsMyFeature1Enabled => false;
          }




          The above is a very generic solution. You could also customize it a little more to your particular use case to perhaps avoid quite so much verbosity in the attribute declaration:



          public class TestMethodForConfigAttribute : TestMethodAttribute
          {
          public string Name { get; set; }

          public TestMethodForConfigAttribute(string name)
          {
          Name = name;
          }

          public override TestResult Execute(ITestMethod testMethod)
          {
          if (IsConfigEnabled(Name))
          {
          return base.Execute(testMethod);
          }
          else
          {
          return new TestResult { new TestResult { Outcome = UnitTestOutcome.Inconclusive } };
          }
          }

          public static bool IsConfigEnabled(string name)
          {
          //...
          return false;
          }
          }


          And use it like:



          [TestClass]
          public class MyTests
          {
          [TestMethodForConfig("MyFeature1")]
          public void MyTest()
          {
          //...
          }
          }





          share|improve this answer
























          • Great answer! #H5YR

            – user1829226
            Nov 19 '18 at 10:59



















          0














          Based on my reading of this, you may need to use Assert.Inconclusive






          share|improve this answer
























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53338872%2fhow-to-skip-a-unit-test-at-runtime%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            MSTest v2 now has a lot of extensibility points, and you can achieve this by extending the TestMethodAttribute. First we add two attribute arguments, a string for a property name and a Type that has the property. Then we override the Execute method and invoke the property via reflection. If the result is true, we'll execute the test as normal, otherwise we return an 'inconclusive` test result.



            public class TestMethodWithConditionAttribute : TestMethodAttribute
            {
            public Type ConditionParentType { get; set; }
            public string ConditionPropertyName { get; set; }

            public TestMethodWithConditionAttribute(string conditionPropertyName, Type conditionParentType)
            {
            ConditionPropertyName = conditionPropertyName;
            ConditionParentType = conditionParentType;
            }

            public override TestResult Execute(ITestMethod testMethod)
            {
            if (ConditionParentType.GetProperty(ConditionPropertyName, BindingFlags.Static | BindingFlags.Public)?.GetValue(null) is bool condiiton && condiiton)
            {
            return base.Execute(testMethod);
            }
            else
            {
            return new TestResult { new TestResult { Outcome = UnitTestOutcome.Inconclusive } };
            }
            }
            }


            Now we can use our new attribute like this:



            [TestClass]
            public class MyTests
            {
            [TestMethodWithCondition(nameof(Configuration.IsMyFeature1Enabled), typeof(Configuration))]
            public void MyTest()
            {
            //...
            }
            }

            public static class Configuration
            {
            public static bool IsMyFeature1Enabled => false;
            }




            The above is a very generic solution. You could also customize it a little more to your particular use case to perhaps avoid quite so much verbosity in the attribute declaration:



            public class TestMethodForConfigAttribute : TestMethodAttribute
            {
            public string Name { get; set; }

            public TestMethodForConfigAttribute(string name)
            {
            Name = name;
            }

            public override TestResult Execute(ITestMethod testMethod)
            {
            if (IsConfigEnabled(Name))
            {
            return base.Execute(testMethod);
            }
            else
            {
            return new TestResult { new TestResult { Outcome = UnitTestOutcome.Inconclusive } };
            }
            }

            public static bool IsConfigEnabled(string name)
            {
            //...
            return false;
            }
            }


            And use it like:



            [TestClass]
            public class MyTests
            {
            [TestMethodForConfig("MyFeature1")]
            public void MyTest()
            {
            //...
            }
            }





            share|improve this answer
























            • Great answer! #H5YR

              – user1829226
              Nov 19 '18 at 10:59
















            0














            MSTest v2 now has a lot of extensibility points, and you can achieve this by extending the TestMethodAttribute. First we add two attribute arguments, a string for a property name and a Type that has the property. Then we override the Execute method and invoke the property via reflection. If the result is true, we'll execute the test as normal, otherwise we return an 'inconclusive` test result.



            public class TestMethodWithConditionAttribute : TestMethodAttribute
            {
            public Type ConditionParentType { get; set; }
            public string ConditionPropertyName { get; set; }

            public TestMethodWithConditionAttribute(string conditionPropertyName, Type conditionParentType)
            {
            ConditionPropertyName = conditionPropertyName;
            ConditionParentType = conditionParentType;
            }

            public override TestResult Execute(ITestMethod testMethod)
            {
            if (ConditionParentType.GetProperty(ConditionPropertyName, BindingFlags.Static | BindingFlags.Public)?.GetValue(null) is bool condiiton && condiiton)
            {
            return base.Execute(testMethod);
            }
            else
            {
            return new TestResult { new TestResult { Outcome = UnitTestOutcome.Inconclusive } };
            }
            }
            }


            Now we can use our new attribute like this:



            [TestClass]
            public class MyTests
            {
            [TestMethodWithCondition(nameof(Configuration.IsMyFeature1Enabled), typeof(Configuration))]
            public void MyTest()
            {
            //...
            }
            }

            public static class Configuration
            {
            public static bool IsMyFeature1Enabled => false;
            }




            The above is a very generic solution. You could also customize it a little more to your particular use case to perhaps avoid quite so much verbosity in the attribute declaration:



            public class TestMethodForConfigAttribute : TestMethodAttribute
            {
            public string Name { get; set; }

            public TestMethodForConfigAttribute(string name)
            {
            Name = name;
            }

            public override TestResult Execute(ITestMethod testMethod)
            {
            if (IsConfigEnabled(Name))
            {
            return base.Execute(testMethod);
            }
            else
            {
            return new TestResult { new TestResult { Outcome = UnitTestOutcome.Inconclusive } };
            }
            }

            public static bool IsConfigEnabled(string name)
            {
            //...
            return false;
            }
            }


            And use it like:



            [TestClass]
            public class MyTests
            {
            [TestMethodForConfig("MyFeature1")]
            public void MyTest()
            {
            //...
            }
            }





            share|improve this answer
























            • Great answer! #H5YR

              – user1829226
              Nov 19 '18 at 10:59














            0












            0








            0







            MSTest v2 now has a lot of extensibility points, and you can achieve this by extending the TestMethodAttribute. First we add two attribute arguments, a string for a property name and a Type that has the property. Then we override the Execute method and invoke the property via reflection. If the result is true, we'll execute the test as normal, otherwise we return an 'inconclusive` test result.



            public class TestMethodWithConditionAttribute : TestMethodAttribute
            {
            public Type ConditionParentType { get; set; }
            public string ConditionPropertyName { get; set; }

            public TestMethodWithConditionAttribute(string conditionPropertyName, Type conditionParentType)
            {
            ConditionPropertyName = conditionPropertyName;
            ConditionParentType = conditionParentType;
            }

            public override TestResult Execute(ITestMethod testMethod)
            {
            if (ConditionParentType.GetProperty(ConditionPropertyName, BindingFlags.Static | BindingFlags.Public)?.GetValue(null) is bool condiiton && condiiton)
            {
            return base.Execute(testMethod);
            }
            else
            {
            return new TestResult { new TestResult { Outcome = UnitTestOutcome.Inconclusive } };
            }
            }
            }


            Now we can use our new attribute like this:



            [TestClass]
            public class MyTests
            {
            [TestMethodWithCondition(nameof(Configuration.IsMyFeature1Enabled), typeof(Configuration))]
            public void MyTest()
            {
            //...
            }
            }

            public static class Configuration
            {
            public static bool IsMyFeature1Enabled => false;
            }




            The above is a very generic solution. You could also customize it a little more to your particular use case to perhaps avoid quite so much verbosity in the attribute declaration:



            public class TestMethodForConfigAttribute : TestMethodAttribute
            {
            public string Name { get; set; }

            public TestMethodForConfigAttribute(string name)
            {
            Name = name;
            }

            public override TestResult Execute(ITestMethod testMethod)
            {
            if (IsConfigEnabled(Name))
            {
            return base.Execute(testMethod);
            }
            else
            {
            return new TestResult { new TestResult { Outcome = UnitTestOutcome.Inconclusive } };
            }
            }

            public static bool IsConfigEnabled(string name)
            {
            //...
            return false;
            }
            }


            And use it like:



            [TestClass]
            public class MyTests
            {
            [TestMethodForConfig("MyFeature1")]
            public void MyTest()
            {
            //...
            }
            }





            share|improve this answer













            MSTest v2 now has a lot of extensibility points, and you can achieve this by extending the TestMethodAttribute. First we add two attribute arguments, a string for a property name and a Type that has the property. Then we override the Execute method and invoke the property via reflection. If the result is true, we'll execute the test as normal, otherwise we return an 'inconclusive` test result.



            public class TestMethodWithConditionAttribute : TestMethodAttribute
            {
            public Type ConditionParentType { get; set; }
            public string ConditionPropertyName { get; set; }

            public TestMethodWithConditionAttribute(string conditionPropertyName, Type conditionParentType)
            {
            ConditionPropertyName = conditionPropertyName;
            ConditionParentType = conditionParentType;
            }

            public override TestResult Execute(ITestMethod testMethod)
            {
            if (ConditionParentType.GetProperty(ConditionPropertyName, BindingFlags.Static | BindingFlags.Public)?.GetValue(null) is bool condiiton && condiiton)
            {
            return base.Execute(testMethod);
            }
            else
            {
            return new TestResult { new TestResult { Outcome = UnitTestOutcome.Inconclusive } };
            }
            }
            }


            Now we can use our new attribute like this:



            [TestClass]
            public class MyTests
            {
            [TestMethodWithCondition(nameof(Configuration.IsMyFeature1Enabled), typeof(Configuration))]
            public void MyTest()
            {
            //...
            }
            }

            public static class Configuration
            {
            public static bool IsMyFeature1Enabled => false;
            }




            The above is a very generic solution. You could also customize it a little more to your particular use case to perhaps avoid quite so much verbosity in the attribute declaration:



            public class TestMethodForConfigAttribute : TestMethodAttribute
            {
            public string Name { get; set; }

            public TestMethodForConfigAttribute(string name)
            {
            Name = name;
            }

            public override TestResult Execute(ITestMethod testMethod)
            {
            if (IsConfigEnabled(Name))
            {
            return base.Execute(testMethod);
            }
            else
            {
            return new TestResult { new TestResult { Outcome = UnitTestOutcome.Inconclusive } };
            }
            }

            public static bool IsConfigEnabled(string name)
            {
            //...
            return false;
            }
            }


            And use it like:



            [TestClass]
            public class MyTests
            {
            [TestMethodForConfig("MyFeature1")]
            public void MyTest()
            {
            //...
            }
            }






            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Nov 17 '18 at 20:09









            Dave MDave M

            1,5661013




            1,5661013













            • Great answer! #H5YR

              – user1829226
              Nov 19 '18 at 10:59



















            • Great answer! #H5YR

              – user1829226
              Nov 19 '18 at 10:59

















            Great answer! #H5YR

            – user1829226
            Nov 19 '18 at 10:59





            Great answer! #H5YR

            – user1829226
            Nov 19 '18 at 10:59













            0














            Based on my reading of this, you may need to use Assert.Inconclusive






            share|improve this answer




























              0














              Based on my reading of this, you may need to use Assert.Inconclusive






              share|improve this answer


























                0












                0








                0







                Based on my reading of this, you may need to use Assert.Inconclusive






                share|improve this answer













                Based on my reading of this, you may need to use Assert.Inconclusive







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 16 '18 at 14:13









                shahkalpeshshahkalpesh

                29.5k24882




                29.5k24882






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53338872%2fhow-to-skip-a-unit-test-at-runtime%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Bressuire

                    Vorschmack

                    Quarantine