diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py
index b202aa2..31eadd2 100644
--- a/Lib/test/_test_multiprocessing.py
+++ b/Lib/test/_test_multiprocessing.py
@@ -103,6 +103,8 @@
 HAVE_GETVALUE = not getattr(_multiprocessing,
                             'HAVE_BROKEN_SEM_GETVALUE', False)
 
+WIN32 = (sys.platform == "win32")
+
 from multiprocessing.connection import wait
 
 def wait_for_handle(handle, timeout):
@@ -3804,7 +3806,7 @@
 
 class TestInvalidHandle(unittest.TestCase):
 
-    @unittest.skipIf(support.MS_WINDOWS, "skipped on Windows")
+    @unittest.skipIf(WIN32, "skipped on Windows")
     def test_invalid_handles(self):
         conn = multiprocessing.connection.Connection(44977608)
         # check that poll() doesn't crash
@@ -4132,12 +4134,12 @@
 
 class TestInvalidFamily(unittest.TestCase):
 
-    @unittest.skipIf(support.MS_WINDOWS, "skipped on Windows")
+    @unittest.skipIf(WIN32, "skipped on Windows")
     def test_invalid_family(self):
         with self.assertRaises(ValueError):
             multiprocessing.connection.Listener(r'\\.\test')
 
-    @unittest.skipUnless(support.MS_WINDOWS, "skipped on non-Windows platforms")
+    @unittest.skipUnless(WIN32, "skipped on non-Windows platforms")
     def test_invalid_family_win32(self):
         with self.assertRaises(ValueError):
             multiprocessing.connection.Listener('/var/test.pipe')
@@ -4263,7 +4265,7 @@
 class TestCloseFds(unittest.TestCase):
 
     def get_high_socket_fd(self):
-        if support.MS_WINDOWS:
+        if WIN32:
             # The child process will not have any socket handles, so
             # calling socket.fromfd() should produce WSAENOTSOCK even
             # if there is a handle of the same number.
@@ -4281,7 +4283,7 @@
             return fd
 
     def close(self, fd):
-        if support.MS_WINDOWS:
+        if WIN32:
             socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=fd).close()
         else:
             os.close(fd)
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
index b60630a..d8dabd4 100644
--- a/Lib/test/support/__init__.py
+++ b/Lib/test/support/__init__.py
@@ -90,8 +90,8 @@
     "anticipate_failure", "load_package_tests", "detect_api_mismatch",
     "check__all__", "skip_unless_bind_unix_socket",
     # sys
-    "JYTHON", "ANDROID", "check_impl_detail", "unix_shell",
-    "setswitchinterval", "MS_WINDOWS", "MACOS",
+    "is_jython", "is_android", "check_impl_detail", "unix_shell",
+    "setswitchinterval",
     # network
     "HOST", "IPV6_ENABLED", "find_unused_port", "bind_port", "open_urlresource",
     "bind_unix_socket",
@@ -108,21 +108,6 @@
     "run_with_tz", "PGO", "missing_compiler_executable", "fd_count",
     ]
 
-
-# True if Python is running on Microsoft Windows.
-MS_WINDOWS = (sys.platform == 'win32')
-
-# True if Python is running on Apple macOS.
-MACOS = (sys.platform == 'darwin')
-
-# True if Python runs on Jython
-# (Python implemented in Java running in a Java VM)
-JYTHON = sys.platform.startswith('java')
-
-# True if Python runs on Android
-ANDROID = hasattr(sys, 'getandroidapilevel')
-
-
 class Error(Exception):
     """Base class for regression test exceptions."""
 
@@ -499,7 +484,7 @@
             raise ctypes.WinError()
         if not bool(uof.dwFlags & WSF_VISIBLE):
             reason = "gui not available (WSF_VISIBLE flag not set)"
-    elif MACOS:
+    elif sys.platform == 'darwin':
         # The Aqua Tk implementations on OS X can abort the process if
         # being called in an environment where a window server connection
         # cannot be made, for instance when invoked by a buildbot or ssh
