Tests are now functional (only running without syntax errors) on Python 3 too.
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/__init__.py
diff --git a/tests/constants.py b/tests/constants.py
new file mode 100644
index 0000000..6a0d081
--- /dev/null
+++ b/tests/constants.py
@@ -0,0 +1,9 @@
+# -*- coding: utf-8 -*-
+
+from rsa._compat import have_python3
+
+if have_python3:
+    from py3kconstants import *
+else:
+    from py2kconstants import *
+
diff --git a/tests/py2kconstants.py b/tests/py2kconstants.py
new file mode 100644
index 0000000..5f695dd
--- /dev/null
+++ b/tests/py2kconstants.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+unicode_string = u"Euro=\u20ac ABCDEFGHIJKLMNOPQRSTUVWXYZ"
diff --git a/tests/py3kconstants.py b/tests/py3kconstants.py
new file mode 100644
index 0000000..83b6712
--- /dev/null
+++ b/tests/py3kconstants.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+unicode_string = "Euro=\u20ac ABCDEFGHIJKLMNOPQRSTUVWXYZ"
diff --git a/tests/test_bigfile.py b/tests/test_bigfile.py
index 30156a1..39bd095 100644
--- a/tests/test_bigfile.py
+++ b/tests/test_bigfile.py
@@ -1,6 +1,9 @@
 '''Tests block operations.'''
 
-from StringIO import StringIO
+try:
+    from StringIO import StringIO
+except ImportError:
+    from io import StringIO
 import unittest
 
 import rsa
diff --git a/tests/test_integers.py b/tests/test_integers.py
index 111f8ab..d4fa087 100644
--- a/tests/test_integers.py
+++ b/tests/test_integers.py
@@ -12,13 +12,13 @@
     def test_enc_dec(self):
 
         message = 42
-        print "\tMessage:   %d" % message
+        print("\tMessage:   %d" % message)
 
         encrypted = rsa.core.encrypt_int(message, self.pub.e, self.pub.n)
-        print "\tEncrypted: %d" % encrypted
+        print("\tEncrypted: %d" % encrypted)
 
         decrypted = rsa.core.decrypt_int(encrypted, self.priv.d, self.pub.n)
-        print "\tDecrypted: %d" % decrypted
+        print("\tDecrypted: %d" % decrypted)
 
         self.assertEqual(message, decrypted)
 
@@ -27,10 +27,10 @@
         message = 42
 
         signed = rsa.core.encrypt_int(message,self.priv.d, self.pub.n)
-        print "\tSigned:    %d" % signed
+        print("\tSigned:    %d" % signed)
 
         verified = rsa.core.decrypt_int(signed, self.pub.e,self.pub.n)
-        print "\tVerified:  %d" % verified
+        print("\tVerified:  %d" % verified)
 
         self.assertEqual(message, verified)
 
diff --git a/tests/test_load_save_keys.py b/tests/test_load_save_keys.py
index 466a3f5..56d45c4 100644
--- a/tests/test_load_save_keys.py
+++ b/tests/test_load_save_keys.py
@@ -2,16 +2,17 @@
 
 import base64
 import unittest
+from rsa._compat import b
 
 import rsa.key
 
-B64PRIV_DER = 'MC4CAQACBQDeKYlRAgMBAAECBQDHn4npAgMA/icCAwDfxwIDANcXAgInbwIDAMZt'
+B64PRIV_DER = b('MC4CAQACBQDeKYlRAgMBAAECBQDHn4npAgMA/icCAwDfxwIDANcXAgInbwIDAMZt')
 PRIVATE_DER = base64.decodestring(B64PRIV_DER)
 
-B64PUB_DER = 'MAwCBQDeKYlRAgMBAAE='
+B64PUB_DER = b('MAwCBQDeKYlRAgMBAAE=')
 PUBLIC_DER = base64.decodestring(B64PUB_DER)
 
-PRIVATE_PEM = '''
+PRIVATE_PEM = b('''
 -----BEGIN CONFUSING STUFF-----
 Cruft before the key
 
@@ -23,15 +24,15 @@
 
 Stuff after the key
 -----END CONFUSING STUFF-----
