0

我正在使用 Selenium 和 MSTest 作为框架,我想扩展TestClass,TestMethodTestCleanup. 现在测试是从一个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]化 HelperSeleniumTestContext作为参数(这对于告诉 Selenium 它应该根据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内也会抛出异常。Wait.UntilSelenium 可以通过两种方式抛出异常:

  1. 执行了引发异常的操作,但异常被Wait.Until
  2. 执行了引发异常的操作,并且异常在 Wait.Until

因此,如果 TestMethod 失败,我将能够在捕获异常时截取屏幕截图。我认为TestCleanup不能被继承,所以我不确定我是否能够在TestCleanup

我知道我可以将TestMethodTestCleanup每个都包含在一个中,try-catch但是在我们拥有的每个测试以及我们将来要创建的测试中这样做会很麻烦。

任何帮助表示赞赏。

4

1 回答 1

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){
        }
    }
}
于 2019-09-18T13:37:56.163 回答