如何在MSTest中扩展TestClass,TestMethod和TestCleanup

时间:2019-09-16 13:08:38

标签: selenium exception mstest takesscreenshot

我正在使用Selenium和MSTest作为框架,我想扩展TestClassTestMethodTestCleanup。现在,测试来自TestBase类,该类定义如下:

[TestClass]
public class TestBase : IDisposable
{
    bool disposed = false;
    SafeHandle handle = new SafeFileHandle(IntPtr.Zero, true);


    public TestContext TestContext { get; set; }

    protected HelperSelenium SeleniumHelper { get; set; }

    [TestInitialize]
    public void TestInitBase()
    {
        SeleniumHelper = new HelperSelenium(TestContext);
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposed)
            return;

        if (disposing)
        {
            handle.Dispose();
            SeleniumHelper.GetWebDriver().Quit();
            // Free any other managed objects here.
            //
        }

        disposed = true;
    }
}

[TestClass]实例化TestContext,而[TestInitialize]实例化HelperSelenium并使用TestContext作为参数(这是必须告知Selenium取决于{{ 1}}属性。

我尝试使用此代码未成功:

TestContext

我想将[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)] public class SeleniumTestClass : TestClassAttribute { //Prueba para finalizacion de recursos bool disposed = false; /// <summary> /// Bandera para saber si se ha llamado a dispose e instanciacion de un Selfhandle /// </summary> SafeHandle handle = new SafeFileHandle(IntPtr.Zero, true); public TestContext TestContext { get; set; } public HelperSelenium SeleniumHelper { get; set; } #region Configuración Test [TestInitialize] public void TestInitBase() { SeleniumHelper = new HelperSelenium(TestContext); } public void Dispose() { //SeleniumHelper.GetWebDriver().Quit(); //SeleniumHelper.GetWebDriver().Dispose(); Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposed) return; if (disposing) { handle.Dispose(); SeleniumHelper.GetWebDriver().Quit(); // Free any other managed objects here. // } disposed = true; } 扩展到[TestClass],所以如果我在派生类中使用[SeleniumTestClass],所有这些将自动完成。我之所以尝试这样做是因为我们正在使用[SeleniumTestClass],即使在EventFiringWebDriver循环内也会抛出异常。硒可以通过两种方式引发异常:

  1. 已执行了引发异常的动作,但是 Wait.Until
  2. 捕获到异常
  3. 已执行操作 引发异常,并且该异常在 Wait.Until

因此,如果TestMethod失败,我将能够在捕获异常的同时截取屏幕截图。我认为Wait.Until无法继承,因此我不确定是否能够在TestCleanup

中捕获异常

我知道我可以将TestCleanupTestMethod分别包装在TestCleanup中,但是在我们拥有的每个测试以及将要创建的测试中,这样做都会很麻烦将来。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

尝试让抽象类调用新的OnTest方法:

[TestClass]
public abstract class TestBase 
{
    bool disposed = false;
    SafeHandle handle = new SafeFileHandle(IntPtr.Zero, true);


    public TestContext TestContext { get; set; }

    protected HelperSelenium SeleniumHelper { get; set; }

    [TestInitialize]
    public void TestInitBase()
    {
        SeleniumHelper = new HelperSelenium(TestContext);
    }

    public abstract void OnTest();

    [TestMethod()]
    public void SeleniumTest()
    {
        try
        {
            OnTest();
        }
        catch(Exception ex){
        }
    }
}