diff --git a/dev-requirements.txt b/dev-requirements.txt
index c791dc69e94f4d211ef47b3b072e6fd09946ffc4..370f89da1c7273112b917d3a6fa7f0037460665f 100644
--- a/dev-requirements.txt
+++ b/dev-requirements.txt
@@ -1,2 +1,2 @@
 pytest
-unittest2; python_version < '2.7'
+unittest2; python_version == '2.7'
diff --git a/kgb/tests/base.py b/kgb/tests/base.py
index c64bfba92816e3747f1f60c38dbd59a4104bca9d..7ef4679ed9cb5f7207c35b1bdcd0b9262161d675 100644
--- a/kgb/tests/base.py
+++ b/kgb/tests/base.py
@@ -4,7 +4,7 @@ import re
 import sys
 import textwrap
 
-if sys.version_info[:2] >= (2, 7):
+if sys.version_info[:2] > (2, 7):
     import unittest
 else:
     import unittest2 as unittest
diff --git a/kgb/tests/test_function_spy.py b/kgb/tests/test_function_spy.py
index 2ff7133435829d08ad4e76027089a16e75affd3c..2a006026111d57a82d8bb685787d8af606acf6be 100644
--- a/kgb/tests/test_function_spy.py
+++ b/kgb/tests/test_function_spy.py
@@ -3,7 +3,10 @@ from __future__ import unicode_literals
 import functools
 import inspect
 import re
+import sys
 import types
+import unittest
+from warnings import catch_warnings
 
 from kgb.errors import ExistingSpyError, IncompatibleFunctionError
 from kgb.pycompat import text_type
@@ -11,6 +14,32 @@ from kgb.signature import FunctionSig
 from kgb.tests.base import MathClass, TestCase
 
 
+has_getargspec = hasattr(inspect, 'getargspec')
+has_getfullargspec = hasattr(inspect, 'getfullargspec')
+
+
+def require_getargspec(func):
+    """Require getargspec for a unit test.
+
+    If not available, the test will be skippd.
+
+    Args:
+        func (callable):
+            The unit test function to decorate.
+    """
+    @functools.wraps(func)
+    def _wrap(*args, **kwargs):
+        if has_getargspec:
+            with catch_warnings(record=True):
+                return func(*args, **kwargs)
+        else:
+            raise unittest.SkipTest(
+                'inspect.getargspec is not available on Python %s.%s.%s'
+                % sys.version_info[:3])
+
+    return _wrap
+
+
 def do_math(a=1, b=2, *args, **kwargs):
     return a - b
 
@@ -40,7 +69,7 @@ def something_awesome():
 
 
 def fake_something_awesome():
-    return '\o/'
+    return r'\o/'
 
 
 class AdderObject(object):
@@ -578,7 +607,7 @@ class FunctionSpyTests(TestCase):
                            call_fake=fake_something_awesome)
         result = something_awesome()
 
-        self.assertEqual(result, '\o/')
+        self.assertEqual(result, r'\o/')
         self.assertEqual(len(something_awesome.spy.calls), 1)
         self.assertEqual(len(something_awesome.spy.calls[0].args), 0)
         self.assertEqual(len(something_awesome.spy.calls[0].kwargs), 0)
@@ -1204,7 +1233,7 @@ class FunctionSpyTests(TestCase):
             'is an unbound method.'
         )
 
-        with self.assertRaisesRegexp(TypeError, message):
+        with self.assertRaisesRegex(TypeError, message):
             obj.add_one.call_original(5)
 
     def test_called(self):
@@ -1640,6 +1669,7 @@ class FunctionSpyTests(TestCase):
             '<Spy for classmethod MathClass.class_do_math of %r (0 calls)>'
             % MathClass)
 
+    @require_getargspec
     def test_getargspec_with_function(self):
         """Testing FunctionSpy in inspect.getargspec() with function"""
         self.agency.spy_on(do_math)
@@ -1650,6 +1680,7 @@ class FunctionSpyTests(TestCase):
         self.assertEqual(keywords, 'kwargs')
         self.assertEqual(defaults, (1, 2))
 
+    @require_getargspec
     def test_getargspec_with_bound_method(self):
         """Testing FunctionSpy in inspect.getargspec() with bound method"""
         obj = MathClass()
