截取测试失败+例外

时间:2015-10-24 17:04:32

标签: c# .net unit-testing selenium nunit

你们中是否有人知道在测试失败和例外情况下截图的可能解决方案?

我在TearDown()中添加了以下代码,但因此它也会对通过的测试进行截图,因此它不是最佳解决方案:

DateTime time = DateTime.Now;
string dateToday = "_date_" + time.ToString("yyyy-MM-dd") + "_time_" + time.ToString("HH-mm-ss");
Screenshot screenshot = ((ITakesScreenshot)driver).GetScreenshot();
screenshot.SaveAsFile((settings.filePathForScreenShots + "Exception" + dateToday + ".png"), System.Drawing.Imaging.ImageFormat.Png);

我已经找到了这个想法:http://yizeng.me/2014/02/08/take-a-screenshot-on-exception-with-selenium-csharp-eventfiringwebdriver/,使用WebDriverExceptionEventArgs,但由于某些原因,它也会在没有任何合理解释的情况下制作一些随机屏幕截图。

我发现的其他想法是针对Java的,而不是我用于Selenium的NUnit,所以它们都没用。

5 个答案:

答案 0 :(得分:12)

如果你将截图逻辑放在你的TearDown方法中,它将在每次测试完成后被调用,无论它是成功还是失败。

我使用的基类具有包装测试并捕获所有异常的函数。当测试失败时,将捕获异常并截取屏幕截图。

我将这个基类用于我的所有Selenium测试,它看起来像这样:

public class PageTestBase
{
    protected IWebDriver Driver;

    protected void UITest(Action action)
    {
        try
        {
            action();
        }
        catch (Exception ex)
        {
            var screenshot = Driver.TakeScreenshot();

            var filePath = "<some appropriate file path goes here>";

            screenshot.SaveAsFile(filePath, ImageFormat.Png);

            // This would be a good place to log the exception message and
            // save together with the screenshot

            throw;
        }
    }
}

测试类看起来像这样:

[TestFixture]
public class FooBarTests : PageTestBase
{
    // Make sure to initialize the driver in the constructor or SetUp method,
    // depending on your preferences

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

    [TearDown]
    public void TearDown()
    {
        // Close and dispose the driver
    }
}

答案 1 :(得分:10)

在C#中我使用NUnit 3.4。这提供了能够访问OneTimeTearDown的{​​{1}}方法,包括先前执行的测试的状态。不要使用TestContext因为它在测试失败后没有执行;)

TearDown

答案 2 :(得分:1)

你可以在TestNG套件FIle中轻松实现这一点 创建类似于

的ScreenShot方法
public static void CaptureDesktop (String imgpath)
    {
        try
        {

            Robot robot = new Robot();
            Dimension screensize=Toolkit.getDefaultToolkit().getScreenSize();
            Rectangle screenRect = new Rectangle(screensize);
            BufferedImage screenshot = robot.createScreenCapture(screenRect);
            //RenderedImage screenshot = robot.createScreenCapture(screenRect);
        ImageIO.write(screenshot, "png" , new File(imgpath));

        }

在上面的方法中我使用了机器人类,你可以拍摄 Dekstop(窗口+网页)的屏幕截图,你可以在不同的 Listener 类中调用这个方法。将实现 ITestListener接口。在该监听器类的 OntestFailure()中调用您的屏幕Shot方法

@Override
    public void onTestFailure(ITestResult arg0) {


        String methodname = arg0.getMethod().getMethodName();
        String imgpath = "./Screenshot/"+methodname+".jpg";
        Guru99TakeScreenshot.CaptureDesktop(imgpath);

    }

这段代码对我有用。但是这段代码是用JAVA编写的。我希望这可以在C#中工作,如果不是我希望这段代码可以帮助你

答案 3 :(得分:1)

为了更加公正,这里是MSTest的代码

public TestContext TestContext { get; set; }

[TestCleanup]
public void TestCleanup()
{
  if (TestContext.CurrentTestOutcome == UnitTestOutcome.Failed)
  {
    var screenshotPath = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss.fffff}.png";
    MyDriverInstance.TakeScreenshot().SaveAsFile(screenshotPath);
    TestContext.AddResultFile(screenshotPath);
  }
}

答案 4 :(得分:0)

自定义一点ExtentReport可以提供非常有用的报告,该报告具有在测试失败时准确捕获的异常+屏幕截图。屏幕截图可以放置在异常旁边,用户可以使用该异常来了解发生错误时网站在做什么。

报告示例

enter image description here

测试

    @Test (enabled=true)                           
public void verifySearch() {
    extentlogger = extent.createTest("To verify verifySearch");
    //Your other code here.....
    soft.assertEquals("xxx", "xxxx");
    soft.assertAll();
   }

AfterMethod

     @AfterMethod
public void getResult(ITestResult result) throws Exception{
    if(result.getStatus() == ITestResult.FAILURE)
    {
        extentlogger.log(Status.FAIL, MarkupHelper.createLabel(result.getThrowable() + " - Test Case Failed", ExtentColor.RED));
        
        try {
     // get path of captured screenshot using custom failedTCTakeScreenshot method
            String screenshotPath = failedTCTakeScreenshot( result);
            extentlogger.fail("Test Case Failed Snapshot is below " + extentlogger.addScreenCaptureFromPath(screenshotPath));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}