diff --git a/tests/basics/iter_of_iter.py b/tests/basics/iter_of_iter.py
index 70282aa97ebf57e1b86c307c41c9665bd560cf65..d775b6a44e8981388a052880d1f3b25008ed5cc8 100644
--- a/tests/basics/iter_of_iter.py
+++ b/tests/basics/iter_of_iter.py
@@ -4,5 +4,4 @@ i = iter(iter([1, 2, 3]))
 print(list(i))
 i = iter(iter({1:2, 3:4, 5:6}))
 print(sorted(i))
-i = iter(iter({1, 2, 3}))
-print(sorted(i))
+# set, see set_iter_of_iter.py
diff --git a/tests/basics/map.py b/tests/basics/map.py
index 62dca44ede800edbd22f18a29592323778329f94..8fce352c2875191e2409a7ca8a776e1146154b2d 100644
--- a/tests/basics/map.py
+++ b/tests/basics/map.py
@@ -1,4 +1,4 @@
 print(list(map(lambda x: x & 1, range(-3, 4))))
 print(list(map(abs, range(-3, 4))))
-print(list(map(set, [[i] for i in range(-3, 4)])))
+print(list(map(tuple, [[i] for i in range(-3, 4)])))
 print(list(map(pow, range(4), range(4))))
diff --git a/tests/basics/memoryview1.py b/tests/basics/memoryview1.py
index 1cd411195df43039c514f39d7b15cc82db4f2633..019a1179f8abfc2b54fedbb12b807af249cca582 100644
--- a/tests/basics/memoryview1.py
+++ b/tests/basics/memoryview1.py
@@ -1,4 +1,10 @@
 # test memoryview
+try:
+    memoryview
+except:
+    import sys
+    print("SKIP")
+    sys.exit()
 
 # test reading from bytes
 b = b'1234'
diff --git a/tests/basics/memoryview2.py b/tests/basics/memoryview2.py
index 5117d7a680c1ffe2a9537454c11208e898d5196e..edb7c9e64025d868bd66f8e9e77c9c0af572724f 100644
--- a/tests/basics/memoryview2.py
+++ b/tests/basics/memoryview2.py
@@ -1,6 +1,11 @@
 # test memoryview accessing maximum values for signed/unsigned elements
-
-from array import array
+try:
+    from array import array
+    memoryview
+except:
+    import sys
+    print("SKIP")
+    sys.exit()
 
 print(list(memoryview(b'\x7f\x80\x81\xff')))
 print(list(memoryview(array('b', [0x7f, -0x80]))))
diff --git a/tests/basics/memoryview_gc.py b/tests/basics/memoryview_gc.py
index a1e4baad479ba15585712d3b5dbda7c1429a33f3..9d4857e362822db94a818130e6b4c668cd9a8601 100644
--- a/tests/basics/memoryview_gc.py
+++ b/tests/basics/memoryview_gc.py
@@ -1,4 +1,10 @@
 # test memoryview retains pointer to original object/buffer
+try:
+    memoryview
+except:
+    import sys
+    print("SKIP")
+    sys.exit()
 
 b = bytearray(10)
 m = memoryview(b)[1:]
diff --git a/tests/basics/namedtuple1.py b/tests/basics/namedtuple1.py
index 346e32fbfced082c77ef94d0e882ab00e16238cb..132dcf96b37af6b9fc9b35db09a1594abf6a06c5 100644
--- a/tests/basics/namedtuple1.py
+++ b/tests/basics/namedtuple1.py
@@ -1,7 +1,12 @@
 try:
-    from collections import namedtuple
+    try:
+        from collections import namedtuple
+    except ImportError:
+        from ucollections import namedtuple
 except ImportError:
-    from ucollections import namedtuple
+    import sys
+    print("SKIP")
+    sys.exit()
 
 T = namedtuple("Tup", ["foo", "bar"])
 # CPython prints fully qualified name, what we don't bother to do so far
diff --git a/tests/basics/object_new.py b/tests/basics/object_new.py
index befb5bfc27bde4b04d22cd4f368246111033f601..568feccda4803abfd92459ac5d055d786bff3b57 100644
--- a/tests/basics/object_new.py
+++ b/tests/basics/object_new.py
@@ -2,6 +2,14 @@
 # (non-initialized) instance of class.
 # See e.g. http://infohost.nmt.edu/tcc/help/pubs/python/web/new-new-method.html
 # TODO: Find reference in CPython docs
