【问题标题】:Is there a better way to check if a project is NUnit or MSTest based?有没有更好的方法来检查项目是基于 NUnit 还是基于 MSTest?
【发布时间】:2014-08-07 04:46:51
【问题描述】:

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

它按我的预期工作,但在文件中查找特定文本对我来说很难看。有没有更好的方法来做到这一点?

【问题讨论】:

  • 为什么不能将 XML 读取为 XML?如果两者都存在怎么办?
  • 因为读入 XML 比读成纯文本要慢。
  • @匿名读取XML是可靠的,搜索字符串不是。
  • @peer 你能举个例子说明读取文件内容和搜索字符串值不可靠吗?

标签: c# .net unit-testing nunit mstest


【解决方案1】:

检查 dll 参考 "NUnit.framework.dll" 的解决方案。对于 NUnit,需要提供该 dll 的引用。

【讨论】:

    【解决方案2】:

    您可以使用基于反射的方法 - 从测试项目加载 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();
    
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2011-10-17
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      相关资源
      最近更新 更多