C# 查找解决方案中的所有测试

C# Find all tests in a solution

是否有任何技术可以用来在解决方案中找到所有被注释为测试的测试([TestMethod][Fact][Theory]...)?

上下文: 我对这一切都很陌生,但试图制定一个持续部署策略。我想找到 运行 解决方案中的所有测试 during/following 一个发布过程。 这些不是依赖于构建的单元测试,它们是端到端解决方案测试的一部分。

如果我的想法偏离了正确的轨道,请告诉我。

你打算使用什么样的技术?不确定我是否完全理解您的要求,但如果您打算使用 .NET 单元测试,您可以在这里查看:https://docs.microsoft.com/en-us/visualstudio/test/getting-started-with-unit-testing

或者您也可以使用著名的 NUnit,

因此,如果您想要一个仅使用 TestAttribute 收集方法的工具,Visual Studio 已内置该工具。它是测试资源管理器,它检查解决方案中的程序集并根据属性挖掘出测试,然后让你 运行 他们。它在某些版本的 VS 中可用(我使用 Professional,它有);不过,我不确定具体是哪些。

通常为此目的编写的应用程序是可行的方法。但是,您可以自己扫描程序集以查找这些属性。在这里并不是真的有必要——正如我所说,这里有可以做到这一点的测试工具,像 VSTS 之类的东西将帮助你集成到部署过程中——但既然你提到你是所有这些的新手,我会把它留在这里,作为你将来可能需要或不需要使用的东西。如果不出意外,你可以把它改编成别的东西。

基本上,您可以使用反射来获取您的程序集、类、方法等,并且您可以获得装饰它们的属性。你会这样做:

[TestClass]
public class AttributeFinder
{
    [TestMethod]
    public void MyTestMethod()
    {
        // Do something
    }

    public static void FindAttributes()
    {
        var assembly = Assembly.GetAssembly(typeof(AttributeFinder));
        var types = assembly.GetTypes();
        foreach (var t in types)
        {
            var typeAttr = t.GetCustomAttribute(typeof(TestClassAttribute));
            if (typeAttr != null)
            {
                // Your class has a TestClass attribute on it!
            }

            var methods = t.GetMethods();
            foreach (var m in methods)
            {
                var methodAttr = m.GetCustomAttribute(typeof(TestMethodAttribute));
                if (methodAttr != null) 
                {
                    // This method has the TestMethod attribute!
                }
            }
        }
    }
}

同样,有一些工具可以自动为您执行此操作,并且 QHero 为您提供了一些链接。我在这里介绍的是很长的路要走,并且需要您编写自己的工具,而这对于现有的东西来说并不是必需的。但是反射是一种需要了解的便捷技术,这可能有助于在测试工具之外生成一份报告,列出您的测试 methods/classes 或其他内容。