diff --git a/gh-badge.spec.js b/gh-badge.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..d1cc1940e98339748f40013d0d32ece08532effb
--- /dev/null
+++ b/gh-badge.spec.js
@@ -0,0 +1,61 @@
+var assert = require('assert');
+var cproc = require('child_process');
+var isPng = require('is-png');
+var isSvg = require('is-svg');
+
+describe('The CLI', function () {
+
+  it('should provide a help message', function(done) {
+    var child = cproc.spawn('node', ['gh-badge.js']);
+    var buffer = '';
+    child.stdout.on('data', function(chunk) {
+      buffer += ''+chunk;
+    });
+    child.stdout.on('end', function() {
+      assert(buffer.startsWith('Usage'));
+      done();
+    });
+  });
+
+  it('should produce default badges', function(done) {
+    var child = cproc.spawn('node',
+      ['gh-badge.js', 'cactus', 'grown']);
+    child.stdout.once('data', function(chunk) {
+      var buffer = ''+chunk;
+      assert.ok(isSvg(buffer));
+      assert(buffer.includes('cactus'), 'cactus');
+      assert(buffer.includes('grown'), 'grown');
+      done();
+    });
+  });
+
+  it('should produce colorschemed badges', function(done) {
+    var child = cproc.spawn('node',
+      ['gh-badge.js', 'cactus', 'grown', ':green']);
+    child.stdout.once('data', function(chunk) {
+      var buffer = ''+chunk;
+      assert.ok(isSvg(buffer));
+      done();
+    });
+  });
+
+  it('should produce right-color badges', function(done) {
+    var child = cproc.spawn('node',
+      ['gh-badge.js', 'cactus', 'grown', '#abcdef']);
+    child.stdout.once('data', function(chunk) {
+      var buffer = ''+chunk;
+      assert(buffer.includes('#abcdef'), '#abcdef');
+      done();
+    });
+  });
+
+  it('should produce PNG badges', function(done) {
+    var child = cproc.spawn('node',
+      ['gh-badge.js', 'cactus', 'grown', '.png']);
+    child.stdout.once('data', function(chunk) {
+      assert.ok(isPng(chunk));
+      done();
+    });
+  });
+
+});
diff --git a/test/badge.spec.js b/lib/badge.spec.js
similarity index 90%
rename from test/badge.spec.js
rename to lib/badge.spec.js
index 5e44a8d5492bd5c5cab57ea6facdd94bfa4efd57..671ed0bbfbcec598f8f2a8db30689bd519bae826 100644
--- a/test/badge.spec.js
+++ b/lib/badge.spec.js
@@ -1,7 +1,7 @@
 const assert = require('assert');
 const isSvg = require('is-svg');
 
