【问题标题】:How do I take a screenshot when there's an AssertionException? (Xamarin.UITest, C#)出现 AssertionException 时如何截屏? (Xamarin.UITest,C#)
【发布时间】:2020-01-13 02:56:31
【问题描述】:

我已经构建了一个 Xamarin.UITest 套件,并且正在真正的 Android 设备上进行本地测试。我注意到一两个测试失败了,但不一定是相同的测试。每当我尝试重新运行此类测试以查看它们失败的原因时,它们都会通过!因此,我需要添加功能以查看测试失败时屏幕上的内容。我似乎无法找到专门针对此的指南 - 只是零碎的......

我已将 EnableLocalScreenshots() 添加到我的 StartApp() 调用中,但我不确定接下来的步骤。所以我有一些问题:

  1. 我需要指定截屏的保存位置,还是自动完成?

  2. 当出现 AssertionException 时,我是否需要显式编写代码来截取屏幕截图,或者这是屏幕截图功能默认执行的操作?

  3. 如果我需要编写代码在出现 AssertionException 时截取屏幕截图,请您指出此代码的示例,以便我可以将其添加到我的套件中?

谢谢

编辑:回复:Take screenshot on test failure + exceptions

我在我的 Hooks.cs 文件中尝试了以下内容:

[OneTimeTearDown]
public void OneTimeTearDown()
{
    if (TestContext.CurrentContext.Result.Outcome == ResultState.Error || TestContext.CurrentContext.Result.Outcome == ResultState.Failure)
    {
        App.Screenshot(TestContext.CurrentContext.Test.Name);
    }
}

在调试这个方法时,我发现它从来没有被调用过。即使我使用 TearDown 和 AfterScenario 属性也不行。太好了——Intellisense 喜欢我的代码,很糟糕——因为它永远不会被调用。应该没那么难!

我在这个套件中使用 Specflow,这可能与我遇到此问题的原因有关吗?这就是为什么我无法在上述线程上实现解决方案如下,因为 Specflow 管理 NUnit 测试......

UITest(() =>
{
    // Do your test steps here, including asserts etc.
    // Any exceptions will be caught by the base class
    // and screenshots will be taken
});

【问题讨论】:

标签: c# assertion xamarin.uitest


【解决方案1】:

好的,对我来说这就是答案。

在类上方添加 [Binding] 属性(我的愚蠢错误)...

[Binding]
    class TestInitialise : BasePage

在我的截图方法上方添加[AfterScenario()],并使其成为静态方法...

[AfterScenario()]
public static void TakeScreenshot()

指定保存屏幕截图的位置...

App.Screenshot(TestContext.CurrentContext.Test.Name).CopyTo(@"C:\Users\me\Desktop\" + TestContext.CurrentContext.Test.Name + ".png");

所以我猜 App.Screenshot(string title) 只是截取屏幕截图并将其保存在内存中,但您实际上需要将其明确保存在某个地方才能获取它,而不是假设它只是保存到默认位置。

那就这样吧!

【讨论】:

  • 发现其实截图也保存到了C:\Users\me\AppData\Local\Temp,这个要注意。
  • 使用 .MoveTo 而不是 .CopyTo
猜你喜欢
  • 2020-01-25
  • 2017-10-03
  • 2020-05-12
  • 1970-01-01
  • 2020-05-05
  • 2012-05-04
  • 2016-10-03
  • 2016-01-14
  • 1970-01-01
相关资源
最近更新 更多