我想检查所选项目(我有源代码)是否是以下框架之一的TestProject:NUnit,MSTest,xUnit。
对于MSTest来说很简单。我可以检查.csproj和标签。如果我有{3AC096D0-A1C2-E12C-1390-A8335801FDAB},那就意味着它是测试项目。
问题是NUnit和xUnit。我可以在.csproj中查看此案例引用。如果我有nunit.framework或xunit,那将是显而易见的。但我想知道是否有可能以不同的方式检查这一点。
您是否知道识别测试项目的不同方式?
答案 0 :(得分:2)
其中一种方法是检查程序集是否包含测试方法。测试方法的属性如下:
[Test]
[TestMethod]
[Fact]
迭代程序集并检查程序集是否包含带有测试方法的类。示例代码:
bool IsAssemblyWithTests(Assembly assembly)
{
var testMethodTypes = new[]
{
typeof(Xunit.FactAttribute),
typeof(NUnit.Framework.TestAttribute),
typeof(Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute)
};
foreach (var type in assembly.GetTypes())
{
if (HasAttribute(type, testMethodTypes)) return true;
}
return false;
}
bool HasAttribute(Type type, IEnumerable<Type> testMethodTypes)
{
foreach (Type testMethodType in testMethodTypes)
{
if (type.GetMethods().Any(x => x.GetCustomAttributes(testMethodType, true).Any())) return true;
}
return false;
}
您还可以添加更多假设:
修改强>
如果您需要使用C#Parser,这里有一个NRefactory代码示例,用于检查.cs文件是否包含带有测试的类:
string[] testAttributes = new[]
{
"TestMethod", "TestMethodAttribute", // MSTest
"Fact", "FactAttribute", // Xunit
"Test", "TestAttribute", // NUnit
};
bool ContainsTests(IEnumerable<TypeDeclaration> typeDeclarations)
{
foreach (TypeDeclaration typeDeclaration in typeDeclarations)
{
foreach (EntityDeclaration method in typeDeclaration.Members.Where(x => x.EntityType == EntityType.Method))
{
foreach (AttributeSection attributeSection in method.Attributes)
{
foreach (Attribute atrribute in attributeSection.Attributes)
{
var typeStr = atrribute.Type.ToString();
if (testAttributes.Contains(typeStr)) return true;
}
}
}
}
return false;
}
NRefactory .cs文件解析示例:
var stream = new StreamReader("Class1.cs").ReadToEnd();
var syntaxTree = new CSharpParser().Parse(stream);
IEnumerable<TypeDeclaration> classes = syntaxTree.DescendantsAndSelf.OfType<TypeDeclaration>();
答案 1 :(得分:1)
我会寻找表示每个框架的属性的用法,以查看哪个是。
使用反射查找具有适当属性类型的类/方法(例如Test/TestFixture
)
这个答案有一个例子,您可以修改以满足您的需求: