diff --git a/IPython/html/services/kernels/tests/__init__.py b/IPython/html/services/kernels/tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/IPython/html/services/kernels/tests/__init__.py
diff --git a/IPython/html/services/kernels/tests/test_api.py b/IPython/html/services/kernels/tests/test_api.py
new file mode 100644
index 0000000..4dbf2f7
--- /dev/null
+++ b/IPython/html/services/kernels/tests/test_api.py
@@ -0,0 +1,23 @@
+"""Test the kernels service API."""
+
+
+import os
+import sys
+import json
+
+import requests
+
+from IPython.html.tests.launchnotebook import NotebookTestBase
+
+
+class KernelAPITest(NotebookTestBase):
+ """Test the kernels web service API"""
+
+ def base_url(self):
+ return super(KernelAPITest,self).base_url() + 'api/kernels'
+
+ def test_no_kernels(self):
+ """Make sure there are no kernels running at the start"""
+ url = self.base_url()
+ r = requests.get(url)
+ assert r.json() == []
diff --git a/IPython/html/tests/launchnotebook.py b/IPython/html/tests/launchnotebook.py
new file mode 100644
index 0000000..a83cbc3
--- /dev/null
+++ b/IPython/html/tests/launchnotebook.py
@@ -0,0 +1,40 @@
+"""Base class for notebook tests."""
+
+import sys
+import time
+from subprocess import Popen, PIPE
+from unittest import TestCase
+
+from IPython.utils.tempdir import TemporaryDirectory
+
+
+class NotebookTestBase(TestCase):
+ """A base class for tests that need a running notebook.
+
+ This creates an empty profile in a temp ipython_dir
+ and then starts the notebook server with a separate temp notebook_dir.
+ """
+
+ port = 12342
+
+ def setUp(self):
+ self.ipython_dir = TemporaryDirectory()
+ self.notebook_dir = TemporaryDirectory()
+ notebook_args = [
+ sys.executable, '-c',
+ 'from IPython.html.notebookapp import launch_new_instance; launch_new_instance()',
+ '--port=%d' % self.port,
+ '--no-browser',
+ '--ipython-dir=%s' % self.ipython_dir.name,
+ '--notebook-dir=%s' % self.notebook_dir.name
+ ]
+ self.notebook = Popen(notebook_args, stdout=PIPE, stderr=PIPE)
+ time.sleep(3.0)
+
+ def tearDown(self):
+ self.notebook.terminate()
+ self.ipython_dir.cleanup()
+ self.notebook_dir.cleanup()
+
+ def base_url(self):
+ return 'http://localhost:%i/' % self.port