JavaScript port of Ruby library Scientist, carefully refactoring critical paths
                 KattieHead
                 10年前
            
                    来自: https://github.com/ziyasal/scientist.js
scientist.js
 
 A JavaScript interpretation of the Ruby libraryScientist, 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.
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 .