问题 量角器中的RGB / RGBA颜色值


故事:

在我们的测试代码库中的几个地方,我们断言不同的CSS值等于期望值。通常,这是一个 colorbackground-colorfont 相关的样式属性,或 cursor。这个问题是关于处理颜色。

以下是当前通过的示例工作测试:

describe("AngularJS home page", function () {
    beforeEach(function () {
        browser.get("https://angularjs.org/");
    });

    it("should show a blue Download button", function () {
        var downloadButton = element(by.partialLinkText("Download"));

        expect(downloadButton.getCssValue("background-color")).toEqual("rgba(0, 116, 204, 1)");
    });
});

它检查AngularJS网站上的“下载”按钮 0, 116, 204, 1 RGBA值。

现在,如果颜色发生变化,测试将失败,例如:

Expected 'rgba(0, 116, 204, 1)' to equal 'rgba(255, 116, 204, 1)'.

问题:

  • 正如您所看到的,首先,期望本身并不具有可读性。除非我们在其附近发表评论,否则我们期望看到的颜色并不明显。

  • 此外,错误消息不提供信息。目前还不清楚实际的颜色是什么,我们期望看到什么颜色。

问题:

是否有可能改进测试本身和错误消息,使其更具可读性和信息性并且可以运行 颜色名称而不是颜色RGB / RGBA值

期望的期望

expect(downloadButton).toHaveBackgroundColor("midnight blue");

所需的错误消息

Expect 'blue' to equal 'black'
Expect 'dark grey' to equal 'light sea green'

目前,我正在考虑制作一个可以转换的自定义茉莉花匹配器 RGB/RGBA 对自定义的价值 Color 保持原始值以及确定最接近颜色的对象。 color npm包看起来很有前途。

将不胜感激。


5810
2017-12-27 06:01


起源

是否所有计算值都保证与命名颜色相对应? - BoltClock♦
@BoltClock好问题。我会坚持rgb->颜色名称之间的一些基础映射,如果找不到颜色名称,我们只能显示实际的原始rgb(a)值。我明白,它可能不会是防弹的,但我希望实际。 - alecxe
大多数网站都有自己的一套颜色,通常没有很多颜色,但这取决于设计。我想创建一个简单的JS对象作为颜色和颜色名称的地图,特定于您的网站,而不是依赖于另一个lib: { 'red': 'rgba(255, 0, 0, 1)', 'blue': 'rgba(0, 0, 255, 1)' } 并与他们相匹配。 - Michael Radionov
我会选择颜色角色,而不是颜色本身..虽然这不是1:1。 - user2864740
@alecxe我编写的测试目标类,但即使在迈克尔建议的情况下也可以 { 'warning': 'rgb(255, 0, 0, 1)' }。这仍然低于我更喜欢​​处理的问题,而人类的“视觉”测试捕获了布局/渲染缺陷 - 这可能在不同设备上以如此多的荒谬方式表现出来 - 比Selenium更好。 - user2864740


答案:


量角器使用 茉莉花 默认情况下作为其测试框架,它提供了添加自定义的机制 期望

所以,你可以这样做:

在您的量角器配置文件中:

var customMatchers = {
  toHaveBackgroundColor: function(util, customEqualityTesters) {
      compare: function(actual, expected) {
        result.pass = util.equals(extractColor(actual), convertToRGB(expected), customEqualityTesters);
        result.message = 'Expected ' + actual + ' to be color ' + expected';
      }
   }
}

jasmine.addMatchers(customMatchers);

function convertToRGB(color) {
  // convert a named color to rgb
}

function extractColor(domElement) {
  // extract background color from dom element
}

并使用它:

expect(downloadButton).toHaveBackgroundColor("midnight blue");

我没有试过这个,但这是你需要的基本想法。


8
2017-12-27 18:02



很抱歉这个混乱,“自定义茉莉花匹配器”部分是我已经熟悉的东西。在这里,我基本上主要关注最可靠的 convertToRGB 步骤实现..并且可能寻求通用的东西,我们可以从...创建一个可重用的库。谢谢! - alecxe


我得到了基于@Andrew和@Manasov推荐的工作答案。

所以自定义的期望是这样的:

var nameColor = require('name-that-color/lib/ntc');
var rgbHex = require('rgb-hex');

toHaveColor: function() {
    return {
        compare: function (elem, color) {
            var result = {};
            result.pass = elem.getCssValue("color").then(function(cssColor) {
                var hexColor = rgbHex(cssColor);
                var colorName = nameColor.name('#' + hexColor.substring(0, 6).toUpperCase());
                result.message = "Expect '" + colorName[1] + "' to equal '" + color + "'";
                return colorName[1] === color;
            });
            return result;
        }
    }
}

我们需要先安装必要的包:

npm install name-that-color
npm install rgb-hex

我们首先需要转换 rgb 颜色变成十六进制此外,我们必须从颜色中删除alpha name-that-color 实际上它与颜色名称匹配,它可以从中删除 hex 转换。

现在我们可以简单地称之为:

expect(downloadButton).toHaveColor("midnight blue");

1
2017-10-31 14:10