-''' % B64PRIV_DER
+''' % B64PRIV_DER)
 
-CLEAN_PRIVATE_PEM = '''\
+CLEAN_PRIVATE_PEM = b('''\
 -----BEGIN RSA PRIVATE KEY-----
 %s
 -----END RSA PRIVATE KEY-----
-''' % B64PRIV_DER
+''' % B64PRIV_DER)
 
-PUBLIC_PEM = '''
+PUBLIC_PEM = b('''
 -----BEGIN CONFUSING STUFF-----
 Cruft before the key
 
@@ -43,13 +44,13 @@
 
 Stuff after the key
 -----END CONFUSING STUFF-----
-''' % B64PUB_DER
+''' % B64PUB_DER)
 
-CLEAN_PUBLIC_PEM = '''\
+CLEAN_PUBLIC_PEM = b('''\
 -----BEGIN RSA PUBLIC KEY-----
 %s
 -----END RSA PUBLIC KEY-----
-''' % B64PUB_DER
+''' % B64PUB_DER)
 
 
 class DerTest(unittest.TestCase):
diff --git a/tests/test_pkcs1.py b/tests/test_pkcs1.py
index 3392ed7..c841485 100644
--- a/tests/test_pkcs1.py
+++ b/tests/test_pkcs1.py
@@ -14,13 +14,13 @@
     def test_enc_dec(self):
 
         message = struct.pack('>IIII', 0, 0, 0, 1)
-        print "\tMessage:   %r" % message
+        print("\tMessage:   %r" % message)
 
         encrypted = pkcs1.encrypt(message, self.pub)
-        print "\tEncrypted: %r" % encrypted
+        print("\tEncrypted: %r" % encrypted)
 
         decrypted = pkcs1.decrypt(encrypted, self.priv)
-        print "\tDecrypted: %r" % decrypted
+        print("\tDecrypted: %r" % decrypted)
 
         self.assertEqual(message, decrypted)
 
@@ -55,10 +55,10 @@
         '''Test happy flow of sign and verify'''
         
         message = 'je moeder'
-        print "\tMessage:   %r" % message
+        print("\tMessage:   %r" % message)
 
         signature = pkcs1.sign(message, self.priv, 'SHA-256')
-        print "\tSignature: %r" % signature
+        print("\tSignature: %r" % signature)
 
         pkcs1.verify(message, signature, self.pub)
 
@@ -88,4 +88,3 @@
         
         self.assertEqual(signature1, signature2)
 
-        
\ No newline at end of file
diff --git a/tests/test_strings.py b/tests/test_strings.py
index 38fae06..58d3833 100644
--- a/tests/test_strings.py
+++ b/tests/test_strings.py
@@ -1,9 +1,13 @@
 '''Tests string operations.'''
 
+from __future__ import absolute_import
+
 import unittest
 
 import rsa
 
+from tests.constants import unicode_string
+
 class StringTest(unittest.TestCase):
 
     def setUp(self):
@@ -11,14 +15,14 @@
 
     def test_enc_dec(self):
 
-        message = u"Euro=\u20ac ABCDEFGHIJKLMNOPQRSTUVWXYZ".encode('utf-8')
-        print "\tMessage:   %s" % message
+        message = unicode_string.encode('utf-8')
+        print("\tMessage:   %s" % message)
 
         encrypted = rsa.encrypt(message, self.pub)
-        print "\tEncrypted: %s" % encrypted
+        print("\tEncrypted: %s" % encrypted)
 
         decrypted = rsa.decrypt(encrypted, self.priv)
-        print "\tDecrypted: %s" % decrypted
+        print("\tDecrypted: %s" % decrypted)
 
         self.assertEqual(message, decrypted)
 
diff --git a/tests/test_varblock.py b/tests/test_varblock.py
index d8addb4..6195258 100644
--- a/tests/test_varblock.py
+++ b/tests/test_varblock.py
@@ -1,6 +1,9 @@
 '''Tests varblock operations.'''
 
-from StringIO import StringIO
+try:
+    from StringIO import StringIO
+except ImportError:
+    from io import StringIO
 import unittest
 
 import rsa