量角器:测试忙碌指标' /互联网连接缓慢的行为

时间:2015-01-10 18:49:23

标签: angularjs testing selenium-webdriver protractor end-to-end

如果HTTP请求的时间超过1秒,则会显示忙碌指示符。如果返回时间不到1秒,则不会显示忙碌指示符。

用量角器测试这个的最佳方法是什么?我想我需要两个测试用例:

it('should not show busy indicator because http response is quick', function () {
    // ??
});

it('should show busy indicator because http response is taking longer than 1 second', function () {
    // ??
});

1 个答案:

答案 0 :(得分:2)

执行此操作的一种方法是设置Protractor启动的浏览器使用的可配置代理服务器。此代理服务器可以为请求添加延迟,从而模拟慢速的Internet连接/网络(或者至少为您的目的模拟它)。

这样的代理服务器+ mini-API允许它可配置,如:

// proxy.js

// Config ports
var PROXY_PORT = 8001;
var CONFIG_PORT = 8002;

// Latency used for all requests
var latency = 0;

// Proxy
var hoxy = require('hoxy');
var proxy = new hoxy.Proxy();
proxy.intercept('request', function(req, resp) {
  req.slow({latency: latency}); 
});
proxy.listen(PROXY_PORT);

// API Server for tests to configure latency
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.json());
app.post('/', function(req, res) {
  latency = req.body.latency;;
  res.send('');
});
app.listen(CONFIG_PORT);

以上请求npm包hoxyexpressbody-parser,每个包都可以通过

等命令安装
npm install hoxy --save-dev

上述服务器,假设它保存到proxy.js,可以在命令行上启动

node proxy.js

请注意,它会侦听2个端口:8001用于为请求添加延迟的简单HTTP代理,8002用于侦听/的简单API,该API接受带有单个密钥的JSON对象:{{ 1}}用毫秒来减慢通过代理的所有后续请求。

要在Protractor中使用代理,您可以通过以下方式将其添加到其配置文件中,例如Chrome:

latency

然后在您的spec文件中,您可以通过

创建一个函数来设置后续请求的延迟
capabilities: {
  browserName: 'chrome',
  proxy: {
    proxyType: 'manual',
    httpProxy: 'localhost:8001'
  }
}

请注意,我们将代码添加到控制流中,并在设置延迟的请求完成后返回已解析的promise。这意味着我们可以以与其他量角器元素查找器/期望相同的自然方式使用它,而无需使用手动describe('My Component', function() { var http = require('http'); function setLatency(latency) { return browser.controlFlow().execute(function () { var deferred = protractor.promise.defer(); var data = JSON.stringify({latency:latency}); var req = http.request({ method: 'POST', host: 'localhost', port: 8002, headers: { 'Content-Type': 'application/json', 'Content-Length': data.length } }, function() { deferred.fulfill(); }); req.write(data); req.end(); return deferred.promise; }); } ... 回调。

您的实际测试取决于您如何显示忙碌指标,但您应该可以执行以下操作:

then

上述测试并不完美。具体而言,繁忙指标未显示的测试实际上并未表明它从未出现过。它只是测试它在900毫秒的请求中没有出现500毫秒。

请注意it('should not show busy indicator because http response is quick', function () { setLatency(900); element(by.css('button')).click(); browser.ignoreSynchronization = true; browser.sleep(500); expect(element(by.css('.loading-indicator')).isPresent()).not.toBe(true); browser.ignoreSynchronization = false; setLatency(0); }); it('should show busy indicator because http response is taking longer than 1 second', function () { setLatency(2000); element(by.css('button')).click(); browser.ignoreSynchronization = true; browser.sleep(1000); expect(element(by.css('.loading-indicator')).isPresent()).toBe(true); browser.ignoreSynchronization = false; setLatency(0); }); 的设置。如果我们没有将其设置为browser.ignoreSynchronization = false,则测试不会取得进展,直到所有false请求都已完成,我们在这种情况下不想做,因为我们正在测试请求期间发生的事情的行为。