如何获取父方法名称?

时间:2012-11-05 17:36:53

标签: c# reflection nunit

我正在使用NUnit和Selenium WebDriver编写Web测试。 在每次测试结束时,我想获得浏览器的屏幕截图并保存图像。 我希望图片名称与Test名称相同。 但是我无法获得测试方法名称。

以下是测试方法:

[Test]
public void AbcTest_ShouldPass()
{
    Assert.AreEqual(true, true);
}

这是在TearDown之后运行的Test

[TearDonw]
[MethodImpl(MethoImplOptions.NoInlining)]
public void TestCleanupNunit()
{
    var methodName = new List<string>();
    for (int i = 0; i < 30; i++)
        methodName.Add(i.ToString() + " is " + new StackTrace(i, true).GetFrame(0).GetMethod().Name);

}

但是当我查看methodName时,我找不到AbcTest_ShouldPass

0 is TestCleanupNUnit
1 is InvokeMethod
2 is UnsafeInvokeInternal
3 is Invoke
4 is Invoke
5 is InvokeMethod
6 is InvokeMethod
7 is RunTearDown
8 is RunTest
9 is RunTest
10 is RunRepeatedTest
11 is RunTestInContext
12 is Run
13 is RunAllTests
14 is RunSuite
15 is RunSuiteInContext
16 is Run
17 is Run
18 is RunAllTests
19 is RunSuite
20 is RunSuiteInContext
21 is Run
22 is RunAllTests
23 is RunSuite
24 is RunSuiteInContext
25 is Run
26 is RunAllTests
27 is RunSuite
28 is RunSuiteInContext
29 is Run

我看了这个post,但它对我没有帮助。

4 个答案:

答案 0 :(得分:1)

Nunit Framework提供了CurrentContext,它是NUnit.Framework.TestContext的成员。

TestContext.CurrentContext.Test.Name将返回正在执行的测试的名称,TestContext.CurrentContext.Test.FullName将从名称空间的名称返回完全限定名称。

答案 1 :(得分:0)

是的,因为您的测试没有调用测试拆解。测试运行器调用您的测试用例,然后依次将测试拆除。换句话说,您的测试用例方法调用位于堆栈跟踪的不同分支中,而不是拆除。

您需要在某个地方的测试夹具中缓存方法的名称。也许是私有成员变量,并在每个测试用例的方法中设置该变量。这不是很优雅,但这是我现在想到的唯一方式。

答案 2 :(得分:0)

不幸的是,单元测试的Setup和Teardown方法不是作为同步调用堆栈的一部分运行,而是由测试引擎处理。因此,从Teardown方法观察到的callstack将不包含作为测试的一部分运行的方法。

答案 3 :(得分:0)

您可以使用私有方法保存在每次测试结束时调用的屏幕截图,而不是将其放入测试中。然后您的堆栈跟踪将包含您期望的测试用例方法。

我同意这种方法并不完美,因为你必须记住将它添加到每个测试用例中,但至少它是通用的,并且不涉及硬编码字符串中的方法名称。