关于页面对象模型模式的设计问题
Design concerns about Page Object Model Pattern
我想知道我们处理 POM 的方法是否有问题。在互联网上的许多示例中,我发现这种模式的使用方式使您的测试脚本看起来像这样:
pageObject.doSomethingWithElement(parameters...)
对我们来说,这样做更自然:
pageObject.element.doSomething(parameters...)
所以我们不需要实现可以用页面中的元素完成的操作 class,而只需在测试脚本中定义这些操作即可。出于某种原因,我们感觉更自然,类似于
System.out.println()
System.err.println()
而不是
System.printlnOut()
System.printlnErr()
我们是否遗漏了我们方法的一些缺点?
在这 2 个模型之间进行选择时没有优势或劣势。但我认为你对推荐的方法有点误解。这个想法不是pageObject.doSomethingWithElement
,而是用页面的功能做一些事情,pageObject.doSomething
如果你愿意的话。
例如,如果您查看 Selenium examples,第一个例子是 public HomePage loginAs(String username, String password)
。此功能中的任何内容都与元素无关,它与页面的功能有关,可以轻松地口头表达,而无需参考所涉及的元素。我可以将此功能理解为:当用户在登录页面上时,用户提供用户名和密码,成功登录后,用户将被重定向到主页。哪一种提供了页面模型的自然 BDD 解释。
这种方法的优点是您的测试更具可读性。而不是像:
loginPage.username.setValue(...)
loginPage.password.setValue(...)
loginPage.loginButton.submit()
// how do I get a homepage from here?
这个型号允许有
HomePage homePage = loginPage.loginAs(...)
完成!
同样从维护的角度来看:如果开发人员更改登录页面上的元素,那么处理登录功能的 20 个测试可能很重要。但是您想要其他 980 测试,您必须完全不受它们更改的影响,因为它们只在测试功能的其他部分的过程中使用登录。因此,只要登录本身继续正常工作,他们就可以完全忽略登录元素的变化。
所以我认为选择不是在你的页面表达元素相关功能的各种方式之间,而是你的页面是否应该表达元素,或者专注于它提供的功能,而不考虑元素。
我建议阅读我在此处引用的那个页面,它很好地了解了页面模型的全部内容。
我想知道我们处理 POM 的方法是否有问题。在互联网上的许多示例中,我发现这种模式的使用方式使您的测试脚本看起来像这样:
pageObject.doSomethingWithElement(parameters...)
对我们来说,这样做更自然:
pageObject.element.doSomething(parameters...)
所以我们不需要实现可以用页面中的元素完成的操作 class,而只需在测试脚本中定义这些操作即可。出于某种原因,我们感觉更自然,类似于
System.out.println()
System.err.println()
而不是
System.printlnOut()
System.printlnErr()
我们是否遗漏了我们方法的一些缺点?
在这 2 个模型之间进行选择时没有优势或劣势。但我认为你对推荐的方法有点误解。这个想法不是pageObject.doSomethingWithElement
,而是用页面的功能做一些事情,pageObject.doSomething
如果你愿意的话。
例如,如果您查看 Selenium examples,第一个例子是 public HomePage loginAs(String username, String password)
。此功能中的任何内容都与元素无关,它与页面的功能有关,可以轻松地口头表达,而无需参考所涉及的元素。我可以将此功能理解为:当用户在登录页面上时,用户提供用户名和密码,成功登录后,用户将被重定向到主页。哪一种提供了页面模型的自然 BDD 解释。
这种方法的优点是您的测试更具可读性。而不是像:
loginPage.username.setValue(...)
loginPage.password.setValue(...)
loginPage.loginButton.submit()
// how do I get a homepage from here?
这个型号允许有
HomePage homePage = loginPage.loginAs(...)
完成!
同样从维护的角度来看:如果开发人员更改登录页面上的元素,那么处理登录功能的 20 个测试可能很重要。但是您想要其他 980 测试,您必须完全不受它们更改的影响,因为它们只在测试功能的其他部分的过程中使用登录。因此,只要登录本身继续正常工作,他们就可以完全忽略登录元素的变化。
所以我认为选择不是在你的页面表达元素相关功能的各种方式之间,而是你的页面是否应该表达元素,或者专注于它提供的功能,而不考虑元素。
我建议阅读我在此处引用的那个页面,它很好地了解了页面模型的全部内容。