每個包含測試的類是否都在自己的線程中運行?還是每個單獨的測試都在自己的線程中運行?如果每個包含測試的類都有自己的線程,它們是否同時運行?即將來自A類的測試與來自B類的測試同時運行?或者A類的測試運行(每個測試都在自己的線程中),然後是B類測試(每個測試都在自己的線程中)?Visual Studio 2012測試運行器如何應用線程?
回答
好吧,它似乎並不適用線程!我構建了一個包含3個單元測試的測試項目,只需使用Nlog將信息輸出到文件即可。
我發現有趣的是TestClass爲每個測試構造一次。我認爲每個班級只能構建一次。
另外,Class Cleanups在所有測試結束時運行。我認爲每個班級的清理工作都會在該班級的最後一次測試完成後運行。
最後,他們都在同一個線程上運行!現在這是意想不到的。在當今多核的世界裏(我的鑽機有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 2015-04-11 22:58:01
當時我還沒有意識到這一點。我現在雖然並且在我所有的日誌中都使用它。 – 2015-04-13 09:03:12
是否在它自己的線程中運行包含測試每個類?
號所有測試在同一線程
上運行,也確實每個測試運行在它自己的線程?
不是。所有測試都在同一個線程上運行。
如果每個包含測試的類都有自己的線程,它們是否同時運行 ?即將來自A類的測試與來自B類的測試 同時運行?或者A類的測試運行(每個都在自己的線程上), ,然後是B類的測試(每個都在自己的線程中)?
如果你正在創建你的線程。您正在擁有它們的併發模型。 vstest執行者不會同時運行。無法保證執行測試的順序,無論是來自給定測試類別還是不同測試類別之間的順序。
檢查這篇文章: That Pesky MSTest Execution Ordering..
這是很老,所以我不知道它是否仍然適用於VS2012,但它可能對你有所幫助。
它已被更改,默認情況下不存在測試交叉執行。請參閱https://social.msdn.microsoft.com/Forums/zh-CN/84afa304-e652-4aba-98c2-be26dea928e4/interleaved-tests?forum=vststest比您的鏈接晚一年。 – 2014-10-22 14:38:12
另請注意,如果您的單元測試是線程安全的,則您可以選擇應用線程並使測試並行執行。看到這個blog post from Microsoft。
不,你不知道。至少不會與OP詢問的「Visual Studio 2012 Test Runner」(即,在「vstest」或「vstest.console.exe」後面)。這不支持線程。 MSTest做了,它是VS2010中的「測試跑步者」,並且您提供的鏈接是關於該測試的。另請參閱[此連接問題](http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3377237-run-unit-tests-in-parallel)。 – 2015-05-22 06:13:34
- 1. Visual Studio 2012有序測試,如何監視測試執行
- 2. Visual Studio 2012測試瀏覽器測試進行中
- 3. 如何在visualstudio 2012中運行測試?
- 4. 每天晚上使用Visual Studio 2012運行單元測試
- 5. Visual Studio 2010中如何運行測試
- 6. Visual Studio 2017和Resharper測試運行器
- 7. 如何在visual studio 2012中運行angular2?
- 8. 如何在Visual Studio 2012中運行xunit?
- 9. 如何在Visual Studio在線運行C++測試
- 10. Visual Studio 2012測試類別層次結構(測試瀏覽器)
- 11. 使用Visual Studio 2012在當前上下文中運行/調試測試
- 12. Visual Studio 2012 - 調試
- 13. Visual Studio測試瀏覽器運行外語測試
- 14. visual studio 2012調試器不起作用
- 15. 如何在visual studio在線構建過程中運行我的mocha.js測試
- 16. 谷歌測試覆蓋Visual Studio 2012
- 17. Visual Studio 2012測試結果字體
- 18. 在Visual Studio 2012中保存測試
- 19. Visual Studio Ms測試運行器無法找到程序集
- 20. 的Visual Studio 2012自動創建單元測試 - WP8應用
- 21. 如何使用Visual Studio 2012
- 22. 嘗試在Chrome中運行Visual Studio 2012 Ultimate編碼UI測試時出錯
- 23. 從visual studio運行fsUnit測試
- 24. 在Visual Studio中運行Pester測試
- 25. Visual Studio 2012應用程序設置
- 26. 如何使用Visual Studio 2010 Express運行Moq測試
- 27. 如何在Visual Studio中逐個運行測試用例
- 28. Visual Studio 2012 RC - 編譯後運行單元測試 - 指定要運行的測試類別
- 29. 如何在Visual Studio中串行運行測試?
- 30. 如何在運行MsTest測試時模擬Visual Studio 2010行爲?
VSTest.Console.Exe使用單線程,它與MSTest相反,它使用多線程[強制MSTest使用單線程](http:// stackoverflow。com/q/5037447) – 2016-04-12 04:53:26