在我的Visual Studio解决方案中,我有大约十几个项目,其中几个包含单元测试方法(用TestMethod属性标记),并在这些项目中分布了数百个测试方法.
在Visual Studio中,我想在解决方案中的一个特定项目中运行所有(100+)测试,而不在解决方案中的其他项目中运行测试.
Ctrl+ R,A没有做我想要的,因为它在整个解决方案中运行所有测试.我也没有看到任何选项在"测试"菜单,"测试资源管理器"窗口或"解决方案资源管理器"窗口中项目的右键单击上下文菜单中的特定项目中运行测试.
我正在使用Visual Studio 2013.
让Visual Studio在特定项目中运行所有测试方法的最佳方法是什么?
在许多不同的论坛中已经以各种形式提出了这个问题,但是,恕我直言,我还没有找到一个真正回答清楚的地方,所以我要重新构思并再次提问.
我在一个基本的微软商店工作.我们使用TFS,我们所有的开发人员都有MSDN订阅,包括VS的Team Suite版本.所以我们可以访问MSTest.
我已经阅读了各种NUnit与MSTest的比较,而开发者社区似乎非常注重选择NUnit.但至少对我们的情况来说,给出的理由似乎并不是压倒性的或令人信服的.(NUnit更频繁更新,NUnit更快,NUnit不需要TFS等)
如果我选择的话,我可以使用NUnit,但是必须保护使用没有正式支持的开源软件.我需要一个相当令人信服的理由这样做.
我基本上必须回答的是为了证明使用NUnit优先于MSTest是这样的:在NUnit中我能做些什么,我在MSTest中无法做同样的努力吗?
我怎样才能让Resharper在调试中运行测试,当我得到调试时"不确定:测试不运行"
在Resharper测试运行器中运行任何MsTest测试都没问题,但如果我尝试调试,则只显示R#测试运行器 Inconclusive: Test not run
即使通过简单的测试,例如,这也会发生
[TestClass]
public class BasicTests
{
[TestMethod]
public void Placeholder()
{
Assert.AreEqual(1, 1);
}
}
Run Code Online (Sandbox Code Playgroud)
但Visual Studio中的内置测试运行器适用于刚运行和调试
附加信息: 它似乎只发生在我的VS 2017预览实例中!
附加信息: 它似乎也出现在我的VS 2017中,最近更新了3!
我有一个单元测试来检查方法是否返回正确的IEnumerable.该方法使用构建可枚举的yield return.它是可枚举的类如下:
enum TokenType
{
NUMBER,
COMMAND,
ARITHMETIC,
}
internal class Token
{
public TokenType type { get; set; }
public string text { get; set; }
public static bool operator == (Token lh, Token rh) { return (lh.type == rh.type) && (lh.text == rh.text); }
public static bool operator != (Token lh, Token rh) { return !(lh == rh); }
public override int GetHashCode()
{
return text.GetHashCode() % type.GetHashCode();
}
public override bool Equals(object obj) …Run Code Online (Sandbox Code Playgroud) 使用MSTest如何验证来自测试方法的确切错误消息?我知道[ExpectedException(typeof(ApplicationException), error msg)]不会比较来自我的测试方法的错误消息,尽管在其他单元测试框架中它正在做.
解决这个问题的一种方法是使用一些try catch块编写单元测试,但是我需要再写4行.
有没有最聪明的方法来检查错误消息.
干杯,Pritam
有没有办法可以在测试方法的结果中添加自定义消息?我想在代码的一部分上放一个秒表,看看它的运行时间.我不需要测试它是否在某个时间范围内运行,只是想在结果窗口中看到经过的时间是多少.
是否可以在装配中的每个测试之前运行特定方法?
我知道TestInitialize属性,但这个属性有"类范围".如果它在Test类中定义,它将在此类的每个测试之前执行.
我想定义一个方法,该方法将在整个程序集中定义的每个测试之前执行.
我试图通过MSTest和app.config的部署来自动运行单元测试.我阅读了多个帖子和博客,尝试了多项内容,但在MSTest执行期间,似乎仍然没有选择app.config.有一个包含我用msbuild构建的所有单元测试的dll,这是我试过的...
[DeploymentItem("MyTests.dll.config")]为每个测试添加了属性MSTest.exe /noisolation /testcontainer:d:\MyTestTests.dll /test:MyTestMSTest.exe /runconfig:d:\local.testrunconfig /testcontainer:d:\MyTestTests.dll /test:MyTest结果:
正在加载d:\ local.testrunconfig ...
d:\ local.testrunconfig
d:\ local.testrunconfig
......没有任何反应:没有错误,没有执行任何测试!
编辑/解决方案:默认情况下,MSTest在单独的进程中执行测试.在这种情况下,如果配置文件的名称类似于"dllname.dll.config",则会自动获取配置文件.但是,如果在VS之外运行,则很难调试在单独进程中运行的测试./ noisolation开关用于使MSTest在一个进程中运行所有测试.但是,在这种情况下,不会选择测试配置文件.而是使用MSTest.exe.config文件,该文件与MSTest位于同一目录中.要解决此问题,可以像下面这样实际加载配置文件:
ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = @"path to config file";
Configuration config =
ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
Run Code Online (Sandbox Code Playgroud) 鉴于此测试夹具:
[TestClass]
public class MSTestThreads
{
[TestMethod]
public void Test1()
{
Trace.WriteLine(Thread.CurrentThread.ManagedThreadId);
}
[TestMethod]
public void Test2()
{
Trace.WriteLine(Thread.CurrentThread.ManagedThreadId);
}
}
Run Code Online (Sandbox Code Playgroud)
使用MSTest通过Visual Studio或命令行运行测试会打印两个不同的线程号(但它们仍然按顺序运行).
有没有办法强制MSTest使用单个线程运行它们?
它似乎CollectionAssert不能与泛型一起使用.这太令人沮丧了; 我想测试的代码确实使用了泛型.我是什么做的?写样板文件在两者之间转换?手动检查集合等价?
这失败了:
ICollection<IDictionary<string, string>> expected = // ...
IEnumerable<IDictionary<string, string>> actual = // ...
// error 1 and 2 here
CollectionAssert.AreEqual(expected.GetEnumerator().ToList(), actual.ToList());
// error 3 here
Assert.IsTrue(expected.GetEnumerator().SequenceEquals(actual));
Run Code Online (Sandbox Code Playgroud)
编译器错误:
错误1:
'System.Collections.Generic.IEnumerator>'不包含'ToList'的定义,并且没有可以找到接受类型'System.Collections.Generic.IEnumerator>'的第一个参数的扩展方法'ToList'
错误2
'System.Collections.Generic.IEnumerator>'不包含'ToList'的定义,并且没有可以找到接受类型'System.Collections.Generic.IEnumerator>'的第一个参数的扩展方法'ToList'
错误3
'System.Collections.Generic.IEnumerator>'不包含'SequenceEquals'的定义,并且没有可以找到接受类型'System.Collections.Generic.IEnumerator>'的第一个参数的扩展方法'SequenceEquals'
我究竟做错了什么?我没有正确使用扩展程序吗?
更新:好的,这看起来好一点,但仍然不起作用:
IEnumerable<IDictionary<string, string>> expected = // ...
IEnumerable<IDictionary<string, string>> actual = // ...
CollectionAssert.AreEquivalent(expected.ToList(), actual.ToList()); // fails
CollectionAssert.IsSubsetOf(expected.ToList(), actual.ToList()); // fails
Run Code Online (Sandbox Code Playgroud)
我不想比较名单; 我只关心集合成员平等.成员的顺序并不重要.我怎么能绕过这个?
mstest ×10
unit-testing ×6
c# ×5
.net ×2
app-config ×1
assert ×1
automation ×1
generics ×1
ienumerable ×1
msbuild ×1
nunit ×1
resharper ×1