UNPKG

scientist.js

Version:

A JavaScript interpretation of the Ruby library Scientist, a library for carefully refactoring critical paths.

44 lines (32 loc) 1.94 kB
# scientist.js :microscope: A JavaScript interpretation of the Ruby library Scientist, a library for carefully refactoring critical paths. [![Build Status](https://travis-ci.org/ziyasal/scientist.js.svg?branch=master)](https://travis-ci.org/ziyasal/scientist.js) [![Coverage Status](https://coveralls.io/repos/github/ziyasal/scientist.js/badge.svg?branch=master)](https://coveralls.io/github/ziyasal/scientist.js?branch=master) How do I science? ======================== Let's pretend you're changing the way you handle permissions in a large web app. Tests can help guide your refactoring, but you really want to capture the current and refactored beahviours under load. ```js import {Experiment, Result} from 'scientist.js'; import Permission from './permission'; import Model from './model'; export default class MyWidget { constructor() { this.model = new Model(); } allows(user) { var experiment = new Experiment("widget-permissions"); experiment.use(() => this.model.checkUser(user).valid); // old way experiment.try(() => user.can(Permission.Read, this.model)); // new way return experiment.run(); } } ``` Use `use(..)` to wrap the existing original behaviour, and use `try(..)` to wrap the new behaviour. `experiment.run();` will always return the result of the `use` block, but it does a bunch of stuff behind the scenes: - It decides whether or not to run the `try` block - Randomises order to execute `try` and `use` blocks - Measures the duration of both behaviours - Swallows (but records) any exceptions raised in the `try` block and - Set a condition to filter calls to `try` Upcoming features (these already exist in the `Ruby` library): - Compares the result of `try` to the result of `use`, - Publishes all this information. The `use` block is called the **control**. The `try` block is called the **candidate**.