@@ -615,7 +600,7 @@
     def decorator(func):
         @functools.wraps(func)
         def wrapper(*args, **kw):
-            if MACOS:
+            if sys.platform == 'darwin':
                 version_txt = platform.mac_ver()[0]
                 try:
                     version = tuple(map(int, version_txt.split('.')))
@@ -803,12 +788,14 @@
 
 requires_lzma = unittest.skipUnless(lzma, 'requires lzma')
 
-if MS_WINDOWS:
-    unix_shell = None
-elif ANDROID:
-    unix_shell = '/system/bin/sh'
+is_jython = sys.platform.startswith('java')
+
+is_android = hasattr(sys, 'getandroidapilevel')
+
+if sys.platform != 'win32':
+    unix_shell = '/system/bin/sh' if is_android else '/bin/sh'
 else:
-    unix_shell = '/bin/sh'
+    unix_shell = None
 
 # Filename used for testing
 if os.name == 'java':
@@ -867,7 +854,7 @@
 
 # TESTFN_UNICODE is a non-ascii filename
 TESTFN_UNICODE = TESTFN + "-\xe0\xf2\u0258\u0141\u011f"
-if MACOS:
+if sys.platform == 'darwin':
     # In Mac OS X's VFS API file names are, by definition, canonically
     # decomposed Unicode, encoded using UTF-8. See QA1173:
     # http://developer.apple.com/mac/library/qa/qa2001/qa1173.html
@@ -879,7 +866,7 @@
 # encoded by the filesystem encoding (in strict mode). It can be None if we
 # cannot generate such filename.
 TESTFN_UNENCODABLE = None
-if MS_WINDOWS:
+if os.name == 'nt':
     # skip win32s (0) or Windows 9x/ME (1)
     if sys.getwindowsversion().platform >= 2:
         # Different kinds of characters from various languages to minimize the
@@ -894,8 +881,8 @@
                   'Unicode filename tests may not be effective'
                   % (TESTFN_UNENCODABLE, TESTFN_ENCODING))
             TESTFN_UNENCODABLE = None
-# macOS denies unencodable filenames (invalid utf-8)
-elif not MACOS:
+# Mac OS X denies unencodable filenames (invalid utf-8)
+elif sys.platform != 'darwin':
     try:
         # ascii and utf-8 cannot encode the byte 0xff
         b'\xff'.decode(TESTFN_ENCODING)
