如何在不重复工作的情况下使用跨多个框架(互联网浏览器)的自动化集成测试



为了提供更多细节,我们有一系列测试,我们希望在三个框架(使用Selenium进行UI刺激)中进行复制:IE、Mozilla和Chrome。第一种解决方案是在单独的测试类中复制测试,即每个测试类都有相同的20个测试用例,构造函数中有不同的框架。第二种解决方案是使用参数化输入(或XUnit理论),将每个框架类型作为输入:

    /// <summary>
    /// The non-default constructor that initializes
    /// necessary instances of objects that are being used
    /// </summary>
    public VerifyViewUsingChrome() {
        _testBases = new Dictionary<FunctionalTestBase.DriverType, TestBase>();
        _testBases.Add(FunctionalTestBase.DriverType.Chrome, new TestBase(FunctionalTestBase.DriverType.Chrome));
        _testBases.Add(FunctionalTestBase.DriverType.IE, new TestBase(FunctionalTestBase.DriverType.IE));
        _testBases.Add(FunctionalTestBase.DriverType.FireFox, new TestBase(FunctionalTestBase.DriverType.FireFox));
    }

    /// <summary>
    /// Our simple country display test.
    /// </summary>
    [InlineData(FunctionalTestBase.DriverType.Chrome)]
    [InlineData(FunctionalTestBase.DriverType.FireFox)]
    [InlineData(FunctionalTestBase.DriverType.IE)]
    [Theory]
    public void TestADisplayedForACountry(FunctionalTestBase.DriverType testBase) {
        _testBases[testBase].TestADisplayedForACountry();
    }

这个实现的问题是,每个测试都必须运行所有3个实现,这需要一些开销。理想情况下,我们会运行所有的IE测试,然后构建Firefox框架并运行这些测试,然后再继续使用Chrome。

使用测试框架可能是不可能的,但由于我们与构建服务器有方便的连接,因此保持测试格式将是理想的。

我刚刚意识到这个解决方案比我想象的要简单。构造函数在每次测试之前都会被调用,因此无论测试是如何运行的,框架的启动和撕裂都会发生(这是有道理的,因为你不想从以前的测试中流血)。

以下是我们决定做的:

    /// <summary>
    /// The non-default constructor that initializes
    /// necessary instances of objects that are being used
    /// </summary>
    public VerifyViewUsing() { }

    /// <summary>
    /// Our simple country display test.
    /// </summary>
    [InlineData(FunctionalTestBase.DriverType.Chrome)]
    [InlineData(FunctionalTestBase.DriverType.FireFox)]
    [InlineData(FunctionalTestBase.DriverType.IE)]
    [Theory]
    public void TestADisplayedForACountry(FunctionalTestBase.DriverType testBaseType) {
        TestBase testBase = new TestBase(testBaseType);
        testBase.TestADisplayedForACountry();
    }

这几乎正是我们想要的。每个测试都是独立的,在各个框架之间重复,并且运行时将结果链接到所使用的框架。

编辑:一个实际更好的方法是:

   public static IEnumerable<object[]> DriverTypes {
        get {
            // Or this could read from a file. :)
            return new[]
            {
                new object[] {  FunctionalTestBase.DriverType.Chrome },
                new object[] {  FunctionalTestBase.DriverType.IE},
                new object[] {  FunctionalTestBase.DriverType.FireFox}
            };
        }
    }
    /// <summary>
    /// Verifies that Brucellosis is displayed in the Disease List for
    /// Zimbabwe
    /// </summary>
    [Theory, MemberData("DriverTypes")]
    public void TestClickingADiseaseLinkDisplaysACreatePage(FunctionalTestBase.DriverType testBaseType) {
        TestBase testBase = new TestBase(testBaseType);
        testBase.TestClickingADiseaseLinkDisplaysACreatePage();
    }

这允许您一次性定义框架,并在整个项目中使用它们。

最新更新