Package Exports
- scientist.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (scientist.js) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
scientist.js
🔬 A JavaScript interpretation of the Ruby library Scientist, a library for carefully refactoring critical paths.
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.
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
anduse
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 ofuse
, - Publishes all this information.
The use
block is called the control. The try
block is called the candidate.