每个包含测试的类是否都在自己的线程中运行?还是每个单独的测试都在自己的线程中运行?如果每个包含测试的类都有自己的线程,它们是否同时运行?即将来自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