+try:
+    # If we don't expose object.__new__ (small ports), there's
+    # nothing to test.
+    object.__new__
+except AttributeError:
+    import sys
+    print("SKIP")
+    sys.exit()
 
 class Foo:
 
diff --git a/tests/basics/op_error.py b/tests/basics/op_error.py
index 19ce04bc520ce2af16e94bb260feacfd0106f50b..5ba6a80e26d69d94a41e17cc8dbd233f72027248 100644
--- a/tests/basics/op_error.py
+++ b/tests/basics/op_error.py
@@ -20,7 +20,6 @@ test_exc("False in True", TypeError)
 test_exc("1 * {}", TypeError)
 test_exc("1 in 1", TypeError)
 test_exc("bytearray() // 2", TypeError)
-test_exc("m = memoryview(bytearray())\nm += bytearray()", TypeError)
 
 # object with buffer protocol needed on rhs
 test_exc("bytearray(1) + 1", TypeError)
diff --git a/tests/basics/op_error_memoryview.py b/tests/basics/op_error_memoryview.py
new file mode 100644
index 0000000000000000000000000000000000000000..658ededc80207833eacd832468f9a43d8a948be3
--- /dev/null
+++ b/tests/basics/op_error_memoryview.py
@@ -0,0 +1,19 @@
+# test errors from bad operations (unary, binary, etc)
+try:
+    memoryview
+except:
+    import sys
+    print("SKIP")
+    sys.exit()
+
+def test_exc(code, exc):
+    try:
+        exec(code)
+        print("no exception")
+    except exc:
+        print("right exception")
+    except:
+        print("wrong exception")
+
+# unsupported binary operators
+test_exc("m = memoryview(bytearray())\nm += bytearray()", TypeError)
diff --git a/tests/basics/set_iter_of_iter.py b/tests/basics/set_iter_of_iter.py
new file mode 100644
index 0000000000000000000000000000000000000000..e3e91fa4561ac1dd83f65ff1012cb4e77977287a
--- /dev/null
+++ b/tests/basics/set_iter_of_iter.py
@@ -0,0 +1,2 @@
+i = iter(iter({1, 2, 3}))
+print(sorted(i))
diff --git a/tests/basics/special_methods.py b/tests/basics/special_methods.py
index 1df7a7c4c7a6bec8c7426b079c692b768b9d7987..9f57247c12f1f63bc1c8ec5bc171e448d3089e46 100644
--- a/tests/basics/special_methods.py
+++ b/tests/basics/special_methods.py
@@ -105,42 +105,4 @@ cud1 > cud2
 cud1 + cud2
 cud1 - cud2
 
