Skip to content

Shyp/lucifer

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Lucifer

This is a tool that will help you reload your Javascript based test suite really fast.

Server

Usage

Lucifer exposes one function with the following signature:

var lucifer = function(initTestEnvironment, isTestFile, opts)

initTestEnvironment: function(cb) A function which sets up your test environment. For us this is sails.lift and a few other things. Should take a callback as an argument, and callback with a single error argument if there was one.

isTestFile: function(file) -> bool. A function which takes a filename as input and returns true if the file is a test file. Necessary so we know which files to run, and because you don't want to re-require test files until you are ready to run them.

opts: dictionary. Currently the dictionary supports two keys:

  • directory: When you make requests to the Lucifer server, assume they are relative to this directory.
  • slow: A slow test threshold, in milliseconds

So a simple example would be:

var lucifer = require('./lucifer');
var s = require('sails');

var startTestEnvironment = function(cb) {
  var start = Date.now();
  s.lift({}, function(err) {
    if (err) {
      return cb(err);
    }
    console.log('Sails ready.. booted in ' + (Date.now() - start) + 'ms');
    return cb();
  });
};

var isTestFile = function(file) {
  return file.indexOf('.test.') >= 0;
};

var opts = { directory: __dirname, slow: 2 };
lucifer(startTestEnvironment, isTestFile, opts);

Installation

Copy the lucifer-server.js file to a place you can import it from.

Server Dependencies

The server is an instance of the Express web server and runs tests with Mocha.

Client

Installation

go get github.com/kevinburke/lucifer    # Or 'make install'

I should really package these up / distribute them as binaries...

Usage

The Lucifer binary makes requests to the Lucifer server.

Usage:

    lucifer command [arguments]

The commands are:

    invalidate      Invalidate the cache for a given file
    run             Run tests for a given file

Use "lucifer help [command]" for more information about a command.

Why?

Node's require is really, really slow. If you need to load a large app with an unfortunately large number of dependencies to run your test suite, you're looking at a 5-10 second penalty to run a single test.

Instead of requiring every file every time you want to run your test suite, load all of them once and listen on a socket for incoming test run requests.

But a long running server won't take into account the changes I make

Yes! Luckily it's not too difficult to invalidate the Node cache for a module. If you call lucifer invalidate [file] the binary will make a request to the server to invalidate the cache for that module; this way you can ensure the server is running tests against the version of the module on your file system.

About

Hot, hot test reloading from Javascript

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • JavaScript 52.3%
  • Go 46.9%
  • Makefile 0.8%