diff --git a/tests/postgres_tests/test_array.py b/tests/postgres_tests/test_array.py
index 020b3165..f8503c8c 100644
--- a/tests/postgres_tests/test_array.py
+++ b/tests/postgres_tests/test_array.py
@@ -3,8 +3,15 @@ import json
 import unittest
 import uuid
 
-from django.contrib.postgres.fields import ArrayField
-from django.contrib.postgres.forms import SimpleArrayField, SplitArrayField
+try:
+    import psycopg2
+except ImportError:
+    psycopg2 = None
+
+if psycopg2:
+    from django.contrib.postgres.fields import ArrayField
+    from django.contrib.postgres.forms import SimpleArrayField, SplitArrayField
+
 from django.core import exceptions, serializers
 from django.core.management import call_command
 from django.db import models, IntegrityError, connection
@@ -12,13 +19,14 @@ from django import forms
 from django.test import TestCase, override_settings
 from django.utils import timezone
 
-from .models import (
-    IntegerArrayModel, NullableIntegerArrayModel, CharArrayModel,
-    DateTimeArrayModel, NestedIntegerArrayModel, OtherTypesArrayModel,
-    ArrayFieldSubclass,
+if psycopg2:
+    from .models import (
+        IntegerArrayModel, NullableIntegerArrayModel, CharArrayModel,
+        DateTimeArrayModel, NestedIntegerArrayModel, OtherTypesArrayModel,
+        ArrayFieldSubclass,
 )
 
-
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 @unittest.skipUnless(connection.vendor == 'postgresql', 'PostgreSQL required')
 class TestSaveLoad(TestCase):
 
@@ -95,6 +103,7 @@ class TestSaveLoad(TestCase):
         self.assertEqual(instance.decimals, loaded.decimals)
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 @unittest.skipUnless(connection.vendor == 'postgresql', 'PostgreSQL required')
 class TestQuerying(TestCase):
 
@@ -227,6 +236,7 @@ class TestQuerying(TestCase):
         )
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 class TestChecks(TestCase):
 
     def test_field_checks(self):
@@ -244,6 +254,7 @@ class TestChecks(TestCase):
         self.assertEqual(errors[0].id, 'postgres.E002')
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 class TestMigrations(TestCase):
 
     def test_deconstruct(self):
@@ -282,6 +293,7 @@ class TestMigrations(TestCase):
         call_command('migrate', 'postgres_tests', verbosity=0)
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 @unittest.skipUnless(connection.vendor == 'postgresql', 'PostgreSQL required')
 class TestSerialization(TestCase):
     test_data = '[{"fields": {"field": "[\\"1\\", \\"2\\"]"}, "model": "postgres_tests.integerarraymodel", "pk": null}]'
@@ -296,6 +308,7 @@ class TestSerialization(TestCase):
         self.assertEqual(instance.field, [1, 2])
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 class TestValidation(TestCase):
 
     def test_unbounded(self):
@@ -326,6 +339,7 @@ class TestValidation(TestCase):
         self.assertEqual(cm.exception.messages[0], 'Nested arrays must have the same length.')
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 class TestSimpleFormField(TestCase):
 
     def test_valid(self):
@@ -398,6 +412,7 @@ class TestSimpleFormField(TestCase):
         self.assertEqual(form_field.max_length, 4)
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 class TestSplitFormField(TestCase):
 
     def test_valid(self):
diff --git a/tests/postgres_tests/test_hstore.py b/tests/postgres_tests/test_hstore.py
index ac22f322..eece6113 100644
--- a/tests/postgres_tests/test_hstore.py
+++ b/tests/postgres_tests/test_hstore.py
@@ -1,16 +1,25 @@
 import json
 import unittest
 
-from django.contrib.postgres import forms
-from django.contrib.postgres.fields import HStoreField
-from django.contrib.postgres.validators import KeysValidator
+try:
+    import psycopg2
+except ImportError:
+    psycopg2 = None
+
+if psycopg2:
+    from django.contrib.postgres import forms
+    from django.contrib.postgres.fields import HStoreField
+    from django.contrib.postgres.validators import KeysValidator
+
 from django.core import exceptions, serializers
 from django.db import connection
 from django.test import TestCase
 
-from .models import HStoreModel
+if psycopg2:
+    from .models import HStoreModel
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 @unittest.skipUnless(connection.vendor == 'postgresql', 'PostgreSQL required')
 class SimpleTests(TestCase):
     apps = ['django.contrib.postgres']
@@ -36,6 +45,7 @@ class SimpleTests(TestCase):
         self.assertEqual(reloaded.field, value)
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 @unittest.skipUnless(connection.vendor == 'postgresql', 'PostgreSQL required')
 class TestQuerying(TestCase):
 