-# the following require MICROPY_PY_ALL_SPECIAL_METHODS
-+cud1
--cud1
-~cud1
-cud1 * cud2
-cud1 / cud2
-cud2 // cud1
-cud1 += cud2
-cud1 -= cud2
-
-# TODO: the following operations are not supported on every ports
-#
-# ne is not supported, !(eq) is called instead
-#cud1 != cud2
-#
-# binary and is not supported
-# cud1 & cud2
-#
-# binary lshift is not supported
-# cud1<<1
-#
-# modulus is not supported
-# cud1 % 2
-#
-# binary or is not supported
-# cud1 | cud2
-#
-# pow is not supported
-# cud1**2
-#
-# rshift is not suported
-# cud1>>1
-#
-# xor is not supported
-# cud1^cud2
-#
-# in the followin test, cpython still calls __eq__
-# cud3=cud1
-# cud3==cud1
+# more in special_methods2.py
diff --git a/tests/basics/special_methods2.py b/tests/basics/special_methods2.py
new file mode 100644
index 0000000000000000000000000000000000000000..3623b30dcc5aacf5d3af5014f6d1c35bdd9581f1
--- /dev/null
+++ b/tests/basics/special_methods2.py
@@ -0,0 +1,145 @@
+class Cud():
+
+    def __init__(self):
+        #print("__init__ called")
+        pass
+
+    def __repr__(self):
+        print("__repr__ called")
+        return ""
+
+    def __lt__(self, other):
+        print("__lt__ called")
+
+    def __le__(self, other):
+        print("__le__ called")
+
+    def __eq__(self, other):
+        print("__eq__ called")
+
+    def __ne__(self, other):
+        print("__ne__ called")
+
+    def __ge__(self, other):
+        print("__ge__ called")
+
+    def __gt__(self, other):
+        print("__gt__ called")
+
+    def __abs__(self):
+        print("__abs__ called")
+
+    def __add__(self, other):
+        print("__add__ called")
+
+    def __and__(self, other):
+        print("__and__ called")
+
+    def __floordiv__(self, other):
+        print("__floordiv__ called")
+
+    def __index__(self, other):
+        print("__index__ called")
+
+    def __inv__(self):
+        print("__inv__ called")
+
+    def __invert__(self):
+        print("__invert__ called")
+
+    def __lshift__(self, val):
+        print("__lshift__ called")
+
+    def __mod__(self, val):
+        print("__mod__ called")
+
+    def __mul__(self, other):
+        print("__mul__ called")
+
+    def __matmul__(self, other):
+        print("__matmul__ called")
+
+    def __neg__(self):
+        print("__neg__ called")
+
+    def __or__(self, other):
+        print("__or__ called")
+
+    def __pos__(self):
+        print("__pos__ called")
+
+    def __pow__(self, val):
+        print("__pow__ called")
+
+    def __rshift__(self, val):
+        print("__rshift__ called")
+
+    def __sub__(self, other):
+        print("__sub__ called")
+
+    def __truediv__(self, other):
+        print("__truediv__ called")
+
+    def __div__(self, other):
+        print("__div__ called")
+
+    def __xor__(self, other):
+        print("__xor__ called")
+
+    def __iadd__(self, other):
+        print("__iadd__ called")
+        return self
+
+    def __isub__(self, other):
+        print("__isub__ called")
+        return self
+
+cud1 = Cud()
+cud2 = Cud()
+
+try:
+    +cud1
+except TypeError:
+    import sys
+    print("SKIP")
+    sys.exit()
+
+# the following require MICROPY_PY_ALL_SPECIAL_METHODS
++cud1
+-cud1
+~cud1
+cud1 * cud2
+cud1 / cud2
+cud2 // cud1
+cud1 += cud2
+cud1 -= cud2
+
+# TODO: the following operations are not supported on every ports
+#
+# ne is not supported, !(eq) is called instead
+#cud1 != cud2
+#
+# binary and is not supported
+# cud1 & cud2
+#
+# binary lshift is not supported
+# cud1<<1
+#
+# modulus is not supported
+# cud1 % 2
+#
+# binary or is not supported
+# cud1 | cud2
+#
+# pow is not supported
+# cud1**2
+#
+# rshift is not suported
+# cud1>>1
+#
+# xor is not supported
+# cud1^cud2
+#
+# in the followin test, cpython still calls __eq__
+# cud3=cud1
+# cud3==cud1
diff --git a/tests/basics/subclass_classmethod.py b/tests/basics/subclass_classmethod.py
index ae5fbd1aa354f724f98614b2eff666e9a9772c98..48f164b3644d932207af98d620b4063b8e7a9372 100644
--- a/tests/basics/subclass_classmethod.py
+++ b/tests/basics/subclass_classmethod.py
@@ -5,6 +5,13 @@ class Base:
     def foo(cls):
         print(cls.__name__)
 
+try:
+    Base.__name__
+except AttributeError:
+    import sys
+    print("SKIP")
+    sys.exit()
+
 class Sub(Base):
     pass
 
diff --git a/tests/basics/sys1.py b/tests/basics/sys1.py
index 816c8823aa8b9e038b19be6a9f1b631aa6b345cb..29ef974d1413b2e87498339cdd8d53ea433be5d3 100644
--- a/tests/basics/sys1.py
+++ b/tests/basics/sys1.py
@@ -6,8 +6,18 @@ print(sys.__name__)
 print(type(sys.path))
 print(type(sys.argv))
 print(sys.byteorder in ('little', 'big'))
-print(sys.maxsize > 100)
-print(sys.implementation.name in ('cpython', 'micropython'))
+
+try:
+    print(sys.maxsize > 100)
+except AttributeError:
+    # Effectively skip subtests
+    print(True)
+
+try:
+    print(sys.implementation.name in ('cpython', 'micropython'))
+except AttributeError:
+    # Effectively skip subtests
+    print(True)
 
 try:
     sys.exit()