[Python-checkins] cpython (2.7): Issue #15392: Create a unittest framework for IDLE, 2.7 version.

terry.reedy python-checkins at python.org
Thu May 30 20:48:14 CEST 2013


http://hg.python.org/cpython/rev/93eb15779050
changeset:   83986:93eb15779050
branch:      2.7
user:        Terry Jan Reedy <tjreedy at udel.edu>
date:        Thu May 30 14:47:33 2013 -0400
summary:
  Issue #15392: Create a unittest framework for IDLE, 2.7 version.
Preliminary patch by Rajagopalasarma Jayakrishnan.

files:
  Lib/idlelib/CallTips.py                   |   4 +-
  Lib/idlelib/PathBrowser.py                |   3 +-
  Lib/idlelib/idle_test/README.txt          |  63 +++++++++++
  Lib/idlelib/idle_test/__init__.py         |   9 +
  Lib/idlelib/idle_test/test_calltips.py    |  14 ++
  Lib/idlelib/idle_test/test_pathbrowser.py |  12 ++
  Lib/test/test_idle.py                     |  17 ++
  Misc/ACKS                                 |   1 +
  Misc/NEWS                                 |   3 +
  9 files changed, 124 insertions(+), 2 deletions(-)


diff --git a/Lib/idlelib/CallTips.py b/Lib/idlelib/CallTips.py
--- a/Lib/idlelib/CallTips.py
+++ b/Lib/idlelib/CallTips.py
@@ -223,4 +223,6 @@
     tests = (t1, t2, t3, t4, t5, t6, t7,
              TC, tc.t1, tc.t2, tc.t3, tc.t4, tc.t5, tc.t6, tc.t7)
 
-    test(tests)
+    # test(tests)
+    from unittest import main
+    main('idlelib.idle_test.test_calltips', verbosity=2, exit=False)
diff --git a/Lib/idlelib/PathBrowser.py b/Lib/idlelib/PathBrowser.py
--- a/Lib/idlelib/PathBrowser.py
+++ b/Lib/idlelib/PathBrowser.py
@@ -92,4 +92,5 @@
         mainloop()
 
 if __name__ == "__main__":