@@ -1536,7 +1523,7 @@
     objects to disappear.
     """
     gc.collect()
-    if JYTHON:
+    if is_jython:
         time.sleep(0.1)
     gc.collect()
     gc.collect()
@@ -1995,7 +1982,7 @@
     """Just used to check if docstrings are enabled"""
 
 MISSING_C_DOCSTRINGS = (check_impl_detail() and
-                        not MS_WINDOWS and
+                        sys.platform != 'win32' and
                         not sysconfig.get_config_var('WITH_DOC_STRINGS'))
 
 HAVE_DOCSTRINGS = (_check_docstrings.__doc__ is not None and
@@ -2605,7 +2592,7 @@
                 except (ValueError, OSError):
                     pass
 
-            if MACOS:
+            if sys.platform == 'darwin':
                 # Check if the 'Crash Reporter' on OSX was configured
                 # in 'Developer' mode and warn that it will get triggered
                 # when it is.
@@ -2749,7 +2736,7 @@
     # Setting a very low gil interval on the Android emulator causes python
     # to hang (issue #26939).
     minimum_interval = 1e-5
-    if ANDROID and interval < minimum_interval:
+    if is_android and interval < minimum_interval:
         global _is_android_emulator
         if _is_android_emulator is None:
             _is_android_emulator = (subprocess.check_output(
@@ -2795,7 +2782,7 @@
             pass
 
     old_modes = None
-    if MS_WINDOWS:
+    if sys.platform == 'win32':
         # bpo-25306, bpo-31009: Call CrtSetReportMode() to not kill the process
         # on invalid file descriptor if Python is compiled in debug mode
         try:
diff --git a/Lib/test/test_c_locale_coercion.py b/Lib/test/test_c_locale_coercion.py
index 9e68bf9..1db293b 100644
--- a/Lib/test/test_c_locale_coercion.py
+++ b/Lib/test/test_c_locale_coercion.py
@@ -27,7 +27,7 @@
 
 # Apply some platform dependent overrides
 if sys.platform.startswith("linux"):
-    if test.support.ANDROID:
+    if test.support.is_android:
         # Android defaults to using UTF-8 for all system interfaces
         EXPECTED_C_LOCALE_STREAM_ENCODING = "utf-8"
         EXPECTED_C_LOCALE_FS_ENCODING = "utf-8"
@@ -335,7 +335,7 @@
             # locale environment variables are undefined or empty. When
             # this code path is run with environ['LC_ALL'] == 'C', then
             # LEGACY_LOCALE_WARNING is printed.
-            if (test.support.ANDROID and
+            if (test.support.is_android and
                     _expected_warnings == [CLI_COERCION_WARNING]):
                 _expected_warnings = None
             self._check_child_encoding_details(base_var_dict,
diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py
index f28a4b2..ce14a96 100644
--- a/Lib/test/test_cmd_line.py
+++ b/Lib/test/test_cmd_line.py
@@ -187,8 +187,8 @@
         if not stdout.startswith(pattern):
             raise AssertionError("%a doesn't start with %a" % (stdout, pattern))
 
-    @unittest.skipUnless((support.MACOS or support.ANDROID),
-                         'test specific to macOS and Android')
+    @unittest.skipUnless((sys.platform == 'darwin' or
+                support.is_android), 'test specific to Mac OS X and Android')
     def test_osx_android_utf8(self):
         def check_output(text):
             decoded = text.decode('utf-8', 'surrogateescape')
diff --git a/Lib/test/test_codeop.py b/Lib/test/test_codeop.py
index 8d14ad3..98da26f 100644
--- a/Lib/test/test_codeop.py
+++ b/Lib/test/test_codeop.py
@@ -3,12 +3,12 @@
    Nick Mathewson
 """
 import unittest
-from test import support
+from test.support import is_jython
 
 from codeop import compile_command, PyCF_DONT_IMPLY_DEDENT
 import io
 
-if support.JYTHON:
+if is_jython:
     import sys
 
     def unify_callables(d):
@@ -21,7 +21,7 @@
 
     def assertValid(self, str, symbol='single'):
         '''succeed iff str is a valid piece of code'''
-        if support.JYTHON:
+        if is_jython:
             code = compile_command(str, "<input>", symbol)
             self.assertTrue(code)
             if symbol == "single":
@@ -60,7 +60,7 @@
         av = self.assertValid
 
         # special case
-        if not support.JYTHON:
+        if not is_jython:
             self.assertEqual(compile_command(""),
                              compile("pass", "<input>", 'single',
                                      PyCF_DONT_IMPLY_DEDENT))
diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py
index 4922b00..d6dc4ba 100644
--- a/Lib/test/test_faulthandler.py
+++ b/Lib/test/test_faulthandler.py
@@ -6,7 +6,7 @@
 import subprocess
 import sys
 from test import support
-from test.support import script_helper
+from test.support import script_helper, is_android
 import tempfile
 import threading
 import unittest
@@ -18,6 +18,7 @@
     _testcapi = None
 
 TIMEOUT = 0.5
+MS_WINDOWS = (os.name == 'nt')
 
 def expected_traceback(lineno1, lineno2, header, min_count=1):
     regex = header
@@ -30,7 +31,7 @@
 
 def skip_segfault_on_android(test):
     # Issue #32138: Raising SIGSEGV on Android may not cause a crash.
