diff --git a/.coveragerc b/.coveragerc
new file mode 100644
index 0000000000000000000000000000000000000000..3a33749e6757bbeab1059cf1bb9b35095f98f5b2
--- /dev/null
+++ b/.coveragerc
@@ -0,0 +1,4 @@
+# .coveragerc for xblock-lti-consumer
+[run]
+data_file = .coverage
+source = lti_consumer
diff --git a/.gitignore b/.gitignore
index c376115570b5ac032f3101aa53422248259b5ccf..8ab4137cc4597cea6ecc55b08b47ab95f4eb6f37 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,4 +14,4 @@ codekit-config.json
 
 ### Testing artifacts
 .coverage
-var/
\ No newline at end of file
+var/
diff --git a/scripts/test.sh b/scripts/test.sh
index ea99b7d7ac2bcbeccb7d58c41ec8e1b234a6bd03..f5f08fefd4a25d2e125d98f28704c7163152d8e1 100755
--- a/scripts/test.sh
+++ b/scripts/test.sh
@@ -1,7 +1,6 @@
 #!/usr/bin/env bash
 set -e
 
-export DJANGO_SETTINGS_MODULE="workbench.settings"
 mkdir -p var
 rm -rf .coverage
-nosetests --with-coverage --cover-package="lti_consumer"
+python -m coverage run --rcfile=.coveragerc ./test.py $1 --noinput
diff --git a/test.py b/test.py
new file mode 100644
index 0000000000000000000000000000000000000000..56599543313b4f573f2009051131f653312f7e2d
--- /dev/null
+++ b/test.py
@@ -0,0 +1,34 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+Run tests for the LTI Consumer XBlock
+"""
+import os
+import sys
+
+if __name__ == '__main__':
+    os.environ.setdefault('DJANGO_SETTINGS_MODULE', u'workbench.settings')
+
+    try:
+        from django.conf import settings # pylint: disable=wrong-import-position
+        from django.core.management import execute_from_command_line  # pylint: disable=wrong-import-position
+    except ImportError:
+        # The above import may fail for some other reason. Ensure that the
+        # issue is really that Django is missing to avoid masking other
+        # exceptions on Python 2.
+        try:
+            import django  # pylint: disable=unused-import, wrong-import-position
+        except ImportError:
+            raise ImportError(
+             "Couldn't import Django. Are you sure it's installed and "
+             "available on your PYTHONPATH environment variable? Did you "
+             "forget to activate a virtual environment?"
+            )
+        raise
+
+    settings.INSTALLED_APPS += (u'lti_consumer',)
+
+    arguments = sys.argv[1:]
+    options = [argument for argument in arguments if argument.startswith('-')]
+    paths = [argument for argument in arguments if argument not in options]
+    execute_from_command_line([sys.argv[0], 'test'] + paths + options)
diff --git a/test_requirements.txt b/test_requirements.txt
index 5ae99aea0d41d47d4ec6db3fa30777f996a0893f..fc069cb5d1dba80043a34eb3ef139b3d955aa59c 100644
--- a/test_requirements.txt
+++ b/test_requirements.txt
@@ -1,5 +1,6 @@
 -r requirements.txt
 
+django-nose==1.4.4
 astroid==1.3.8  # Pinning to avoid backwards incompatibility issue with pylint/pylint-django
 coveralls
 pep8