🔬 A JavaScript interpretation of the Ruby library Scientist, a library for carefully refactoring critical paths.
JavaScript
Latest commit e57405b Nov 15, 2016 @ziyasal committed on GitHub Update base-experiment.js
Permalink
Failed to load latest commit information.
sample add basic documentation Jan 26, 2016
src Update base-experiment.js Nov 15, 2016
tests Add tests to experiment. Feb 20, 2016
.babelrc add more experiment tests Jan 26, 2016
.gitignore add more experiment tests Jan 26, 2016
.npmignore add more experiment tests Jan 26, 2016
.travis.yml init Jan 25, 2016
LICENSE init Jan 25, 2016
README.md Update README.md Mar 4, 2016
package.json Update package.json Feb 18, 2016

README.md

scientist.js

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

Build Status Coverage Status

Install

npm install scientist.js

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 behaviours under load.

ES6 Sample

import {Experiment, Result} from 'scientist.js';

import Permission from './permission';
import Model from './model';

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.