-    return unittest.skipIf(support.ANDROID,
+    return unittest.skipIf(is_android,
                            'raising SIGSEGV on Android is unreliable')(test)
 
 @contextmanager
@@ -120,7 +121,7 @@
     @unittest.skipIf(sys.platform.startswith('aix'),
                      "the first page of memory is a mapped read-only on AIX")
     def test_read_null(self):
-        if not support.MS_WINDOWS:
+        if not MS_WINDOWS:
             self.check_fatal_error("""
                 import faulthandler
                 faulthandler.enable()
@@ -731,7 +732,7 @@
             with self.check_stderr_none():
                 faulthandler.register(signal.SIGUSR1)
 
-    @unittest.skipUnless(support.MS_WINDOWS, 'specific to Windows')
+    @unittest.skipUnless(MS_WINDOWS, 'specific to Windows')
     def test_raise_exception(self):
         for exc, name in (
             ('EXCEPTION_ACCESS_VIOLATION', 'access violation'),
@@ -746,7 +747,7 @@
                 3,
                 name)
 
-    @unittest.skipUnless(support.MS_WINDOWS, 'specific to Windows')
+    @unittest.skipUnless(MS_WINDOWS, 'specific to Windows')
     def test_ignore_exception(self):
         for exc_code in (
             0xE06D7363,   # MSC exception ("Emsc")
@@ -762,7 +763,7 @@
             self.assertEqual(output, [])
             self.assertEqual(exitcode, exc_code)
 
-    @unittest.skipUnless(support.MS_WINDOWS, 'specific to Windows')
+    @unittest.skipUnless(MS_WINDOWS, 'specific to Windows')
     def test_raise_nonfatal_exception(self):
         # These exceptions are not strictly errors. Letting
         # faulthandler display the traceback when they are
@@ -790,7 +791,7 @@
             self.assertIn(exitcode,
                           (exc, exc & ~0x10000000))
 
-    @unittest.skipUnless(support.MS_WINDOWS, 'specific to Windows')
+    @unittest.skipUnless(MS_WINDOWS, 'specific to Windows')
     def test_disable_windows_exc_handler(self):
         code = dedent("""
             import faulthandler
diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py
index a917259..fb9453a 100644
--- a/Lib/test/test_import/__init__.py
+++ b/Lib/test/test_import/__init__.py
@@ -20,7 +20,7 @@
 
 import test.support
 from test.support import (
-    EnvironmentVarGuard, TESTFN, check_warnings, forget, JYTHON,
+    EnvironmentVarGuard, TESTFN, check_warnings, forget, is_jython,
     make_legacy_pyc, rmtree, run_unittest, swap_attr, swap_item, temp_umask,
     unlink, unload, create_empty_file, cpython_only, TESTFN_UNENCODABLE,
     temp_dir, DirsOnSysPath)
@@ -148,7 +148,7 @@
         def test_with_extension(ext):
             # The extension is normally ".py", perhaps ".pyw".
             source = TESTFN + ext
-            if JYTHON:
+            if is_jython:
                 pyc = TESTFN + "$py.class"
             else:
                 pyc = TESTFN + ".pyc"
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index d84605e..286ae76 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -583,7 +583,7 @@
         # On Windows and Mac OSX this test consumes large resources; It takes
         # a long time to build the >2 GiB file and takes >2 GiB of disk space
         # therefore the resource must be enabled to run this test.
-        if support.MS_WINDOWS or support.MACOS:
+        if sys.platform[:3] == 'win' or sys.platform == 'darwin':
             support.requires(
                 'largefile',
                 'test requires %s bytes and a long time to run' % self.LARGE)
diff --git a/Lib/test/test_largefile.py b/Lib/test/test_largefile.py
index 25b8ff0..21296cc 100644
--- a/Lib/test/test_largefile.py
+++ b/Lib/test/test_largefile.py
@@ -5,7 +5,6 @@
 import stat
 import sys
 import unittest
-from test import support
 from test.support import TESTFN, requires, unlink
 import io  # C implementation of io
 import _pyio as pyio # Python implementation of io
@@ -146,7 +145,7 @@
     # takes a long time to build the >2 GiB file and takes >2 GiB of disk
     # space therefore the resource must be enabled to run this test.
     # If not, nothing after this line stanza will be executed.
-    if support.MS_WINDOWS or support.MACOS:
+    if sys.platform[:3] == 'win' or sys.platform == 'darwin':
         requires('largefile',
                  'test requires %s bytes and a long time to run' % str(size))
     else:
diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py
index 11bf254..e2c2178 100644
--- a/Lib/test/test_locale.py
+++ b/Lib/test/test_locale.py
@@ -1,10 +1,9 @@
-import codecs
+from test.support import verbose, is_android, check_warnings
+import unittest
 import locale
 import sys
-import unittest
+import codecs
 import warnings
-from test import support
-
 
 class BaseLocalizedTest(unittest.TestCase):
     #
@@ -13,7 +12,7 @@
 
     @classmethod
     def setUpClass(cls):
-        if support.MACOS:
+        if sys.platform == 'darwin':
             import os
             tlocs = ("en_US.UTF-8", "en_US.ISO8859-1", "en_US")
             if int(os.uname().release.split('.')[0]) < 10:
@@ -45,7 +44,7 @@
         oldlocale = locale.setlocale(self.locale_type)
         self.addCleanup(locale.setlocale, self.locale_type, oldlocale)
         locale.setlocale(self.locale_type, self.enUS_locale)
-        if support.verbose:
+        if verbose:
             print("testing with %r..." % self.enUS_locale, end=' ', flush=True)
 
 
@@ -145,7 +144,7 @@
             func(format, value, **format_opts), out)
 
     def _test_format(self, format, value, out, **format_opts):
-        with support.check_warnings(('', DeprecationWarning)):
+        with check_warnings(('', DeprecationWarning)):
             self._test_formatfunc(format, value, out,
                 func=locale.format, **format_opts)
 
@@ -234,7 +233,7 @@
     # Test handling of pattern argument of format
 
     def test_onlyOnePattern(self):
-        with support.check_warnings(('', DeprecationWarning)):
+        with check_warnings(('', DeprecationWarning)):
             # Issue 2522: accept exactly one % pattern, and no extra chars.
             self.assertRaises(ValueError, locale.format, "%f\n", 'foo')
             self.assertRaises(ValueError, locale.format, "%f\r", 'foo')
@@ -366,7 +365,7 @@
         enc = codecs.lookup(locale.getpreferredencoding(False) or 'ascii').name
         if enc not in ('utf-8', 'iso8859-1', 'cp1252'):
             raise unittest.SkipTest('encoding not suitable')
-        if enc != 'iso8859-1' and (support.MACOS or support.ANDROID or
+        if enc != 'iso8859-1' and (sys.platform == 'darwin' or is_android or
                                    sys.platform.startswith('freebsd')):
             raise unittest.SkipTest('wcscoll/wcsxfrm have known bugs')
         BaseLocalizedTest.setUp(self)
@@ -527,7 +526,7 @@
             # Unsupported locale on this system
             self.skipTest('test needs Turkish locale')
         loc = locale.getlocale(locale.LC_CTYPE)
-        if support.verbose:
+        if verbose:
             print('testing with %a' % (loc,), end=' ', flush=True)
         locale.setlocale(locale.LC_CTYPE, loc)
         self.assertEqual(loc, locale.getlocale(locale.LC_CTYPE))
diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py
index dfae4a8..7e3e401 100644
--- a/Lib/test/test_platform.py
+++ b/Lib/test/test_platform.py
@@ -270,7 +270,9 @@
         res = platform.libc_ver(executable)
 
     def test_popen(self):
-        if support.MS_WINDOWS:
+        mswindows = (sys.platform == "win32")
+
+        if mswindows:
             command = '"{}" -c "print(\'Hello\')"'.format(sys.executable)
         else:
             command = "'{}' -c 'print(\"Hello\")'".format(sys.executable)
@@ -282,7 +284,7 @@
                 self.assertEqual(hello, "Hello")
 
         data = 'plop'
-        if support.MS_WINDOWS:
+        if mswindows:
             command = '"{}" -c "import sys; data=sys.stdin.read(); exit(len(data))"'
         else:
             command = "'{}' -c 'import sys; data=sys.stdin.read(); exit(len(data))'"
diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py
index b3b3e66..7e0a329 100644
--- a/Lib/test/test_shutil.py
+++ b/Lib/test/test_shutil.py
@@ -33,6 +33,7 @@
 from test.support import TESTFN, FakePath
 
 TESTFN2 = TESTFN + "2"
+MACOS = sys.platform.startswith("darwin")
 try:
     import grp
     import pwd
@@ -1807,7 +1808,7 @@
 
         self.assertRaises(OSError, shutil.copyfile, 'srcfile', 'destfile')
 
-    @unittest.skipIf(support.MACOS, "skipped on macOS")
+    @unittest.skipIf(MACOS, "skipped on macOS")
     def test_w_dest_open_fails(self):
 
         srcfile = self.Faux()
@@ -1827,7 +1828,7 @@
         self.assertEqual(srcfile._exited_with[1].args,
                          ('Cannot open "destfile"',))
 
-    @unittest.skipIf(support.MACOS, "skipped on macOS")
+    @unittest.skipIf(MACOS, "skipped on macOS")
     def test_w_dest_close_fails(self):
 
         srcfile = self.Faux()
@@ -1850,7 +1851,7 @@
         self.assertEqual(srcfile._exited_with[1].args,
                          ('Cannot close',))
 
-    @unittest.skipIf(support.MACOS, "skipped on macOS")
+    @unittest.skipIf(MACOS, "skipped on macOS")
     def test_w_source_close_fails(self):
 
         srcfile = self.Faux(True)
@@ -2184,7 +2185,7 @@
             shutil._HAS_SENDFILE = True
 
 
-@unittest.skipIf(not support.MACOS, 'macOS only')
+@unittest.skipIf(not MACOS, 'macOS only')
 class TestZeroCopyMACOS(_ZeroCopyFileTest, unittest.TestCase):
     PATCHPOINT = "posix._fcopyfile"
 
diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
index 44966e4..f377ebc 100644
--- a/Lib/test/test_socket.py
+++ b/Lib/test/test_socket.py
@@ -1038,7 +1038,7 @@
             eq(udpport, port)
         # Now make sure the lookup by port returns the same service name
         # Issue #26936: Android getservbyport() is broken.
-        if not support.ANDROID:
+        if not support.is_android:
             eq(socket.getservbyport(port2), service)
         eq(socket.getservbyport(port, 'tcp'), service)
         if udpport is not None:
diff --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py
index 3105c74..de2773f 100644
--- a/Lib/test/test_strptime.py
+++ b/Lib/test/test_strptime.py
@@ -521,7 +521,7 @@
                         "Calculation of day of the week failed;"
                          "%s != %s" % (result.tm_wday, self.time_tuple.tm_wday))
 
-    if support.ANDROID:
+    if support.is_android:
         # Issue #26929: strftime() on Android incorrectly formats %V or %G for
         # the last or the first incomplete week in a year.
         _ymd_excluded = ((1905, 1, 1), (1906, 12, 31), (2008, 12, 29),
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index 569e3e0..4b089f5 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -35,11 +35,13 @@
 if support.PGO:
     raise unittest.SkipTest("test is not helpful for PGO")
 
+mswindows = (sys.platform == "win32")
+
 #
 # Depends on the following external programs: Python
 #
 
-if support.MS_WINDOWS:
+if mswindows:
     SETBINARY = ('import msvcrt; msvcrt.setmode(sys.stdout.fileno(), '
                                                 'os.O_BINARY);')
 else:
@@ -312,7 +314,7 @@
                           self._assert_python, pre_args,
                           executable=NONEXISTING_CMD[0])
 
-    @unittest.skipIf(support.MS_WINDOWS, "executable argument replaces shell")
+    @unittest.skipIf(mswindows, "executable argument replaces shell")
     def test_executable_replaces_shell(self):
         # Check that the executable argument replaces the default shell
         # when shell=True.
@@ -361,7 +363,7 @@
         temp_dir = self._normalize_cwd(temp_dir)
         self._assert_cwd(temp_dir, sys.executable, cwd=FakePath(temp_dir))
 
-    @unittest.skipIf(support.MS_WINDOWS, "pending resolution of issue #15533")
+    @unittest.skipIf(mswindows, "pending resolution of issue #15533")
     def test_cwd_with_relative_arg(self):
         # Check that Popen looks for args[0] relative to cwd if args[0]
         # is relative.
@@ -377,7 +379,7 @@
             python_dir = self._normalize_cwd(python_dir)
             self._assert_cwd(python_dir, rel_python, cwd=python_dir)
 
-    @unittest.skipIf(support.MS_WINDOWS, "pending resolution of issue #15533")
+    @unittest.skipIf(mswindows, "pending resolution of issue #15533")
     def test_cwd_with_relative_executable(self):
         # Check that Popen looks for executable relative to cwd if executable
         # is relative (and that executable takes precedence over args[0]).
@@ -1006,7 +1008,7 @@
 
     def test_no_leaking(self):
         # Make sure we leak no resources
-        if not support.MS_WINDOWS:
+        if not mswindows:
             max_handles = 1026 # too much for most UNIX systems
         else:
             max_handles = 2050 # too much for (at least some) Windows setups
@@ -1242,7 +1244,7 @@
         t = threading.Timer(0.2, kill_proc_timer_thread)
         t.start()
 
-        if support.MS_WINDOWS:
+        if mswindows:
             expected_errorcode = 1
         else:
             # Should be -9 because of the proc.kill() from the thread.
@@ -1363,13 +1365,13 @@
         fds_after_exception = os.listdir(fd_directory)
         self.assertEqual(fds_before_popen, fds_after_exception)
 
-    @unittest.skipIf(support.MS_WINDOWS, "behavior currently not supported on Windows")
+    @unittest.skipIf(mswindows, "behavior currently not supported on Windows")
     def test_file_not_found_includes_filename(self):
         with self.assertRaises(FileNotFoundError) as c:
             subprocess.call(['/opt/nonexistent_binary', 'with', 'some', 'args'])
         self.assertEqual(c.exception.filename, '/opt/nonexistent_binary')
 
-    @unittest.skipIf(support.MS_WINDOWS, "behavior currently not supported on Windows")
+    @unittest.skipIf(mswindows, "behavior currently not supported on Windows")
     def test_file_not_found_with_bad_cwd(self):
         with self.assertRaises(FileNotFoundError) as c:
             subprocess.Popen(['exit', '0'], cwd='/some/nonexistent/directory')
@@ -1503,7 +1505,7 @@
         self.assertIn('capture_output', c.exception.args[0])
 
 
-@unittest.skipIf(support.MS_WINDOWS, "POSIX specific tests")
+@unittest.skipIf(mswindows, "POSIX specific tests")
 class POSIXProcessTestCase(BaseTestCase):
 
     def setUp(self):
@@ -2786,7 +2788,7 @@
         self.assertEqual(returncode, -3)
 
 
-@unittest.skipUnless(support.MS_WINDOWS, "Windows specific tests")
+@unittest.skipUnless(mswindows, "Windows specific tests")
 class Win32ProcessTestCase(BaseTestCase):
 
     def test_startupinfo(self):
@@ -3091,7 +3093,7 @@
             dir = tempfile.mkdtemp()
             name = os.path.join(dir, "foo")
             status, output = subprocess.getstatusoutput(
-                ("type " if support.MS_WINDOWS else "cat ") + name)
+                ("type " if mswindows else "cat ") + name)
             self.assertNotEqual(status, 0)
         finally:
             if dir is not None:
