Принуждение 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 запускать их с помощью одного потока?
Ответы
Ответ 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);
}
}
Кажется, это немного быстрее, поскольку мы можем запускать несколько ядер и потоков...