我想检查c#项目是基于NUnit还是基于MSTest。目前,我阅读了csproj的文件,并查找下面的特定字符串。
const string MSTEST_ELEMENT = "<TestProjectType>UnitTest</TestProjectType>";
const string NUNIT_ELEMENT = @"<Reference Include=""nunit.framework"">";
var file = File.ReadAllText("C:\myfile.csproj");
if (file.Contains(NUNIT_ELEMENT))
{
result = TestProjectType.NUnit;
}
else if (file.Contains(MSTEST_ELEMENT))
{
result = TestProjectType.MSTest;
}
它按照我的预期工作,但在文件中查找特定文本对我来说很难看。有更好的方法吗?
答案 0 :(得分:1)
您可以使用基于反射的方法 - 从测试项目加载DLL,获取其中的所有公共类型,并检查[TestClass]属性以指示它是否是MSTest等。
这个样本(有效但未经过实际测试)给出了一个例子。您可以通过在此代码的任何运行中引用测试属性类型来使其更好,这样您就可以进行正确的类型比较而不是字符串。
class Program
{
static void Main(string[] args)
{
var path = @"Path\To\Your\Test\Dll";
//load assembly:
var assembly = Assembly.LoadFile(path);
//get all public types:
var types = assembly.GetExportedTypes();
foreach (var t in types)
{
Console.WriteLine(t.Name);
//check for [TestClass] attribute:
var attributes = t.GetCustomAttributes();
foreach (var attr in attributes)
{
var typeName = attr.TypeId.ToString();
Console.WriteLine(attr.TypeId);
if (typeName== "Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute")
{
Console.WriteLine("It's MSTest");
}
else if (typeName == "Nunit.Tests.TestFixture") //not sure if that's the right type id :)
{
Console.WriteLine("It's NUnit");
}
else
{
Console.WriteLine("I Have no idea what it is");
}
}
}
Console.ReadLine();
}
}
答案 1 :(得分:0)
检查解决方案的dll参考&#34; NUnit.framework.dll&#34; 。对于NUnit,提供该DLL的引用是必要的。