@@ -3125,7 +3127,7 @@
         ProcessTestCase.tearDown(self)
 
 
-@unittest.skipUnless(support.MS_WINDOWS, "Windows-specific tests")
+@unittest.skipUnless(mswindows, "Windows-specific tests")
 class CommandsWithSpaces (BaseTestCase):
 
     def setUp(self):
diff --git a/Lib/test/test_utf8_mode.py b/Lib/test/test_utf8_mode.py
index f2eb86e..26e2e13 100644
--- a/Lib/test/test_utf8_mode.py
+++ b/Lib/test/test_utf8_mode.py
@@ -11,6 +11,9 @@
 from test.support.script_helper import assert_python_ok, assert_python_failure
 
 
+MS_WINDOWS = (sys.platform == 'win32')
+
+
 class UTF8ModeTests(unittest.TestCase):
     DEFAULT_ENV = {
         'PYTHONUTF8': '',
@@ -32,7 +35,7 @@
             out = out[1]
         return out.decode().rstrip("\n\r")
 
-    @unittest.skipIf(support.MS_WINDOWS, 'Windows has no POSIX locale')
+    @unittest.skipIf(MS_WINDOWS, 'Windows has no POSIX locale')
     def test_posix_locale(self):
         code = 'import sys; print(sys.flags.utf8_mode)'
 
@@ -52,7 +55,7 @@
         out = self.get_output('-X', 'utf8=0', '-c', code)
         self.assertEqual(out, '0')
 
-        if support.MS_WINDOWS:
+        if MS_WINDOWS:
             # PYTHONLEGACYWINDOWSFSENCODING disables the UTF-8 Mode
             # and has the priority over -X utf8
             out = self.get_output('-X', 'utf8', '-c', code,
@@ -72,7 +75,7 @@
         out = self.get_output('-X', 'utf8=0', '-c', code, PYTHONUTF8='1')
         self.assertEqual(out, '0')
 
-        if support.MS_WINDOWS:
+        if MS_WINDOWS:
             # PYTHONLEGACYWINDOWSFSENCODING disables the UTF-8 mode
             # and has the priority over PYTHONUTF8
             out = self.get_output('-X', 'utf8', '-c', code, PYTHONUTF8='1',
@@ -98,7 +101,7 @@
                                  sys.getfilesystemencodeerrors()))
         ''')
 
-        if support.MS_WINDOWS:
+        if MS_WINDOWS:
             expected = 'utf-8/surrogatepass'
         else:
             expected = 'utf-8/surrogateescape'
@@ -106,7 +109,7 @@
         out = self.get_output('-X', 'utf8', '-c', code)
         self.assertEqual(out, expected)
 
-        if support.MS_WINDOWS:
+        if MS_WINDOWS:
             # PYTHONLEGACYWINDOWSFSENCODING disables the UTF-8 mode
             # and has the priority over -X utf8 and PYTHONUTF8
             out = self.get_output('-X', 'utf8', '-c', code,
@@ -201,7 +204,7 @@
         out = self.get_output('-X', 'utf8', '-c', code, LC_ALL='C')
         self.assertEqual(out, 'UTF-8 UTF-8')
 
-    @unittest.skipIf(support.MS_WINDOWS, 'test specific to Unix')
+    @unittest.skipIf(MS_WINDOWS, 'test specific to Unix')
     def test_cmd_line(self):
         arg = 'h\xe9\u20ac'.encode('utf-8')
         arg_utf8 = arg.decode('utf-8')
@@ -214,7 +217,7 @@
             self.assertEqual(args, ascii(expected), out)
 
         check('utf8', [arg_utf8])
-        if support.MACOS or support.ANDROID:
+        if sys.platform == 'darwin' or support.is_android:
             c_arg = arg_utf8
         else:
             c_arg = arg_ascii