-    main()
+    from unittest import main
+    main('idlelib.idle_test.test_pathbrowser', verbosity=2, exit=False)
diff --git a/Lib/idlelib/idle_test/README.txt b/Lib/idlelib/idle_test/README.txt
new file mode 100644
--- /dev/null
+++ b/Lib/idlelib/idle_test/README.txt
@@ -0,0 +1,63 @@
+README FOR IDLE TESTS IN IDLELIB.IDLE_TEST
+
+The idle directory, idlelib, has over 60 xyz.py files. The idle_test
+subdirectory should contain a test_xyy.py for each one. (For test modules,
+make 'xyz' lower case.) Each should start with the following cut-paste
+template, with the blanks after after '.'. 'as', and '_' filled in.
+---
+import unittest
+import idlelib. as
+
+class Test_(unittest.TestCase):
+
+    def test_(self):
+
+if __name__ == '__main__':
+    unittest.main(verbosity=2, exit=2)
+---
+Idle tests are run with unittest; do not use regrtest's test_main.
+
+Once test_xyy is written, the following should go at the end of xyy.py,
+with xyz (lowercased) added after 'test_'.
+---
+if __name__ == "__main__":
+    import unittest
+    unittest.main('idlelib.idle_test.test_', verbosity=2, exit=False)
+---
+
+In Idle, pressing F5 in an editor window with either xyz.py or test_xyz.py
+loaded will then run the test with the version of Python running Idle and
+tracebacks will appear in the Shell window. The options are appropriate for
+developers running (as opposed to importing) either type of file during
+development: verbosity=2 lists all test_y methods; exit=False avoids a
+spurious sys.exit traceback when running in Idle. The following command
+lines also run test_xyz.py
+
+python -m idlelib.xyz  # With the capitalization of the xyz module
+python -m unittest -v idlelib.idle_test.test_xyz
+
+To run all idle tests either interactively ('>>>', with unittest imported)
+or from a command line, use one of the following.
+
+>>> unittest.main('idlelib.idle_test', verbosity=2, exit=False)
+python -m unittest -v idlelib.idle_test
+python -m test.test_idle
+python -m test test_idle
+
+The idle tests are 'discovered' in idlelib.idle_test.__init__.load_tests,
+which is also imported into test.test_idle. Normally, neither file should be
+changed when working on individual test modules. The last command runs runs
+unittest indirectly through regrtest. The same happens when the entire test
+suite is run with 'python -m test'. So it must work for buildbots to stay green.
+
+To run an individual Testcase or test method, extend the
+dotted name given to unittest on the command line.
+
+python -m unittest -v idlelib.idle_test.text_xyz.Test_case.test_meth
+
+To disable test/test_idle.py, there are at least two choices.
+a. Comment out 'load_tests' line, no no tests are discovered (simple and safe);
+Running no tests passes, so there is no indication that nothing was run.
+b.Before that line, make module an unexpected skip for regrtest with
+import unittest; raise unittest.SkipTest('skip for buildbots')
+When run directly with unittest, this causes a normal exit and traceback.
\ No newline at end of file
diff --git a/Lib/idlelib/idle_test/__init__.py b/Lib/idlelib/idle_test/__init__.py
new file mode 100644
--- /dev/null
+++ b/Lib/idlelib/idle_test/__init__.py
@@ -0,0 +1,9 @@
+from os.path import dirname
+
+def load_tests(loader, standard_tests, pattern):
+    this_dir = dirname(__file__)
+    top_dir = dirname(dirname(this_dir))
+    package_tests = loader.discover(start_dir=this_dir, pattern='test*.py',
+                                    top_level_dir=top_dir)
+    standard_tests.addTests(package_tests)
+    return standard_tests
diff --git a/Lib/idlelib/idle_test/test_calltips.py b/Lib/idlelib/idle_test/test_calltips.py
new file mode 100644
--- /dev/null
+++ b/Lib/idlelib/idle_test/test_calltips.py
@@ -0,0 +1,14 @@
+import unittest
+import idlelib.CallTips as ct
+CTi = ct.CallTips()
+
+class Test_get_entity(unittest.TestCase):
+    # In 3.x, get_entity changed from 'instance method' to module function
+    # since 'self' not used. Use dummy instance until change 2.7 also.
+    def test_bad_entity(self):
+        self.assertIsNone(CTi.get_entity('1/0'))
+    def test_good_entity(self):
+        self.assertIs(CTi.get_entity('int'), int)
+
+if __name__ == '__main__':
+    unittest.main(verbosity=2, exit=False)
diff --git a/Lib/idlelib/idle_test/test_pathbrowser.py b/Lib/idlelib/idle_test/test_pathbrowser.py
new file mode 100644
--- /dev/null
+++ b/Lib/idlelib/idle_test/test_pathbrowser.py
@@ -0,0 +1,12 @@
+import unittest
+import idlelib.PathBrowser as PathBrowser
+
+class PathBrowserTest(unittest.TestCase):
+
+    def test_DirBrowserTreeItem(self):
+        # Issue16226 - make sure that getting a sublist works
+        d = PathBrowser.DirBrowserTreeItem('')
+        d.GetSubList()
+
+if __name__ == '__main__':
+    unittest.main(verbosity=2, exit=False)
diff --git a/Lib/test/test_idle.py b/Lib/test/test_idle.py
new file mode 100644
--- /dev/null
+++ b/Lib/test/test_idle.py
@@ -0,0 +1,17 @@
+# Skip test if _tkinter or _thread wasn't built or idlelib was deleted.
+try:
+    import Tkinter
+    import threading  # imported by PyShell, imports _thread
+    import idlelib.idle_test as idletest
+except ImportError:
+    import unittest
+    raise unittest.SkipTest
+
+# Without test_main present, regrtest.runtest_inner (line1219) calls
+# unittest.TestLoader().loadTestsFromModule(this_module) which calls
+# load_tests() if it finds it. (Unittest.main does the same.)
+load_tests = idletest.load_tests
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main(verbosity=2, exit=False)
diff --git a/Misc/ACKS b/Misc/ACKS
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -478,6 +478,7 @@
 Jack Jansen
 Bill Janssen
 Thomas Jarosch
+Rajagopalasarma Jayakrishnan
 Drew Jenkins
 Flemming Kjær Jensen
 Philip H. Jensen
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -47,6 +47,9 @@
 IDLE
 ----
 
+- Issue #15392: Create a unittest framework for IDLE.
+  Preliminary patch by Rajagopalasarma Jayakrishnan
+
 - Issue #14146: Highlight source line while debugging on Windows.
 
 - Issue #17532: Always include Options menu for IDLE on OS X.

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list