凯特: 他们是什么,比利?
比利・佩兹: 他们就像弗特曼先生说的一样.
目录
目的
在开发 HTML5 应用程序时, 您是否预见到不同寻常的用户交互 ? 你成功检测和补补补了所有的内存出漏? 如果没有,申请可能迟早会中断。 如果n随机动作可以使应用程序出故障,在测试时最好承认,而不是让用户发现.
Gremlins.js模拟了随机用户动作:gremlins点击窗口的任意位置,在形式上输入随机数据,或者将鼠标移动到不期待的元素上. 他们的目标:触发JavaScript错误,或使应用程序失败. 如果格林林斯不能打破申请,恭喜! 应用程序足够强大,可以发布给真正的用户.
这种做法,也称为 猴子检测 或者说 模糊测试,在移动应用程序开发中非常常见(例如参见: 安卓猴计划) (中文(简体) ). 现在前端(MV *, d3.js, Backbone.js, Angular.js等)和后端(Node.js)的开发使用持续的JavaScript应用,这种技术对网络应用变得有价值.
安装
此模块通过 无 与 节点 并且应该安装为您的项目之一 dependencies数字 :
npm i gremlins.js
这个图书馆 dependencies 清单 chance。 。 。 .
gremlins.js 也可作为 书签转到 此页面,抓住它,并在任何网页上发布群.
基本用途
绿宝石 军团 是一支专门精锐的军队 准备破坏你的申请. 释放 开始压力测试:
const horde = gremlins.createHorde();
horde.unleash();
// gremlins will act randomly, at 10 ms interval, 1000 times
gremlins.js 提供数个格林林 物种:有的点击页面上随处可见,有的以窗体输入数据,有的则以每个可能的方向滚动窗口等.
在屏幕(它们留下了红色的痕迹)和控制台日志中,你会看到Gremlins动作的痕迹:
gremlin formFiller input 5 in <input type="number" name="age">
gremlin formFiller input [email protected] in <input type="email" name="email">
gremlin clicker click at 1219 301
gremlin scroller scroll to 100 25
...
一群人还包含 莫格瓦斯语name,它们是无害的腺素(或者,你可以说,腺素是有害的莫克瓦斯)。 Mogwais只监视应用程序的活动,并将其记录在日志上. 例如,"fps" mogwai监视每秒帧数,每500ms:
mogwai fps 33.21
mogwai fps 59.45
mogwai fps 12.67
...
Mogwais也报告gremlins破解应用时的情况. 例如, 如果每秒帧数下降到 10 下, fps mogwai 会记录一个错误 :
mogwai fps 12.67
mogwai fps 23.56
err > mogwai fps 7.54 < err
mogwai fps 15.76
...
10个出错后,一个特制的摩格瓦伊停止了测试. 他被叫来 吉兹莫而且他防止了葛林斯坏掉应用 毕竟,一旦Gremlins发现了前10个错误,你已经知道该怎么做才能让你的应用程序更坚固.
如果没有被Gizmo阻止,默认的激流在大约1分钟后停止. 可以增加Gremlins动作的数量,使攻击持续更长的时间:
horde.createHorde({
strategies: [gremlins.strategies.allTogether({ nb: 10000 })],
});
horde.unleash();
// gremlins will attack at 10 ms interval, 10,000 times
Gremlins同mogwais一样,是简单的JavaScript函数. 若为 gremlins.js 不提供可以破坏你的应用的gremlin,非常容易开发:
// Create a new custom gremlin to blur an input randomly selected
function customGremlin({ logger, randomizer, window }) {
// Code executed once at initialization
logger.log('Input blur gremlin initialized');
// Return a function that will be executed at each attack
return function attack() {
var inputs = document.querySelectorAll('input');
var element = randomizer.pick(element);
element.blur();
window.alert('attack done');
};
}
// Add it to your horde
horde.createHorde({
species: [customGremlin],
});
里面的东西 gremlins.js 。您会发现非常容易扩展并适应您使用的案例.
高级使用
设置 Gremlins 和 Mogwais 在测试中使用
默认情况下会将所有革兰和莫克瓦斯物种都加入到荷花属中.
您也可以选择只添加您想要的 gremlins 物种, 使用自定义配置对象 :
gremlins
.createHorde({
species: [
gremlins.species.formFiller(),
gremlins.species.clicker({
clickTypes: ['click'],
}),
gremlins.species.toucher(),
],
})
.unleash();
如果您只想在默认的外加自有克林,请使用 allSpecies 常数 :
gremlins
.createHorde({
species: [...gremlins.allSpecies, customGremlin],
})
.unleash();
只需加入你想要的摩格瓦 就用 mogwai 配置和 allMogwais() 恒相如来相.
gremlins.js 目前提供几种甘油和莫克瓦斯:
- 点击器Gremlin 单击文档可见区域的任何位置
- 触摸器Gremlin 触摸文档可见区域的任何地方
- 窗体FillerGremlin 通过输入数据、选择选项、点击复选框等方式填充表格
- 卷轴格勒姆林 滚动视图以显示文档的另一部分
- 转接器Gremlin 键盘上的键类型
- 提醒莫格瓦伊语Name 防止呼叫提醒( ) 阻断测试
- fps. 莫格瓦伊语 记录浏览器每秒帧数
- 兹莫·莫格瓦伊 格林林人走得太远就阻止了
配置格伦林
所有由Gremlins和Mogwais提供 由 gremlins.js 为: 可配置,即可以通过插入自定义配置来改变工作方式.
例如,点击器gremlin是一个将对象作为自定义配置的函数:
const customClicker = gremlins.species.clicker({
// which mouse event types will be triggered
clickTypes: ['click'],
// Click only if parent is has class test-class
canClick: (element) => element.parentElement.className === 'test-class',
// by default, the clicker gremlin shows its action by a red circle
// overriding showAction() with an empty function makes the gremlin action invisible
showAction: (x, y) => {},
});
gremlins.createHorde({
species: [customClicker],
});
每个特定的gremlin或mogwai都有自己的定制方法,检查来源详情.
种子随机器
如果想要攻击是可重复的, 你需要种子随机数生成器 :
// seed the randomizer
horde.createHorde({
randomizer: new gremlins.Chance(1234);
});
攻击前后执行代码
在开始攻击之前, 您可能想要执行自定义代码 。 这对于:
- 启动配置器
- 禁用一些特性以更好地瞄准测试
- 启动应用程序
幸运的是, unleashHorde 是一个承诺。 如果你想在释放前后执行代码,只需:
const horde = gremlins.createHorde();
console.profile('gremlins');
horde.unleash().then(() => {
console.profileEnd();
});
制定战略
默认情况下,gremlins会以随机顺序出击,统一分布,以10ms的延迟相隔. 这个攻击策略叫做 分配 战略。 您可以使用策略自定义对象 :
const distributionStrategy = gremlins.strategies.distribution({
distribution: [0.3, 0.3, 0.3, 0.1], // the first three gremlins have more chances to be executed than the last
delay: 50, // wait 50 ms between each action
});
请注意,如果使用默认的腺素,则有 5种格林林。上一个示例将给出一个 0 值,用于上一个 Gremlin specie .
您也可以使用另一种策略。 一个策略只是一个函数,期望一个参数:一阵"克林". 将另外两项战略捆绑在一起(一起来 财务报告和审定财务报表 字节更复杂的攻击情景应该很容易执行定制战略.
停止攻击
敌军在紧急情况下可以停止攻击 horde.stop() 方法Gizmo在10个出错后使用这种方法来防止应用程序的进一步损坏,如果不想继续攻击,也可以使用.
自定义 Logger
默认情况下,gremlins.js记录了控制台中所有的gremlin动作和mogwai观测. 如果您更喜欢使用替代的日志方法(例如,将腺素活性存储在本地Storage中并每10秒发送一次在Ajax),只需为日志对象提供4个方法(log、信息、警告和出错)即可 logger() 方法 :
const customLogger = {
log: function (msg) {
/* .. */
},
info: function (msg) {
/* .. */
},
warn: function (msg) {
/* .. */
},
error: function (msg) {
/* .. */
},
};
horde.createHorde({ logger: customLogger });
齐压
要在囊压测试中运行 gremlins.js, 你需要提供测试窗口:
import { createHorde } from 'gremlins.js';
describe('Run gremlins.js inside a cypress test', () => {
let horde;
beforeEach(() =>
cy.window().then((testedWindow) => {
horde = createHorde({ window: testedWindow });
})
);
it('should run gremlins.js', () => {
return cy.wrap(horde.unleash()).then(() => {
/* ... */
});
});
});
文档
问题
想做贡献吗? 寻找 好,第一个问题 标签.
QQ 错误
请为错误、 缺少文档或意外行为存档 .
QQ 特性请求
请提出一个问题来建议新的功能。 通过添加对专题请求进行表决 (单位:千美元) 这有助于维护者确定工作的优先次序.
