在我们的一项测试中,我们有以下一系列期望:
expect(headerPage.dashboard.isDisplayed()).toBe(true);
expect(headerPage.queue.isDisplayed()).toBe(true);
expect(headerPage.claimSearch.isDisplayed()).toBe(true);
expect(headerPage.claim.isDisplayed()).toBe(true);
expect(headerPage.case.isDisplayed()).toBe(true);
expect(headerPage.calendar.isDisplayed()).toBe(true);
一方面,有多个简单的期望提供了更精确和可理解的反馈,但另一方面,这看起来像它 违反DRY原则 和 “每次测试一个期望” 通常可以接受的准则。
有没有办法将其转换/简化为单一预期?
headerPage
是一个页面对象, dashboard
和其他页面对象字段是导航链接。
我认为你误解了“每次测试期望”指南的目的。关键不在于将一堆期望结合到一个单一的期望中,而是将您的期望分成单独的测试。
要遵循该指南的精神,您可以像这样编写测试:
describe("The header page", function () {
var headerPage;
beforeEach(function () {
//Common logic here
});
it("displays the dashboard", function () {
expect(headerPage.dashboard.isDisplayed()).toBe(true);
});
it("displays the queue", function () {
expect(headerPage.queue.isDisplayed()).toBe(true);
});
it("displays the claimSearch", function () {
expect(headerPage.claimSearch.isDisplayed()).toBe(true);
});
//etc.
});
这比你的更加冗长;但这就是为什么这些是指导而不是规则。这是在您进行测试的详细程度与稍后调试的容易程度之间的权衡。 (“标题页显示仪表板:FAILED”)是一个非常清晰且特定的测试失败消息,与获取相同的失败消息相比,无论哪个期望实际失败。
我绝对不会尝试将所有这些线组合成一行。如果您不想将其拆分为一堆不同的测试用例,我会留下它的样子。
我认为你误解了“每次测试期望”指南的目的。关键不在于将一堆期望结合到一个单一的期望中,而是将您的期望分成单独的测试。
要遵循该指南的精神,您可以像这样编写测试:
describe("The header page", function () {
var headerPage;
beforeEach(function () {
//Common logic here
});
it("displays the dashboard", function () {
expect(headerPage.dashboard.isDisplayed()).toBe(true);
});
it("displays the queue", function () {
expect(headerPage.queue.isDisplayed()).toBe(true);
});
it("displays the claimSearch", function () {
expect(headerPage.claimSearch.isDisplayed()).toBe(true);
});
//etc.
});
这比你的更加冗长;但这就是为什么这些是指导而不是规则。这是在您进行测试的详细程度与稍后调试的容易程度之间的权衡。 (“标题页显示仪表板:FAILED”)是一个非常清晰且特定的测试失败消息,与获取相同的失败消息相比,无论哪个期望实际失败。
我绝对不会尝试将所有这些线组合成一行。如果您不想将其拆分为一堆不同的测试用例,我会留下它的样子。
替代方法。我最终得到的是添加一个返回页面对象的方法 当前可见导航链接的标签:
this.getVisibleLinks = function () {
return $$(".ap-header-nav-tabs li a").filter(function (link) {
return link.isDisplayed();
}).getText();
};
然后,上面的测试将转换为简洁和可读:
expect(headerPage.getVisibleLinks()).toEqual(["Dashboard", "Queue", "Claim Search", ...]);
如果这是您在多个规范中使用的逻辑,那么您可以查看jasmine 自定义匹配器 封装逻辑。
它会写得有点像这样:
var customMatchers = {
toDisplayWidgets: function(util, customEqualityTests) {
return {
compare: function(actual, expected) {
function isDisplayingWidgets(page) {
return page.dashboard.isDisplayed() &&
page.queue.isDisplayed() &&
page.claimSearch.isDisplayed() &&
page.claim.isDisplayed() &&
page.case.isDisplayed() &&
page.calendar.isDisplayed();
}
var result = {};
result.pass = isDisplayingWidgets(actual);
if (!result.pass) {
result.message = 'dashboard is not displayed';
}
return result;
}
}
}
将匹配器添加到当前测试中
jasmine.addMatchers(customMatchers);
然后在你的测试中你可以断言
expect(headerPage).toDisplayWidgets();
那么使用一个返回所有测试结果的辅助函数呢
expect(headerDisplayTests()).toBe(true);
function headerDisplayTests() {
return headerPage.dashboard.isDisplayed() &&
headerPage.queue.isDisplayed() &&
headerPage.claimSearch.isDisplayed() &&
headerPage.claim.isDisplayed() &&
headerPage.case.isDisplayed() &&
headerPage.calendar.isDisplayed();
}