11README FOR IDLE TESTS IN IDLELIB.IDLE_TEST
22
3+ 0. Quick Start
4+
5+ Automated unit tests were added in 2.7 for Python 2.x and 3.3 for Python 3.x.
6+ To run the tests from a command line:
7+
8+ python -m test.test_idle
9+
10+ Human-mediated tests were added later in 2.7 and in 3.4.
11+
12+ python -m idlelib.idle_test.htest
13+
314
4151. Test Files
516
617The idle directory, idlelib, has over 60 xyz.py files. The idle_test
7- subdirectory should contain a test_xyy.py for each. (For test modules, make
8- 'xyz' lower case, and possibly shorten it.) Each file should start with the
9- something like the following template, with the blanks after after '.' and 'as',
10- and before and after '_' filled in.
11- ---
18+ subdirectory should contain a test_xyz.py for each, where 'xyz' is lowercased
19+ even if xyz.py is not. Here is a possible template, with the blanks after after
20+ '.' and 'as', and before and after '_' to be filled in.
21+
1222import unittest
1323from test.support import requires
1424import idlelib. as
@@ -18,33 +28,33 @@ class _Test(unittest.TestCase):
1828 def test_(self):
1929
2030if __name__ == '__main__':
21- unittest.main(verbosity=2, exit=2)
22- ---
23- Idle tests are run with unittest; do not use regrtest's test_main.
31+ unittest.main(verbosity=2)
32+
33+ Add the following at the end of xyy.py, with the appropriate name added after
34+ 'test_'. Some files already have something like this for htest. If so, insert
35+ the import and unittest.main lines before the htest lines.
2436
25- Once test_xyy is written, the following should go at the end of xyy.py,
26- with xyz (lowercased) added after 'test_'.
27- ---
2837if __name__ == "__main__":
2938 import unittest
3039 unittest.main('idlelib.idle_test.test_', verbosity=2, exit=False)
31- ---
3240
3341
34- 2. Gui Tests
3542
36- Gui tests need 'requires' from test.support (test.test_support in 2.7). A
37- test is a gui test if it creates a Tk root or master object either directly
38- or indirectly by instantiating a tkinter or idle class. For the benefit of
39- test processes that either have no graphical environment available or are not
40- allowed to use it, gui tests must be 'guarded' by "requires('gui')" in a
41- setUp function or method. This will typically be setUpClass.
43+ 2. GUI Tests
44+
45+ When run as part of the Python test suite, Idle gui tests need to run
46+ test.support.requires('gui') (test.test_support in 2.7). A test is a gui test
47+ if it creates a Tk root or master object either directly or indirectly by
48+ instantiating a tkinter or idle class. For the benefit of test processes that
49+ either have no graphical environment available or are not allowed to use it, gui
50+ tests must be 'guarded' by "requires('gui')" in a setUp function or method.
51+ This will typically be setUpClass.
52+
53+ To avoid interfering with other gui tests, all gui objects must be destroyed and
54+ deleted by the end of the test. Widgets, such as a Tk root, created in a setUpX
55+ function, should be destroyed in the corresponding tearDownX. Module and class
56+ widget attributes should also be deleted..
4257
43- To avoid interfering with other gui tests, all gui objects must be destroyed
44- and deleted by the end of the test. If a widget, such as a Tk root, is created
45- in a setUpX function, destroy it in the corresponding tearDownX. For module
46- and class attributes, also delete the widget.
47- ---
4858 @classmethod
4959 def setUpClass(cls):
5060 requires('gui')
@@ -54,49 +64,55 @@ and class attributes, also delete the widget.
5464 def tearDownClass(cls):
5565 cls.root.destroy()
5666 del cls.root
57- ---
5867
59- Support.requires('gui') causes the test(s) it guards to be skipped if any of
68+
69+ Requires('gui') causes the test(s) it guards to be skipped if any of
6070a few conditions are met:
61- - The tests are being run by regrtest.py, and it was started without
62- enabling the "gui" resource with the "-u" command line option.
71+
72+ - The tests are being run by regrtest.py, and it was started without enabling
73+ the "gui" resource with the "-u" command line option.
74+
6375 - The tests are being run on Windows by a service that is not allowed to
6476 interact with the graphical environment.
77+
6578 - The tests are being run on Mac OSX in a process that cannot make a window
6679 manager connection.
80+
6781 - tkinter.Tk cannot be successfully instantiated for some reason.
82+
6883 - test.support.use_resources has been set by something other than
6984 regrtest.py and does not contain "gui".
85+
86+ Tests of non-gui operations should avoid creating tk widgets. Incidental uses of
87+ tk variables and messageboxes can be replaced by the mock classes in
88+ idle_test/mock_tk.py. The mock text handles some uses of the tk Text widget.
7089
71- Since non-gui tests always run, but gui tests only sometimes, tests of non-gui
72- operations should best avoid needing a gui. Methods that make incidental use of
73- tkinter (tk) variables and messageboxes can do this by using the mock classes in
74- idle_test/mock_tk.py. There is also a mock text that will handle some uses of the
75- tk Text widget.
7690
91+ 3. Running Unit Tests
7792
78- 3. Running Tests
93+ Assume that xyz.py and test_xyz.py both end with a unittest.main() call.
94+ Running either from an Idle editor runs all tests in the test_xyz file with the
95+ version of Python running Idle. Test output appears in the Shell window. The
96+ 'verbosity=2' option lists all test methods in the file, which is appropriate
97+ when developing tests. The 'exit=False' option is needed in xyx.py files when an
98+ htest follows.
7999
80- Assume that xyz.py and test_xyz.py end with the "if __name__" statements given
81- above. In Idle, pressing F5 in an editor window with either loaded will run all
82- tests in the test_xyz file with the version of Python running Idle. The test
83- report and any tracebacks will appear in the Shell window. The options in these
84- "if __name__" statements are appropriate for developers running (as opposed to
85- importing) either of the files during development: verbosity=2 lists all test
86- methods in the file; exit=False avoids a spurious sys.exit traceback that would
87- otherwise occur when running in Idle. The following command lines also run
88- all test methods, including gui tests, in test_xyz.py. (The exceptions are that
89- idlelib and idlelib.idle start Idle and idlelib.PyShell should (issue 18330).)
100+ The following command lines also run all test methods, including
101+ gui tests, in test_xyz.py. (Both '-m idlelib' and '-m idlelib.idle' start
102+ Idle and so cannot run tests.)
90103
91- python -m idlelib.xyz # With the capitalization of the xyz module
104+ python -m idlelib.xyz
92105python -m idlelib.idle_test.test_xyz
93106
94- To run all idle_test/test_*.py tests, either interactively
95- ('>>>', with unittest imported) or from a command line, use one of the
96- following. (Notes: in 2.7, 'test ' (with the space) is 'test.regrtest ';
97- where present, -v and -ugui can be omitted.)
107+ The following runs all idle_test/test_*.py tests interactively.
108+
109+ >>> import unittest
110+ >>> unittest.main('idlelib.idle_test', verbosity=2)
111+
112+ The following run all Idle tests at a command line. Option '-v' is the same as
113+ 'verbosity=2'. (For 2.7, replace 'test' in the second line with
114+ 'test.regrtest'.)
98115
99- >>> unittest.main('idlelib.idle_test', verbosity=2, exit=False)
100116python -m unittest -v idlelib.idle_test
101117python -m test -v -ugui test_idle
102118python -m test.test_idle
@@ -113,3 +129,15 @@ To run an individual Testcase or test method, extend the dotted name given to
113129unittest on the command line.
114130
115131python -m unittest -v idlelib.idle_test.test_xyz.Test_case.test_meth
132+
133+
134+ 4. Human-mediated Tests
135+
136+ Human-mediated tests are widget tests that cannot be automated but need human
137+ verification. They are contained in idlelib/idle_test/htest.py, which has
138+ instructions. (Some modules need an auxiliary function, identified with # htest
139+ # on the header line.) The set is about complete, though some tests need
140+ improvement. To run all htests, run the htest file from an editor or from the
141+ command line with:
142+
143+ python -m idlelib.idle_test.htest
0 commit comments