我有一个C#项目的visual studio解决方案。目前,我的解决方案中没有测试项目。所以我没有文件* .vsmdi。
我想通过命令行测试我的项目。
MSTest.exe /testmetadata:*.vsmdi /resultsfile:Logfile.log
是否可以在不添加项目的情况下创建.vsmdi?如果可能,怎么样?
要在命令行中执行,* .vsmdi文件必须出现在解决方案中吗?
如果我必须使用IDE测试,我应该在测试项目中有* .vsmdi文件吗?
* .vsmdi文件的唯一用途是列出测试用例吗?
答案 0 :(得分:2)
1)从技术上讲,可以在不将测试项目添加到解决方案的情况下创建.vsmdi文件。由于VSMDI文件的内容是XML,您可以手动编写它们,或者使用基于程序集中的测试的工具生成它们。但是,当测试项目未包含在解决方案中时,VSMDI文件不太有用,因为VSMDI文件的功能正在管理您的测试。但你仍然可以使用它们(另见问题2的回答)。
如果要手动编写vsmdi文件,则需要使用SHA1对FQN进行散列,并创建散列的前128位的Guid,如下所示(来自Dominic Hopton的代码)。有关详细信息,请参阅他的博文:Helpful Internals of TRX (and VSMDI files)。
private static HashAlgorithm s_provider = new SHA1CryptoServiceProvider();
internal static HashAlgorithm Provider
{
get { return s_provider; }
}
/// Calculates a hash of the string and copies the first 128 bits of the hash
/// to a new Guid.
///
internal static Guid GuidFromString(string data)
{
byte[] hash = Provider.ComputeHash(
System.Text.Encoding.Unicode.GetBytes(data));
byte[] toGuid = new byte[16];
Array.Copy(hash, toGuid, 16);
return new Guid(toGuid);
}
2)不,只要testLink元素的存储属性指向包含测试的正确程序集(相对于您的vsmdi文件),vsmdi文件就不需要在您的解决方案文件夹中(或在您的解决方案中) )。例如:
<TestLink id="0c257cc9-ffed-cd5e-bda1-56df14ad68c2" name="AddOneAndTwo_Test"
storage="TestProject\bin\debug\testproject.dll" />
3)Vsmdi文件存在于解决方案级别而不是项目级别。如果您有多个测试项目,则可以使用一个vsmdi文件来管理所有测试。请注意,假设您在解决方案中加载了项目,从Visual Studio运行测试时将忽略storage属性
4)Vsmdi文件用于管理解决方案中的测试,您可以在VSMDI文件中创建多个层的层次结构。例如,您要在测试的解决方案中有多个程序集。在根测试列表(称为:测试列表)下,为每个项目创建一个测试列表。然后,您可以将其中一个项目的测试列表分成两个或多个单独的测试列表(例如,一个用于测试业务逻辑,另一个用于测试错误处理)。当您只想从项目A测试业务逻辑测试时,您可以选择相应的测试列表并在其中运行测试。
关于vsmdi文件的额外说明:
A)因为Visual Studio 2012 Microsoft决定不推荐使用VSMDI文件(以及测试列表)。测试列表被测试类别(已存在于Visual Studio 2010中)和播放列表替换。 测试类别是您可以在各个测试方法上设置的属性,可以在构建中使用。播放列表是在Visual Studio 2012 Update 2中引入的,目前在MSBuild中不受支持。
有关测试类别的详细信息,请参阅:http://msdn.microsoft.com/en-us/library/dd286595.aspx