-const badge = require('../lib/badge');
+const badge = require('./badge');
 
 describe('The badge generator', function () {
   it('should produce SVG', function(done) {
diff --git a/test/in-process-server-helpers.js b/lib/in-process-server-test-helpers.js
similarity index 96%
rename from test/in-process-server-helpers.js
rename to lib/in-process-server-test-helpers.js
index b471d41d9fbaf8604985be6bb0bdf14cf0a4f8df..a8d21c812598cf04e9f9774a3e3b523a3049f11e 100644
--- a/test/in-process-server-helpers.js
+++ b/lib/in-process-server-test-helpers.js
@@ -12,7 +12,7 @@
 
 'use strict';
 
-const config = require('./config');
+const config = require('./test-config');
 
 let startCalled = false;
 
diff --git a/test/lru-cache.spec.js b/lib/lru-cache.spec.js
similarity index 99%
rename from test/lru-cache.spec.js
rename to lib/lru-cache.spec.js
index f125e6a2e4d3edeb90a1c8b08dc63ae0e2bf1020..a404703a20a8ed449e9ed2a5d0516f9f1bbb8e17 100644
--- a/test/lru-cache.spec.js
+++ b/lib/lru-cache.spec.js
@@ -1,6 +1,6 @@
 var assert = require('assert');
 
-var LRU = require('../lib/lru-cache.js');
+var LRU = require('./lru-cache');
 
 describe('The LRU cache', function () {
 
diff --git a/test/svg-to-img.spec.js b/lib/svg-to-img.spec.js
similarity index 92%
rename from test/svg-to-img.spec.js
rename to lib/svg-to-img.spec.js
index 54e0443637475479df9cce82f947894333013cc8..1e2b089b43b6b60a1987709abb4369089dbada51 100644
--- a/test/svg-to-img.spec.js
+++ b/lib/svg-to-img.spec.js
@@ -2,8 +2,8 @@ const assert = require('assert');
 const sinon = require('sinon');
 const isPng = require('is-png');
 
-const badge = require('../lib/badge');
-const svg2img = require('../lib/svg-to-img.js');
+const badge = require('./badge');
+const svg2img = require('./svg-to-img');
 
 describe('The rasterizer', function () {
   let cacheGet;
diff --git a/test/config.js b/lib/test-config.js
similarity index 100%
rename from test/config.js
rename to lib/test-config.js
diff --git a/package.json b/package.json
index 937a0ad215a570193cdc5a12a9b46c865eb641de..137e2462b671bb16cb0c06c8074eff08c139f776 100644
--- a/package.json
+++ b/package.json
@@ -43,7 +43,7 @@
     "coverage:report:reopen": "opn coverage/lcov-report/index.html",
     "coverage:report:open": "npm run coverage:report && npm run coverage:report:reopen",
     "lint": "eslint '**/*.js'",
-    "test:js": "mocha 'test/**/*.spec.js'",
+    "test:js": "mocha lib '*.spec.js'",
     "test:services": "mocha --delay service-tests/runner/cli.js",
     "test": "npm run lint && npm run test:js"
   },
diff --git a/test/test.spec.js b/server.spec.js
similarity index 53%
rename from test/test.spec.js
rename to server.spec.js
index 06e7b5bfd1cdf48052c2145bd922f08d70353b22..6c91f9c73bed19098440304ec639ae5d77945b6f 100644
--- a/test/test.spec.js
+++ b/server.spec.js
@@ -1,75 +1,16 @@
 var assert = require('assert');
 var sinon = require('sinon');
 var http = require('http');
-var cproc = require('child_process');
 var fs = require('fs');
 var path = require('path');
 var isPng = require('is-png');
 var isSvg = require('is-svg');
-var svg2img = require('../lib/svg-to-img');
-const serverHelpers = require('./in-process-server-helpers');
+var svg2img = require('./lib/svg-to-img');
+const serverHelpers = require('./lib/in-process-server-test-helpers');
 
-// Test parameters
 var port = '1111';
 var url = 'http://127.0.0.1:' + port + '/';
 
-describe('The CLI', function () {
-
-  it('should provide a help message', function(done) {
-    var child = cproc.spawn('node', ['gh-badge.js']);
-    var buffer = '';
-    child.stdout.on('data', function(chunk) {
-      buffer += ''+chunk;
-    });
-    child.stdout.on('end', function() {
-      assert(buffer.startsWith('Usage'));
-      done();
-    });
-  });
-
-  it('should produce default badges', function(done) {
-    var child = cproc.spawn('node',
-      ['gh-badge.js', 'cactus', 'grown']);
-    child.stdout.once('data', function(chunk) {
-      var buffer = ''+chunk;
-      assert.ok(isSvg(buffer));
-      assert(buffer.includes('cactus'), 'cactus');
-      assert(buffer.includes('grown'), 'grown');
-      done();
-    });
-  });
-
-  it('should produce colorschemed badges', function(done) {
-    var child = cproc.spawn('node',
-      ['gh-badge.js', 'cactus', 'grown', ':green']);
-    child.stdout.once('data', function(chunk) {
-      var buffer = ''+chunk;
-      assert.ok(isSvg(buffer));
-      done();
-    });
-  });
-
-  it('should produce right-color badges', function(done) {
-    var child = cproc.spawn('node',
-      ['gh-badge.js', 'cactus', 'grown', '#abcdef']);
-    child.stdout.once('data', function(chunk) {
-      var buffer = ''+chunk;
-      assert(buffer.includes('#abcdef'), '#abcdef');
-      done();
-    });
-  });
-
-  it('should produce PNG badges', function(done) {
-    var child = cproc.spawn('node',
-      ['gh-badge.js', 'cactus', 'grown', '.png']);
-    child.stdout.once('data', function(chunk) {
-      assert.ok(isPng(chunk));
-      done();
-    });
-  });
-
-});
-
 describe('The server', function () {
   let server;
   before('Start running the server', function () {
@@ -103,7 +44,7 @@ describe('The server', function () {
   });
 
   context('with svg2img error', function () {
-    var expectedError = fs.readFileSync(path.resolve(__dirname, '..', 'public', '500.html'));
+    var expectedError = fs.readFileSync(path.resolve(__dirname, 'public', '500.html'));
 
     var toBufferStub;
     beforeEach(function () {
diff --git a/service-tests/runner/cli.js b/service-tests/runner/cli.js
index decbee65c3d8019c6d102de5d6dccf4ccf269001..8094de4ea9a38be682d04a5c87d06c3dff757d54 100644
--- a/service-tests/runner/cli.js
+++ b/service-tests/runner/cli.js
@@ -20,7 +20,7 @@ const difference = require('lodash.difference');
 const fetch = require('node-fetch');
 const minimist = require('minimist');
 const Runner = require('./runner');
-const serverHelpers = require('../../test/in-process-server-helpers');
+const serverHelpers = require('../../lib/in-process-server-test-helpers');
 
 function getTitle (repoSlug, pullRequest) {
   const uri = `https://api.github.com/repos/${repoSlug}/pulls/${pullRequest}`;
diff --git a/service-tests/runner/service-tester.js b/service-tests/runner/service-tester.js
index 4cff1ac798328b6863729c83cc890f244288fbad..4deb9a7cf9ab7c6a99c0b4218c4a4010d42f1dc7 100644
--- a/service-tests/runner/service-tester.js
+++ b/service-tests/runner/service-tester.js
@@ -1,7 +1,7 @@
 'use strict';
 
 const frisby = require('icedfrisby-nock')(require('icedfrisby'));
-const config = require('../../test/config');
+const config = require('../../lib/test-config');
 
 /**
  * Encapsulate a suite of tests. Create new tests using create() and register