Подтвердить что ты не робот

Принуждение MSTest к использованию одного потока

Учитывая это тестовое оборудование:

[TestClass]
public class MSTestThreads
{
    [TestMethod]
    public void Test1()
    {
        Trace.WriteLine(Thread.CurrentThread.ManagedThreadId);
    }

    [TestMethod]
    public void Test2()
    {
        Trace.WriteLine(Thread.CurrentThread.ManagedThreadId);
    }
}

Запуск теста с помощью MSTest через Visual Studio или в командной строке печатает два разных номера потоков (все же они запускаются последовательно в любом случае).

Есть ли способ заставить MSTest запускать их с помощью одного потока?

4b9b3361

Ответ 1

Я боролся за бесконечные часы, чтобы сделать MSTest запущенным в однопоточном режиме на большом проекте, который сильно использовал nhibernate, и он не-потокобезопасный (не проблема, это просто не) ISession.

В итоге у нас появилось больше времени для написания кода для поддержки многопоточного характера MSTest, потому что, насколько мне известно из моих и моих команд, невозможно запустить MSTest в однопоточном режиме.

Ответ 2

Я решил эту проблему с блокировкой:

public static class IntegrationTestsSynchronization
{
    public static readonly object LockObject = new object();
}

[TestClass]
public class ATestCaseClass
{
    [TestInitialize]
    public void TestInitialize()
    {
        Monitor.Enter(IntegrationTestsSynchronization.LockObject);
    }

    [TestCleanup]
    public void TestCleanup()
    {
        Monitor.Exit(IntegrationTestsSynchronization.LockObject);
    }

    //test methods
}

// possibly other test cases

Ответ 3

Мы стараемся делать тесты изолированными друг от друга. Многие из них достигают этого, настраивая состояние базы данных, а затем восстанавливая ее. Хотя в большинстве тестов устанавливаются разные данные, при этом около 10 000 в перспективе имеют достаточную вероятность столкновения, если автор кода теста не заботится о том, чтобы его исходные данные были уникальными (т.е. Не используют одни и те же первичные ключи, как другие тест делает что-то подобное). Это, честно говоря, неуправляемо, и мы периодически получаем сбои в тестировании, которые проходят второй раз. Я уверен, что это вызвано столкновениями, которые можно было бы избежать при выполнении тестов строго последовательно.

Ответ 4

Вы можете получить свой тестовый класс из

public class LinearTest
{
    private static readonly object SyncRoot = new object();

    [TestInitialize]
    public void Initialize()
    {
        Monitor.Enter(SyncRoot);
    }

    [TestCleanup]
    public void Cleanup()
    {
        Monitor.Exit(SyncRoot);
    }
}

Ответ 5

В то время как это ответ от компьютера, я бы рекомендовал вам сделать ваш код потокобезопасным. Поведение MSTest заключается в том, чтобы обеспечить изоляцию, как указал Ричард. Если вы столкнетесь с проблемами с вашими модульными тестами, вы доказываете, что в будущем могут быть некоторые проблемы.

Вы можете игнорировать их, использовать NUnit или работать с ними и продолжать использовать MSTest.

Ответ 6

Я попробовал немного другой подход, потому что основная проблема заключается в том, что имена труб являются проблемой. Поэтому я сделал fakePipe, вывел его из той, которую я использую в программе. И назвал канал с именем тестов.

[TestClass]
public class PipeCommunicationContractTests {
  private PipeDummy pipe;

  /// <summary>
  ///Gets or sets the test context which provides
  ///information about and functionality for the current test run.
  ///</summary>
  public TestContext TestContext { get; set; }

  [TestInitialize]
  public void TestInitialize() {
     pipe = new PipeDummy(TestContext.TestName);
     pipe.Start();
  }

  [TestCleanup]
  public void TestCleanup() {
  {
     pipe.Stop();
     pipe = null;
  }
   ...
  [TestMethod]
  public void CallXxOnPipeExpectResult(){
      var result = pipe.Xx();
      Assert.AreEqual("Result",result); 
  }
}

Кажется, это немного быстрее, поскольку мы можем запускать несколько ядер и потоков...