gpt4 book ai didi

powershell - 在 powershell 中检索 NUnit 自定义属性

转载 作者:行者123 更新时间:2023-12-03 16:47:18 25 4
gpt4 key购买 nike

假设您有一个包含 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"} {}

我显然走错了路。有什么提示吗?

最佳答案

问题是您要查找程序集的属性,而不是程序集中的方法。

为此,只需获取程序集中的类型及其方法,然后过滤这些类型以仅获取具有 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

关于powershell - 在 powershell 中检索 NUnit 自定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22789131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com