@@ -115,6 +125,7 @@ class TestQuerying(TestCase):
         )
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 @unittest.skipUnless(connection.vendor == 'postgresql', 'PostgreSQL required')
 class TestSerialization(TestCase):
     test_data = '[{"fields": {"field": "{\\"a\\": \\"b\\"}"}, "model": "postgres_tests.hstoremodel", "pk": null}]'
@@ -129,6 +140,7 @@ class TestSerialization(TestCase):
         self.assertEqual(instance.field, {'a': 'b'})
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 class TestValidation(TestCase):
 
     def test_not_a_string(self):
@@ -139,6 +151,7 @@ class TestValidation(TestCase):
         self.assertEqual(cm.exception.message % cm.exception.params, 'The value of "a" is not a string.')
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 class TestFormField(TestCase):
 
     def test_valid(self):
@@ -169,6 +182,7 @@ class TestFormField(TestCase):
         self.assertIsInstance(form_field, forms.HStoreField)
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 class TestValidator(TestCase):
 
     def test_simple_valid(self):
diff --git a/tests/postgres_tests/test_ranges.py b/tests/postgres_tests/test_ranges.py
index bc15987b..ab11c64c 100644
--- a/tests/postgres_tests/test_ranges.py
+++ b/tests/postgres_tests/test_ranges.py
@@ -3,16 +3,25 @@ import json
 import unittest
 
 from django import forms
-from django.contrib.postgres import forms as pg_forms, fields as pg_fields
-from django.contrib.postgres.validators import RangeMaxValueValidator, RangeMinValueValidator
+
+try:
+    import psycopg2
+except ImportError:
+    psycopg2 = None
+
+if psycopg2:
+    from django.contrib.postgres import forms as pg_forms, fields as pg_fields
+    from django.contrib.postgres.validators import RangeMaxValueValidator, RangeMinValueValidator
+
 from django.core import exceptions, serializers
 from django.db import connection
 from django.test import TestCase
 from django.utils import timezone
 
-from psycopg2.extras import NumericRange, DateTimeTZRange, DateRange
+if psycopg2:
+    from psycopg2.extras import NumericRange, DateTimeTZRange, DateRange
 
-from .models import RangesModel
+    from .models import RangesModel
 
 
 def skipUnlessPG92(test):
@@ -24,6 +33,7 @@ def skipUnlessPG92(test):
     return test
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 @skipUnlessPG92
 class TestSaveLoad(TestCase):
 
@@ -86,6 +96,7 @@ class TestSaveLoad(TestCase):
         self.assertEqual(None, loaded.ints)
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 @skipUnlessPG92
 class TestQuerying(TestCase):
 
@@ -190,6 +201,7 @@ class TestQuerying(TestCase):
         )
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 @skipUnlessPG92
 class TestSerialization(TestCase):
     test_data = (
@@ -215,6 +227,7 @@ class TestSerialization(TestCase):
         self.assertEqual(instance.dates, None)
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 class TestValidators(TestCase):
 
     def test_max(self):
@@ -234,6 +247,7 @@ class TestValidators(TestCase):
         self.assertEqual(cm.exception.code, 'min_value')
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 class TestFormField(TestCase):
 
     def test_valid_integer(self):
@@ -376,6 +390,7 @@ class TestFormField(TestCase):
         self.assertIsInstance(form_field, pg_forms.DateTimeRangeField)
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 class TestWidget(TestCase):
     def test_range_widget(self):
         f = pg_forms.ranges.DateTimeRangeField()
diff --git a/tests/postgres_tests/test_unaccent.py b/tests/postgres_tests/test_unaccent.py
index 47ccbda5..b15a9741 100644
--- a/tests/postgres_tests/test_unaccent.py
+++ b/tests/postgres_tests/test_unaccent.py
@@ -6,9 +6,19 @@ import unittest
 from django.db import connection
 from django.test import TestCase, modify_settings
 
-from .models import CharFieldModel, TextFieldModel
+try:
+    import psycopg2
+except ImportError:
+    psycopg2 = None
 
+if psycopg2:
+    from .models import CharFieldModel, TextFieldModel
+else:
+    CharFieldModel = None
+    TextFieldModel = None
 
+
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 @unittest.skipUnless(connection.vendor == 'postgresql', 'PostgreSQL required')
 @modify_settings(INSTALLED_APPS={'append': 'django.contrib.postgres'})
 class UnaccentTest(TestCase):
@@ -57,6 +67,7 @@ class UnaccentTest(TestCase):
         )
 
 
+@unittest.skipIf(psycopg2 is None, 'PostgreSQL required')
 class UnaccentTextFieldTest(UnaccentTest):
     """
     TextField should have the exact same behavior as CharField
