我有一个测试设置,我用属性装饰测试,告诉测试是否可以在某些情况下运行。在我的代码中,我想检查测试方法是否具有某个属性。这可以实现吗?
我的测试看起来像这样:
[TestClass, ParallelSeleniumTest, ExcludeFromCodeCoverage]
public class ExportIncident : ViewTest
{
[TestMethod, TestCategory("ExcludeFromBuildServer"), SupportedBrowsers(Browser.FireFox)]
public void Export()
{
...
}
}
在我想要断言SupportedBrowserAttribute
值的地方,我的代码看起来像这样:
internal static RemoteWebDriver CreateDriver()
{
// ReSharper disable HeuristicUnreachableCode
switch (TestRunSettings.BrowserToUse)
{
case Browser.Firefox:
return CreateFirefoxDriver();
case Browser.Chrome:
return CreateChromeDriver();
default:
throw new ArgumentOutOfRangeException();
}
}
BrowserToUse
是文件中的常量。
CreateDriver
构造函数调用 ViewTest
:
public abstract class ViewTest : WebTest
{
protected ViewTest()
{
Driver = SeleniumManager.CreateDriver();
}
public RemoteWebDriver Driver { get; set; }
}
答案 0 :(得分:0)
您可以像这样爬行堆栈帧:
MethodBase testMethod = null;
int framesSkipped = 0;
do
{
testMethod = (new StackFrame(framesSkipped++)).GetMethod();
} while (!testMethod.GetCustomAttributes(typeof(TestMethodAttribute), false).Any());
SupportBrowserAttribute sba = testMethod.GetCustomAttributes(typeof(SupportBrowserAttribute)).
FirstOrDefault() as SupportBrowserAttribute;
所以我上去了堆栈,直到找到一个具有TestMethod
属性的方法。然后我尝试获取SupportBrowser
属性。
如果测试方法没有这样的属性,sba
将为null
。否则,您可以阅读它的属性并在switch
中使用它们。
答案 1 :(得分:-1)
我使用类属性解决了它(不完美):
[TestClass, ParallelSeleniumTest, ExcludeFromCodeCoverage, SupportedBrowsers(Browser.FireFox)]
public class ExportIncident : ViewTest
{
[TestMethod, TestCategory("ExcludeFromBuildServer")]
public void Export()
{
...
}
}
在ViewTest
我做:
public abstract class ViewTest : WebTest
{
private RemoteWebDriver _driver;
protected ViewTest()
{
Driver = SeleniumManager.CreateDriver();
}
public RemoteWebDriver Driver
{
get { return _driver; }
set
{
var attribute = GetType().GetCustomAttribute<OnlySupportsBrowsersAttribute>();
if (attribute != null && !attribute.Browsers.Any(x => x == TestRunSettings.BrowserToUse))
{
Assert.Inconclusive($"Browser {TestRunSettings.BrowserToUse} is not supported by this test");
}
_driver = value;
}
}
}