diff --git a/conftest.py b/conftest.py
new file mode 100644
index 0000000000000000000000000000000000000000..fc1ab78c66c93bdf2f2659fa21b49538242208af
--- /dev/null
+++ b/conftest.py
@@ -0,0 +1,12 @@
+"""Configures pytest for kgb.
+
+This will conditionally ignore Python 3 test files on Python 2.
+"""
+
+from __future__ import unicode_literals
+
+import sys
+
+
+if sys.version_info[0] < 3:
+    collect_ignore_glob = ['kgb/tests/py3/*']
diff --git a/contrib/internal/runtests.py b/contrib/internal/runtests.py
deleted file mode 100755
index 72b078bbd75b7c44c170bc12371ac2b161deb42d..0000000000000000000000000000000000000000
--- a/contrib/internal/runtests.py
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env python
-import os
-import sys
-
-import nose
-
-
-def run_tests():
-    nose_argv = [
-        'runtests.py',
-        '-v',
-        '--with-coverage',
-        '--cover-package=kgb',
-    ]
-
-    if len(sys.argv) > 2:
-        nose_argv += sys.argv[2:]
-
-    nose.run(argv=nose_argv)
-
-
-if __name__ == '__main__':
-    os.chdir(os.path.join(os.path.dirname(__file__), '..', '..'))
-    sys.path.insert(0, os.getcwd())
-    run_tests()
diff --git a/dev-requirements.txt b/dev-requirements.txt
index ceb6fabab4c41a1ace1f874efee57f50aa4180f5..c791dc69e94f4d211ef47b3b072e6fd09946ffc4 100644
--- a/dev-requirements.txt
+++ b/dev-requirements.txt
@@ -1,3 +1,2 @@
-nose; python_version < '3'
-nose3; python_version >= '3'
+pytest
 unittest2; python_version < '2.7'
diff --git a/setup.cfg b/setup.cfg
index cddb311855fc75673471ac334f5a860e04daf0ff..33e915527ad2c4212139ea85c54932ca16409abb 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -6,3 +6,7 @@ tag_build = .dev
 
 [aliases]
 release = egg_info -DRb ''
+
+[tool:pytest]
+# Default to treating arguments as module/class/function paths, not files.
+addopts = --pyargs
diff --git a/tests/runtests.py b/tests/runtests.py
index 271210adb95ea1f39a3f75bd98bd57de01f9abab..cb2abf3de0c606a66a0d70aef0e5d8221a33d571 100755
--- a/tests/runtests.py
+++ b/tests/runtests.py
@@ -1,31 +1,14 @@
 #!/usr/bin/env python
-from __future__ import unicode_literals
+from __future__ import print_function, unicode_literals
 
 import os
 import sys
 
-import nose
-
-
-def run_tests():
-    nose_argv = [
-        'runtests.py',
-        '-v',
-        '--with-coverage',
-        '--cover-package=kgb',
-    ]
-
-    if sys.version_info[0] == 2:
-        nose_argv.append('--exclude=py3')
-
-    if len(sys.argv) > 2:
-        nose_argv += sys.argv[2:]
-
-    if not nose.run(argv=nose_argv):
-        sys.exit(1)
+import pytest
 
 
 if __name__ == '__main__':
+    print('This is deprecated! Please run pytest instead.')
+    print()
     os.chdir(os.path.join(os.path.dirname(__file__), '..'))
-    sys.path.insert(0, os.getcwd())
-    run_tests()
+    sys.exit(pytest.main(sys.argv[1:]))
