Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TestContext not Thread Safe #386

Closed
jchesshir opened this issue Mar 23, 2018 · 4 comments
Closed

TestContext not Thread Safe #386

jchesshir opened this issue Mar 23, 2018 · 4 comments
Labels
Help-Wanted The issue is up-for-grabs, and can be claimed by commenting Type: Feature

Comments

@jchesshir
Copy link

Description

The concept of the TestContext as a property of a class is not thread safe. This is especially true if it is made static, but is even true if it is class instance specific. It needs to be made an optional parameter to the test level functions to make it so. This bug is related to #385. Although they address slightly different problems, if you had to choose between the two to fix, I think this way of addressing the threading issues would be cleaner.

Steps to reproduce

Add the .cs file in the attached zip into a MSTest 1.3.0-beta2 project with MethodLevel scope parallelize functionality activated.

ParallelTestContextBug.zip

Expected behavior

The Test Initialize and Test Cleanup functions, at the very least, should be able to take a TestContext parameter. For Data Driven tests with attached data sources, the Test Method functions should also get one, as the DataRow property in a Class level TestContext variable is bound to get jumbled between the functions. If you get to the point of parallelizing a data driven function's test cases, this separation will become even more critical.

Actual behavior

Because the TestContext object is shared at the class level, the output from the two test functions and their respective Test Initialize and Cleanup functions gets jumbled.

@mayankbansal018
Copy link
Contributor

mayankbansal018 commented Aug 8, 2018

@jchesshir , thanks for bringing this issue up. I agree that currently TestContext is not Thread Safe, & can have repercussions in case of method level parallelism.
However the changes to do so are significant, hence marking this as an enhancement.
I'll bring this issue up in internal team discussion, to see when can we pick this story.

Also in case you do get a chance to work on it, please feel free to pick it up 😃

@cltshivash cltshivash added the Help-Wanted The issue is up-for-grabs, and can be claimed by commenting label Dec 20, 2018
@saparia
Copy link

saparia commented Jul 17, 2019

I encountered this issue. TestContext is not thread safe. Please escalate this one.
Eagerly waiting for this issue to be fixed as we've recently migrated from NUnit to this framework and encountered many failures and ended up in a major disappointment.

The issue can be replicated easily by running the following test methods in parallel with execution scope at MethodLevel.

After the execution, in the output of one or many test methods you can see its mixed up showing output from the many methods.

    [TestMethod]
    public void TestMethod1()
    {
        Function1("Test Method 1");
        Function2("Test Method 1");
        Function3("Test Method 1");
        Function4("Test Method 1");
        Assert.Fail();
    }

    [TestMethod]
    public void TestMethod2()
    {
        Function1("Test Method 2");
        Function2("Test Method 2");
        Function3("Test Method 2");
        Function4("Test Method 2");
        Assert.Fail();
    }
    [TestMethod]
    public void TestMethod3()
    {
        Function1("Test Method 3");
        Function2("Test Method 3");
        Function3("Test Method 3");
        Function4("Test Method 3");
        Assert.Fail();
    }

    [TestMethod]
    public void TestMethod4()
    {
        Function1("Test Method 4");
        Function2("Test Method 4");
        Function3("Test Method 4");
        Function4("Test Method 4");
        Assert.Fail();
    }

    [TestMethod]
    public void TestMethod5()
    {
        Function1("Test Method 5");
        Function2("Test Method 5");
        Function3("Test Method 5");
        Function4("Test Method 5");
        Assert.Fail();
    }

    [TestMethod]
    public void TestMethod6()
    {
        Function1("Test Method 6");
        Function2("Test Method 6");
        Function3("Test Method 6");
        Function4("Test Method 6");
        Assert.Fail();
    }

    //Functions
    public void Function1(string value)
    {
        Console.WriteLine($"From Function 1 : {value}");
    }
    public void Function2(string value)
    {
        Console.WriteLine($"From Function 2 : {value}");
    }

    public void Function3(string value)
    {
        Console.WriteLine($"From Function 3 : {value}");
    }

    public void Function4(string value)
    {
        Console.WriteLine($"From Function 4 : {value}");
    }

@ankitkhullar
Copy link

@saparia If I switch Console.Writeline to TestContext.Writeline the example works for me

Starting test execution, please wait...
MSTest Executor: Test Parallelization enabled for source\repos\TestUnitTests\bin\Debug\TestUnitTests.dll (Workers: 8, Scope: MethodLevel).
  X TestMethod2 [30ms]
  Error Message:
   Assert.Fail failed.
  Stack Trace:
     at Microsoft.VisualStudio.TestTools.UnitTesting.Assert.HandleFail(String assertionName, String message, Object[] parameters)
   at Microsoft.VisualStudio.TestTools.UnitTesting.Assert.Fail()
   at TestUnitTests.UnitTest1.TestMethod2() in source\repos\TestUnitTests\UnitTest1.cs:line 27

  Standard Output Messages:


TestContext Messages:
From Function 1 : Test Method 2
 From Function 2 : Test Method 2
 From Function 3 : Test Method 2
 From Function 4 : Test Method 2


  X TestMethod5 [31ms]
  Error Message:
   Assert.Fail failed.
  Stack Trace:
     at TestUnitTests.UnitTest1.TestMethod5() in source\repos\TestUnitTests\UnitTest1.cs:line 56

  Standard Output Messages:


TestContext Messages:
From Function 1 : Test Method 5
 From Function 2 : Test Method 5
 From Function 3 : Test Method 5
 From Function 4 : Test Method 5


  X TestMethod6 [29ms]
  Error Message:
   Assert.Fail failed.
  Stack Trace:
     at TestUnitTests.UnitTest1.TestMethod6() in source\repos\TestUnitTests\UnitTest1.cs:line 66

  Standard Output Messages:


TestContext Messages:
From Function 1 : Test Method 6
 From Function 2 : Test Method 6
 From Function 3 : Test Method 6
 From Function 4 : Test Method 6


  X TestMethod4 [30ms]
  Error Message:
   Assert.Fail failed.
  Stack Trace:
     at TestUnitTests.UnitTest1.TestMethod4() in source\repos\TestUnitTests\UnitTest1.cs:line 46

  Standard Output Messages:


TestContext Messages:
From Function 1 : Test Method 4
 From Function 2 : Test Method 4
 From Function 3 : Test Method 4
 From Function 4 : Test Method 4


  X TestMethod3 [31ms]
  Error Message:
   Assert.Fail failed.
  Stack Trace:
     at TestUnitTests.UnitTest1.TestMethod3() in source\repos\TestUnitTests\UnitTest1.cs:line 36

  Standard Output Messages:


TestContext Messages:
From Function 1 : Test Method 3
 From Function 2 : Test Method 3
 From Function 3 : Test Method 3
 From Function 4 : Test Method 3

@Evangelink
Copy link
Member

I think the issue raised in this ticket was fixed as a side-effect of some other fix. I cannot reproduce the issue on newer version of MSTest but I can repro on old versions.

I will move forward by closing this issue. Please feel free to ping if you are still facing the issue.

@Evangelink Evangelink closed this as not planned Won't fix, can't repro, duplicate, stale Jan 15, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Help-Wanted The issue is up-for-grabs, and can be claimed by commenting Type: Feature
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants