将多个布尔检查简化为一个布尔检查

Simplifying multiple boolean checks into a single one

本文关键字:检查 布尔 一个      更新时间:2023-09-26

在我们的一个测试中,我们有以下一组期望值:

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")是一个非常清晰和具体的测试失败消息,与获得相同的失败消息相比,无论哪种期望实际失败。

我绝对不会试图将所有这些行合并为一行。如果你不想把它分成一堆不同的测试用例,我就顺其自然

替代方法。我最终添加了一个页面对象方法,该方法返回当前可见导航链接的标签:

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();
}