0

我正在使用 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

我看了这篇文章,但它对我没有帮助。

4

4 回答 4

1

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

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

于 2012-11-05T18:21:12.673 回答
0

是的,因为您的测试不会调用测试拆解。测试运行程序调用您的测试用例,然后依次关闭测试。换句话说,您的测试用例方法调用与拆解位于堆栈跟踪的不同分支中。

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

于 2012-11-05T17:42:08.760 回答
0

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

于 2012-11-05T17:42:26.817 回答
0

您可以只使用一个私有方法来保存您在每次测试结束时调用的屏幕截图,而不是让它在测试中拆除。然后您的堆栈跟踪将包含您所期望的测试用例方法。

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

于 2012-11-05T17:52:59.410 回答