我正在使用Selenium自动化Web应用程序。我编写测试用例时没有对测试用例进行任何硬编码。由于GUI更改(例如页面标题更改),运行中存在许多无效的失败。我将页面标题验证移到了许多测试用例可以重复使用和调用的单独模块上,因此我不需要修复所有测试用例,而只需修复几个模块。

但是我可以看到有由于这些更改,我需要在最后一分钟内修复约10个模块。作为解决方案,我声明了这些GUI元素标识符并将其分配为config文件夹中文件中的全局变量,并将其在模块中重用。

我的问题是:有没有更好的方法来解决这个问题?既然有成千上万的工具,有没有什么工具可以有效地维护和组织这些全局变量?

我的解决方案的伪代码:
全局变量声明位于config文件夹中的单独文件中:

    public class globalVariable
    {
        public final String HOME_PAGETITLE = "Welcome to Home page";
        .........   
    }


调用它的模块:

    public class module
    {
        //Instantiate globalVariable class to use it's variables in module 
        globalVariable test = new globalVariable();

        @Test
        public void testHome()
        {
        //Call the global variable declared
        String strExpectedPageTitle=test.HOME_PAGETITLE;

        //Verify page title
        assertEquals(Selenium.getTitle(),strExpectedPageTitle);
        }
    }


#1 楼

是。 Page Object模式是一种很好的技术,它是通过将重用的逻辑提取到方法中而正朝着的逻辑结论。使用这种模式,您可以为UI中的每个页面创建一个模型。这些页面模型是程序中唯一不了解UI的部分。然后,如果主页标题更改,则只需更新HomePage对象上的GetTitle方法。测试永远不会直接访问标题对象,而只能通过HomePage对象上的方法。这将您需要为逻辑更改而更新的代码量限制为每次更改仅一个类,并且希望只有少数几种方法。请注意,如果您有一个母版页,则需要一个单独的Page对象。

您的Page对象还可以使用存储在文本配置文件中的配置值,该值在运行时读取字符串,因此,您无需仅因为标识符已更改而重新编译代码。当一次测试同一网页的两个版本时,这非常有用,因为两个版本之间的标识符可能已更改。

相同的技术适用于其他UI自动化语言;我现在在WatiN中使用这些技术。

#2 楼

听起来好像您在尝试避免自动化测试中的重复。这是一个好习惯,不仅在自动化方面,而且在一般的编程中都是要遵循的。 。

问问自己是否在正确的细节水平上进行测试。您正在检查的这数千个字符串(例如页面标题)是某种要求的结果,还是会随心所欲改变?以我的经验,就是后者。如果是这样,您希望通过检查这些值来完成什么?换句话说,如果自动化测试在字符串检查中失败,您将怎么办?如果您的回答是“我将更新测试以反映UI的变化”,则可能您的测试并非旨在查找错误。如果是这样,您可能会问自己自己的测试是否有帮助。

评论


感谢您的建议。我将页面标题验证合并到测试代码中,以检查页面是否正确加载。它还可以确保预期的页面可用并可以进行测试。在最后一分钟,我们没有时间检查他们为什么更改页面标题。可能是出于商业原因。最终用户不希望总是看到相同的页面标题,而是希望看到不同的内容

– Aruna
2011年7月7日在2:16

#3 楼

测试的目的是验证“页面标题”还是要使用页面标题来验证状态?

如果要验证页面标题匹配,那么我会说自动化甚至不是最佳解决方案是否有很多要验证的“页面标题”。

如果目的是验证状态(例如同步测试),那么您可以考虑进行部分字符串匹配,而不是尝试匹配整个字符串。 (例如,在C#string.Compare()中),但是,您仍然可能会遇到意外的误报。另外,如果您还需要在本地化版本上运行这些测试,那么这种方法也将成为噩梦。通过资源ID归档文件,并与适当的字符串进行比较。

#4 楼

我的一般建议会有所不同,但是在这种情况下,我可能会将内容移动到包含三列的数据库表中:PageName,PageURL和PageTitle。然后,我将构建一些匹配的代码来查找当前页面的url,然后检查标题。然后,代码变为

assertTrue(Verification.PageTitleIsCorrect());


您的代码本质上仍是硬编码,因为您仍然在代码中的很多地方都保留了test.HOME_PAGETITLE,您希望将其最小化。从本质上讲,使您的代码可以算出需要自己验证的内容。

评论


同意在许多地方使用test.HOME_PAGETITLE是一个缺点。感谢您指出。恐怕从数据库中检索页面标题可能会使测试用例变慢,并且由于数据库连接而导致开销。请让我知道您对此的想法。

– Aruna
2011年7月7日在2:18

为此,数据库查找足够快,特别是相对于加载还必须执行一个或多个数据库查询的网页而言。

–user246
2011年7月7日在13:19

如果您使用SQLite,则全部存储在内存中且快速

–布鲁斯·麦克劳德(Bruce McLeod)
2011年7月7日在21:09

是的,但是我发现在Spring XML甚至Java / C#类中维护配置比在DB中维护测试数据更容易。

– dzieciou
16-2-28在21:54