是否有更好的方法来检查一个项目是基于NUnit还是基于mest

本文关键字:项目 一个 mest NUnit 更好 方法 检查 是否 | 更新日期: 2023-09-27 18:16:48

我想检查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;
}

它像我预期的那样工作,但在文件中寻找特定的文本对我来说是丑陋的。有更好的方法吗?

是否有更好的方法来检查一个项目是基于NUnit还是基于mest

检查dll引用"NUnit.framework.dll"的解决方案。对于NUnit,必须提供该dll的引用。

您可以使用基于反射的方法-从测试项目中加载DLL,获取其中的所有公共类型,并检查[TestClass]属性以指示它是否为MSTest,等等。

这个例子(工作,但没有真正测试)给出了一个例子。您可以通过在运行此代码的任何代码中引用test属性类型来使它更好,这样您就可以进行适当的类型比较,而不是字符串。

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();
        }
    }
相关文章: