假设您有一个包含NUnit测试的.dll文件,其中所有测试过程都具有[Test]
属性。
记录了一些测试,这意味着它们标有[Test, Description(...)]
。
我认为我可以使用PowerShell中的反射检索具有[Test]
属性和相关描述(如果有)的所有函数。
我试着看看能否在下面看到所说的属性:
$suite = [Reflection.Assembly]::ReflectionOnlyLoadFrom("D:\test_suite.dll")
[reflection.customattributedata]::GetCustomAttributes($suite)
但是我能看到的并没有显示出任何测试痕迹:
AttributeType Constructor ConstructorArguments NamedArguments
------------- ----------- -------------------- --------------
System.Runtime.InteropSer... Void .ctor(System.String) {"02cfdc16-5480-4bb6-890... {}
System.Diagnostics.Debugg... Void .ctor(DebuggingModes) {(System.Diagnostics.Deb... {}
System.Reflection.Assembl... Void .ctor(System.String) {"Copyright © Microsoft ... {}
System.Reflection.Assembl... Void .ctor(System.String) {"1.0.0.0"} {}
System.Runtime.InteropSer... Void .ctor(Boolean) {(Boolean)False} {}
System.Runtime.CompilerSe... Void .ctor(Int32) {(Int32)8} {}
System.Runtime.CompilerSe... Void .ctor() {} {WrapNonExceptionThrows ...
System.Reflection.Assembl... Void .ctor(System.String) {""} {}
System.Reflection.Assembl... Void .ctor(System.String) {"Test_Test_Suite"} {}
System.Reflection.Assembl... Void .ctor(System.String) {""} {}
System.Reflection.Assembl... Void .ctor(System.String) {""} {}
System.Reflection.Assembl... Void .ctor(System.String) {"Microsoft"} {}
System.Reflection.Assembl... Void .ctor(System.String) {"Test_Test_Suite"} {}
我显然走错了路。任何提示?
答案 0 :(得分:5)
问题是您正在寻找装配体上的属性,而不是装配体中的方法。
要做到这一点,只需获取程序集中的类型,然后获取它们的方法,然后过滤这些类型,只获取具有TestAttribute而不是DescriptionAttribute的方法。
因此,首先,只需获取您已经完成的程序集元数据:
$testSuite = [System.Reflection.Assembly]::ReflectionOnlyLoadFrom("c:\testsuite.dll")
然后获取程序集中可用的方法:
$methods = $testSuite.GetTypes().GetMethods()
如果有这些,请过滤掉具有TestAttribute的方法。你可能会以比这更好的方式确定TestAttribute的存在,例如给出你正在寻找或类似的确切属性名称,但我没有在我自己的样本中使用NUnit属性。
$testMethods = $methods |
Where {
$_.GetCustomAttributesData() |
Where { $_.AttributeType.FullName -like "*.TestAttribute" }
}
当你这样做的时候,只需从中选择你想要的数据(我也包括了DeclaringType,如果你不想在你的选择中删除它,只需删除它):
$testDocumentation = $testMethods |
Select DeclaringType, Name, @{
Name = "Description"
Expression = {
$descriptionAttribute = $_.GetCustomAttributesData() |
Where { $_.AttributeType.FullName -like "*.DescriptionAttribute"}
Write-Output $descriptionAttribute.ConstructorArguments[0].Value
}
}
如果您愿意,可以在一行中完成所有操作:
[Reflection.Assembly]::ReflectionOnlyLoadFrom("$pwd\ClassLibrary2.dll").GetTypes().GetMethods() |
Where { $_.GetCustomAttributesData() | Where { $_.AttributeType.FullName -like "*.TestAttribute" } } |
Select DeclaringType, Name, @{
Name = "Description"
Expression = {
$descriptionAttribute = $_.GetCustomAttributesData() |
Where { $_.AttributeType.FullName -like "*.DescriptionAttribute"}
Write-Output $descriptionAttribute.ConstructorArguments[0].Value
}
}
使用我的小测试组件,这导致以下输出:
DeclaringType Name Description
------------- ---- -----------
TestSuite.TestClass1 FirstTest This is the first test
TestSuite.TestClass1 SecondTest This is my second test
TestSuite.TestClass1 ThirdTest This is my third test