Выполняется ли каждый класс, содержащий тесты, в собственной теме? Или каждый отдельный тест запускается в собственной ветке? Если каждый класс, содержащий тесты, имеет свой собственный поток, выполняются ли они одновременно? т. е. будут ли тесты из класса A выполняться одновременно с тестами класса B? Или будут выполняться тесты класса A (каждый в своем потоке), а затем тесты класса B (каждый в своем потоке)?Как работает тестировщик Visual Studio 2012 для потоковой обработки?
ответ
Ну, похоже, это не касается резьбы вообще! Я построил тестовый проект, который содержит 3 модульных теста, просто выводя информацию в файл с помощью Nlog.
Что мне было интересно, так это то, что TestClass построен один раз для теста EACH. Я думал, что каждый класс будет построен только один раз.
Кроме того, очистка классов выполняется в конце всех испытаний. Я думал, что очистка каждого класса будет работать после последнего теста для этого класса.
И, наконец, все они работают на одной теме! Теперь это неожиданно. В сегодняшнем мире с несколькими ядрами (у моей установки 4) я ожидал увидеть больше потоков на картинке.
Каждый тест выглядит следующим образом:
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NLog;
using System.Threading;
namespace SeeHowTestsUseThreads
{
[TestClass]
public class UnitTest1
{
static Logger logger = LogManager.GetCurrentClassLogger();
public UnitTest1()
{
logger.Info("Thread {0}: Constructing UnitTest1", Thread.CurrentThread.ManagedThreadId);
}
[ClassInitialize()]
public static void MyClassInitialize(TestContext testContext) {
logger.Info("Thread {0}: UnitTest1 Class Initialize", Thread.CurrentThread.ManagedThreadId);
}
[ClassCleanup()]
public static void MyClassCleanup() {
logger.Info("Thread {0}: UnitTest1 Class Cleanup", Thread.CurrentThread.ManagedThreadId);
}
[TestInitialize()]
public void MyTestInitialize() {
logger.Info("Thread {0}: UnitTest1 Test Initialize", Thread.CurrentThread.ManagedThreadId);
}
[TestCleanup()]
public void MyTestCleanup() {
logger.Info("Thread {0}: UnitTest1 Test Cleanup", Thread.CurrentThread.ManagedThreadId);
}
[TestMethod]
public void TestMethod1()
{
logger.Info("Thread {0}: UnitTest1 TestMethod1 Run", Thread.CurrentThread.ManagedThreadId);
Assert.Inconclusive();
}
[TestMethod]
public void TestMethod2()
{
logger.Info("Thread {0}: UnitTest1 TestMethod2 Run", Thread.CurrentThread.ManagedThreadId);
Assert.Inconclusive();
}
[TestMethod]
public void TestMethod3()
{
logger.Info("Thread {0}: UnitTest1 TestMethod3 Run", Thread.CurrentThread.ManagedThreadId);
Assert.Inconclusive();
}
[TestMethod]
public void TestMethod4()
{
logger.Info("Thread {0}: UnitTest1 TestMethod4 Run", Thread.CurrentThread.ManagedThreadId);
Assert.Inconclusive();
}
[TestMethod]
public void TestMethod5()
{
logger.Info("Thread {0}: UnitTest1 TestMethod5 Run", Thread.CurrentThread.ManagedThreadId);
Assert.Inconclusive();
}
[TestMethod]
public void TestMethod6()
{
logger.Info("Thread {0}: UnitTest1 TestMethod6 Run", Thread.CurrentThread.ManagedThreadId);
Assert.Inconclusive();
}
}
}
Это выход ...
2013-02-14 07:59:42.3879 INFO Thread 10: Constructing UnitTest3
2013-02-14 07:59:42.3979 INFO Thread 10: UnitTest3 Class Initialize
2013-02-14 07:59:42.3979 INFO Thread 10: UnitTest3 Test Initialize
2013-02-14 07:59:42.3979 INFO Thread 10: UnitTest3 TestMethod1 Run
2013-02-14 07:59:42.3979 INFO Thread 10: UnitTest3 Test Cleanup
2013-02-14 07:59:42.4220 INFO Thread 10: Constructing UnitTest3
2013-02-14 07:59:42.4220 INFO Thread 10: UnitTest3 Test Initialize
2013-02-14 07:59:42.4220 INFO Thread 10: UnitTest3 TestMethod2 Run
2013-02-14 07:59:42.4220 INFO Thread 10: UnitTest3 Test Cleanup
2013-02-14 07:59:42.4220 INFO Thread 10: Constructing UnitTest3
2013-02-14 07:59:42.4220 INFO Thread 10: UnitTest3 Test Initialize
2013-02-14 07:59:42.4220 INFO Thread 10: UnitTest3 TestMethod3 Run
2013-02-14 07:59:42.4220 INFO Thread 10: UnitTest3 Test Cleanup
2013-02-14 07:59:42.4220 INFO Thread 10: Constructing UnitTest3
2013-02-14 07:59:42.4220 INFO Thread 10: UnitTest3 Test Initialize
2013-02-14 07:59:42.4220 INFO Thread 10: UnitTest3 TestMethod4 Run
2013-02-14 07:59:42.4220 INFO Thread 10: UnitTest3 Test Cleanup
2013-02-14 07:59:42.4220 INFO Thread 10: Constructing UnitTest3
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest3 Test Initialize
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest3 TestMethod5 Run
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest3 Test Cleanup
2013-02-14 07:59:42.4290 INFO Thread 10: Constructing UnitTest3
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest3 Test Initialize
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest3 TestMethod6 Run
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest3 Test Cleanup
2013-02-14 07:59:42.4290 INFO Thread 10: Constructing UnitTest1
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest1 Class Initialize
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest1 Test Initialize
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest1 TestMethod1 Run
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest1 Test Cleanup
2013-02-14 07:59:42.4290 INFO Thread 10: Constructing UnitTest1
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest1 Test Initialize
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest1 TestMethod2 Run
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest1 Test Cleanup
2013-02-14 07:59:42.4290 INFO Thread 10: Constructing UnitTest1
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest1 Test Initialize
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest1 TestMethod3 Run
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest1 Test Cleanup
2013-02-14 07:59:42.4290 INFO Thread 10: Constructing UnitTest1
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest1 Test Initialize
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest1 TestMethod4 Run
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest1 Test Cleanup
2013-02-14 07:59:42.4290 INFO Thread 10: Constructing UnitTest1
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest1 Test Initialize
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest1 TestMethod5 Run
2013-02-14 07:59:42.4290 INFO Thread 10: UnitTest1 Test Cleanup
2013-02-14 07:59:42.4440 INFO Thread 10: Constructing UnitTest1
2013-02-14 07:59:42.4440 INFO Thread 10: UnitTest1 Test Initialize
2013-02-14 07:59:42.4440 INFO Thread 10: UnitTest1 TestMethod6 Run
2013-02-14 07:59:42.4440 INFO Thread 10: UnitTest1 Test Cleanup
2013-02-14 07:59:42.4440 INFO Thread 10: Constructing UnitTest2
2013-02-14 07:59:42.4440 INFO Thread 10: UnitTest2 Class Initialize
2013-02-14 07:59:42.4440 INFO Thread 10: UnitTest2 Test Initialize
2013-02-14 07:59:42.4440 INFO Thread 10: UnitTest2 TestMethod1 Run
2013-02-14 07:59:42.4440 INFO Thread 10: UnitTest2 Test Cleanup
2013-02-14 07:59:42.4440 INFO Thread 10: Constructing UnitTest2
2013-02-14 07:59:42.4440 INFO Thread 10: UnitTest2 Test Initialize
2013-02-14 07:59:42.4440 INFO Thread 10: UnitTest2 TestMethod2 Run
2013-02-14 07:59:42.4440 INFO Thread 10: UnitTest2 Test Cleanup
2013-02-14 07:59:42.4440 INFO Thread 10: Constructing UnitTest2
2013-02-14 07:59:42.4440 INFO Thread 10: UnitTest2 Test Initialize
2013-02-14 07:59:42.4440 INFO Thread 10: UnitTest2 TestMethod3 Run
2013-02-14 07:59:42.4440 INFO Thread 10: UnitTest2 Test Cleanup
2013-02-14 07:59:42.4440 INFO Thread 10: Constructing UnitTest2
2013-02-14 07:59:42.4440 INFO Thread 10: UnitTest2 Test Initialize
2013-02-14 07:59:42.4440 INFO Thread 10: UnitTest2 TestMethod4 Run
2013-02-14 07:59:42.4440 INFO Thread 10: UnitTest2 Test Cleanup
2013-02-14 07:59:42.4600 INFO Thread 10: Constructing UnitTest2
2013-02-14 07:59:42.4600 INFO Thread 10: UnitTest2 Test Initialize
2013-02-14 07:59:42.4600 INFO Thread 10: UnitTest2 TestMethod5 Run
2013-02-14 07:59:42.4600 INFO Thread 10: UnitTest2 Test Cleanup
2013-02-14 07:59:42.4600 INFO Thread 10: Constructing UnitTest2
2013-02-14 07:59:42.4600 INFO Thread 10: UnitTest2 Test Initialize
2013-02-14 07:59:42.4600 INFO Thread 10: UnitTest2 TestMethod6 Run
2013-02-14 07:59:42.4600 INFO Thread 10: UnitTest2 Test Cleanup
2013-02-14 07:59:42.4600 INFO Thread 10: UnitTest3 Class Cleanup
2013-02-14 07:59:42.4600 INFO Thread 10: UnitTest1 Class Cleanup
2013-02-14 07:59:42.4600 INFO Thread 10: UnitTest2 Class Cleanup
Почему вы не использовали способность nlog для вывода потока? – JJS
В то время я не знал об этом. Теперь я, конечно, использую его во всех моих журналах. –
ли каждый класс, содержащий тесты работать в своем собственном потоке?
No. Все тесты работают на одной и той же нити
Или каждый отдельный тестовый прогон в его собственном потоке?
Нет. Все тесты выполняются на одной и той же резьбе.
Если каждый класс, содержащий тесты, имеет свою собственную резьбу, являются ли они следующими: ? т. е. будут ли тесты класса А выполняться одновременно с испытаниями класса B? Или будут выполняться тесты класса А (каждый в своем потоке), , а затем тесты класса B (каждый в своем потоке)?
Если вы создаете свои темы. У вас есть модель параллелизма для них. Исполнитель vstest не запускает вас одновременно. Нет гарантии последовательности, в которой выполняются тесты, будь то из заданного тестового класса или последовательности между различными тестовыми классами.
Проверить эту статью: That Pesky MSTest Execution Ordering..
Это довольно старый, так что я не знаю, если он по-прежнему относится к VS2012, но это может быть полезным для вас.
Он был изменен, по умолчанию не выполняется тестовое чередование. См. Https://social.msdn.microsoft.com/Forums/en-US/84afa304-e652-4aba-98c2-be26dea928e4/interleaved-tests?forum=vststest всего через год после вашей ссылки. –
Также обратите внимание, что если ваши модульные тесты являются потокобезопасными, у вас есть возможность применить потоковую обработку и выполнить тесты параллельно. См. Это blog post from Microsoft.
Нет, нет. По крайней мере, не с «Visual Studio 2012 Test Runner», о котором спрашивал OP (что за кулисами «vstest» или «vstest.console.exe»). Это не поддерживает потоки. MSTest сделал, что было «тестовым бегуном» в VS2010, и о том, о какой ссылке вы указали. Также см. [This connect issue] (http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3377237-run-unit-tests-in-parallel). –
VSTest.Console.Exe использовать один поток, противоположный MSTest, который использует несколько потоков [принудительное использование MSTest для использования одного потока] (http: // stackoverflow.com/q/5037447) –