2013-02-13 2 views
4

Выполняется ли каждый класс, содержащий тесты, в собственной теме? Или каждый отдельный тест запускается в собственной ветке? Если каждый класс, содержащий тесты, имеет свой собственный поток, выполняются ли они одновременно? т. е. будут ли тесты из класса A выполняться одновременно с тестами класса B? Или будут выполняться тесты класса A (каждый в своем потоке), а затем тесты класса B (каждый в своем потоке)?Как работает тестировщик Visual Studio 2012 для потоковой обработки?

+1

VSTest.Console.Exe использовать один поток, противоположный MSTest, который использует несколько потоков [принудительное использование MSTest для использования одного потока] (http: // stackoverflow.com/q/5037447) –

ответ

2

Ну, похоже, это не касается резьбы вообще! Я построил тестовый проект, который содержит 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 
+0

Почему вы не использовали способность nlog для вывода потока? – JJS

+0

В то время я не знал об этом. Теперь я, конечно, использую его во всех моих журналах. –

5

ли каждый класс, содержащий тесты работать в своем собственном потоке?

No. Все тесты работают на одной и той же нити

Или каждый отдельный тестовый прогон в его собственном потоке?

Нет. Все тесты выполняются на одной и той же резьбе.

Если каждый класс, содержащий тесты, имеет свою собственную резьбу, являются ли они следующими: ? т. е. будут ли тесты класса А выполняться одновременно с испытаниями класса B? Или будут выполняться тесты класса А (каждый в своем потоке), , а затем тесты класса B (каждый в своем потоке)?

Если вы создаете свои темы. У вас есть модель параллелизма для них. Исполнитель vstest не запускает вас одновременно. Нет гарантии последовательности, в которой выполняются тесты, будь то из заданного тестового класса или последовательности между различными тестовыми классами.

2

Проверить эту статью: That Pesky MSTest Execution Ordering..

Это довольно старый, так что я не знаю, если он по-прежнему относится к VS2012, но это может быть полезным для вас.

+1

Он был изменен, по умолчанию не выполняется тестовое чередование. См. Https://social.msdn.microsoft.com/Forums/en-US/84afa304-e652-4aba-98c2-be26dea928e4/interleaved-tests?forum=vststest всего через год после вашей ссылки. –

0

Также обратите внимание, что если ваши модульные тесты являются потокобезопасными, у вас есть возможность применить потоковую обработку и выполнить тесты параллельно. См. Это blog post from Microsoft.

+0

Нет, нет. По крайней мере, не с «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). –