@@ -1661,6 +1692,7 @@ class FunctionSpyTests(TestCase):
         self.assertEqual(keywords, 'kwargs')
         self.assertEqual(defaults, (1, 2))
 
+    @require_getargspec
     def test_getargspec_with_unbound_method(self):
         """Testing FunctionSpy in inspect.getargspec() with unbound method"""
         self.agency.spy_on(MathClass.do_math)
@@ -1672,6 +1704,7 @@ class FunctionSpyTests(TestCase):
         self.assertEqual(keywords, 'kwargs')
         self.assertEqual(defaults, (1, 2))
 
+    @require_getargspec
     def test_getargspec_with_classmethod(self):
         """Testing FunctionSpy in inspect.getargspec() with classmethod"""
         obj = MathClass()
diff --git a/kgb/tests/test_ops.py b/kgb/tests/test_ops.py
index f2de9c9aa34147d5295a20830f43b497b808d2ee..84b8cc65799884387d77ad85933b2fe82840a3ad 100644
--- a/kgb/tests/test_ops.py
+++ b/kgb/tests/test_ops.py
@@ -311,7 +311,7 @@ class SpyOpMatchAnyTests(TestCase):
             'do_math was not called with any expected arguments.'
         )
 
-        with self.assertRaisesRegexp(AssertionError, expected_message):
+        with self.assertRaisesRegex(AssertionError, expected_message):
             obj.do_math(a=4, b=9)
 
 
@@ -532,7 +532,7 @@ class SpyOpMatchInOrderTests(TestCase):
             "kwargs={'a': 4, 'b': 9}"
         )
 
-        with self.assertRaisesRegexp(AssertionError, expected_message):
+        with self.assertRaisesRegex(AssertionError, expected_message):
             obj.do_math(a=4, b=9)
 
     def test_with_extra_call(self):
@@ -558,7 +558,7 @@ class SpyOpMatchInOrderTests(TestCase):
             "returned=None, raised=None)>"
         )
 
-        with self.assertRaisesRegexp(UnexpectedCallError, expected_message):
+        with self.assertRaisesRegex(UnexpectedCallError, expected_message):
             obj.do_math(a=4, b=9)
 
 
@@ -574,7 +574,7 @@ class SpyOpRaiseTests(TestCase):
             do_math,
             op=SpyOpRaise(ValueError('foo')))
 
-        with self.assertRaisesRegexp(ValueError, 'foo'):
+        with self.assertRaisesRegex(ValueError, 'foo'):
             do_math(5, 3)
 
     def test_with_classmethod(self):
@@ -584,7 +584,7 @@ class SpyOpRaiseTests(TestCase):
             owner=MathClass,
             op=SpyOpRaise(ValueError('foo')))
 
-        with self.assertRaisesRegexp(ValueError, 'foo'):
+        with self.assertRaisesRegex(ValueError, 'foo'):
             MathClass.class_do_math(5, 3)
 
     def test_with_unbound_method(self):
@@ -596,7 +596,7 @@ class SpyOpRaiseTests(TestCase):
 
         obj = MathClass()
 
-        with self.assertRaisesRegexp(ValueError, 'foo'):
+        with self.assertRaisesRegex(ValueError, 'foo'):
             obj.do_math(a=4, b=3)
 
 
@@ -661,7 +661,7 @@ class SpyOpReturnInOrderTests(TestCase):
             "raised=None)>"
         )
 
-        with self.assertRaisesRegexp(UnexpectedCallError, message):
+        with self.assertRaisesRegex(UnexpectedCallError, message):
             do_math(5, 3)
 
     def test_with_classmethod(self):
@@ -685,7 +685,7 @@ class SpyOpReturnInOrderTests(TestCase):
             "'b': 3}, returned=None, raised=None)>"
         )
 
-        with self.assertRaisesRegexp(UnexpectedCallError, message):
+        with self.assertRaisesRegex(UnexpectedCallError, message):
             MathClass.class_do_math(5, 3)
 
     def test_with_unbound_method(self):
@@ -711,5 +711,5 @@ class SpyOpReturnInOrderTests(TestCase):
             "'b': 3}, returned=None, raised=None)>"
         )
 
-        with self.assertRaisesRegexp(UnexpectedCallError, message):
+        with self.assertRaisesRegex(UnexpectedCallError, message):
             obj.do_math(a=4, b=3)
