我有一个提供某种搜索的应用程序页面,它会将搜索结果项列表返回给用户。 所以我的测试初始登录到应用程序,然后在主页上开始搜索:
HomePage homePage = loginPage.login();
homePage.searchFor(items);
测试搜索结果的最佳实践方法包含设计方面的预期列表项?
我可以添加返回结果项的方法到Page对象,然后我可以在测试类上用它们做任何我想做的事。
public void someTest(List<Items> expectedResultItems) {
...
HomePage homePage = loginPage.login();
homePage.searchFor(items);
List<Item> resultItems = homePage.getItems();
Util.compareItems(resultItems, expectedResultItems);
}
我可以将比较方法添加到页面对象本身。
public void someTest(List<Items> expectedResultItems) {
...
HomePage homePage = loginPage.login();
homePage.searchFor(items);
homePage.compareItems(List<Item expectedItems);
}
答案 0 :(得分:0)
页面对象的设计方式有很多灵活性, 但是有一些基本的规则来获得所需的 您的测试代码的可维护性。页面对象本身应该 永远不要进行验证或断言。这是您测试的一部分 并且应始终位于测试代码中,永远不应位于页面对象中。 页面对象将包含页面的表示,以及 页面提供的服务是通过方法提供的,但没有与之相关的代码 正在测试的应该在页面对象中。
因此,根据此指南,请使用第一个指南。在测试中使用断言而不是将其隐藏在页面对象中的某个位置会使您的测试更容易阅读并理解它正在做什么。
话虽这么说,我个人倾向于使用第二种方法,这主要是因为我有点像这样开始,现在我已经习惯了。所以我基本上只在页面对象中有一个类似于public void validateSearchResults(List<?> expected) ...
的公共方法,我对它进行单独调用。这意味着我不会编写像getSearchDataAndValidate(List<?> expected)
这样的链式方法,它们也会调用validate方法。所以我可以单独使用它们,如果我需要在另一个测试中,我可以重复使用搜索方法而不进行实际验证。您可能会质疑为什么不每次都验证您的列表,但如果您的测试套件变大,它可能会在性能方面适得其反。