11README FOR IDLE TESTS IN IDLELIB.IDLE_TEST
22
3+
4+ 1. Test Files
5+
36The idle directory, idlelib, has over 60 xyz.py files. The idle_test
4- subdirectory should contain a test_xyy.py for each one. (For test modules,
5- make 'xyz' lower case.) Each should start with the following cut-paste
6- template, with the blanks after after '.'. 'as', and '_' filled in.
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.
711---
812import unittest
9- import idlelib. as
13+ from test.support import requires
14+ import idlelib. as
1015
11- class Test_ (unittest.TestCase):
16+ class _Test (unittest.TestCase):
1217
1318 def test_(self):
1419
@@ -21,43 +26,75 @@ Once test_xyy is written, the following should go at the end of xyy.py,
2126with xyz (lowercased) added after 'test_'.
2227---
2328if __name__ == "__main__":
29+ from test import support; support.use_resources = ['gui']
2430 import unittest
2531 unittest.main('idlelib.idle_test.test_', verbosity=2, exit=False)
2632---
2733
28- In Idle, pressing F5 in an editor window with either xyz.py or test_xyz.py
29- loaded will then run the test with the version of Python running Idle and
30- tracebacks will appear in the Shell window. The options are appropriate for
31- developers running (as opposed to importing) either type of file during
32- development: verbosity=2 lists all test_y methods; exit=False avoids a
33- spurious sys.exit traceback when running in Idle. The following command
34- lines also run test_xyz.py
34+
35+ 2. Gui Tests
36+
37+ Gui tests need 'requires' and 'use_resources' from test.support
38+ (test.test_support in 2.7). A test is a gui test if it creates a Tk root or
39+ master object either directly or indirectly by instantiating a tkinter or
40+ idle class. For the benefit of buildbot machines that do not have a graphics
41+ screen, gui tests must be 'guarded' by "requires('gui')" in a setUp
42+ function or method. This will typically be setUpClass.
43+ ---
44+ @classmethod
45+ def setUpClass(cls):
46+ requires('gui')
47+ ---
48+ All gui objects must be destroyed by the end of the test, perhaps in a tearDown
49+ function.
50+
51+ Support.requires('gui') returns true if it is either called in a main module
52+ (which never happens on buildbots) or if use_resources contains 'gui'.
53+ Use_resources is set by test.regrtest but not by unittest. So when running
54+ tests in another module with unittest, we set it ourselves, as in the xyz.py
55+ template above.
56+
57+ Since non-gui tests always run, but gui tests only sometimes, tests of non-gui
58+ operations should best avoid needing a gui. Methods that make incidental use of
59+ tkinter variables and messageboxes can do this by using the mock classes in
60+ idle_test/mock_tk.py.
61+
62+
63+ 3. Running Tests
64+
65+ Assume that xyz.py and test_xyz.py end with the "if __name__" statements given
66+ above. In Idle, pressing F5 in an editor window with either loaded will run all
67+ tests in the test_xyz file with the version of Python running Idle. The test
68+ report and any tracebacks will appear in the Shell window. The options in these
69+ "if __name__" statements are appropriate for developers running (as opposed to
70+ importing) either of the files during development: verbosity=2 lists all test
71+ methods in the file; exit=False avoids a spurious sys.exit traceback that would
72+ otherwise occur when running in Idle. The following command lines also run
73+ all test methods, including gui tests, in test_xyz.py. (The exceptions are that
74+ idlelib and idlelib.idle start Idle and idlelib.PyShell should (issue 18330).)
3575
3676python -m idlelib.xyz # With the capitalization of the xyz module
37- python -m unittest -v idlelib.idle_test.test_xyz
77+ python -m idlelib.idle_test.test_xyz
3878
39- To run all idle tests either interactively ('>>>', with unittest imported)
40- or from a command line, use one of the following.
79+ To run all idle_test/test_*.py tests, either interactively
80+ ('>>>', with unittest imported) or from a command line, use one of the
81+ following. (Notes: unittest does not run gui tests; in 2.7, 'test ' (with the
82+ space) is 'test.regrtest '; where present, -v and -ugui can be omitted.)
4183
4284>>> unittest.main('idlelib.idle_test', verbosity=2, exit=False)
4385python -m unittest -v idlelib.idle_test
86+ python -m test -v -ugui test_idle
4487python -m test.test_idle
45- python -m test test_idle
4688
47- The idle tests are 'discovered' in idlelib.idle_test.__init__.load_tests,
89+ The idle tests are 'discovered' by idlelib.idle_test.__init__.load_tests,
4890which is also imported into test.test_idle. Normally, neither file should be
49- changed when working on individual test modules. The last command runs runs
91+ changed when working on individual test modules. The third command runs runs
5092unittest indirectly through regrtest. The same happens when the entire test
51- suite is run with 'python -m test'. So it must work for buildbots to stay green.
93+ suite is run with 'python -m test'. So that command must work for buildbots
94+ to stay green. Idle tests must not disturb the environment in a way that
95+ makes other tests fail (issue 18081).
5296
53- To run an individual Testcase or test method, extend the
54- dotted name given to unittest on the command line.
97+ To run an individual Testcase or test method, extend the dotted name given to
98+ unittest on the command line. (But gui tests will not this way.)
5599
56100python -m unittest -v idlelib.idle_test.text_xyz.Test_case.test_meth
57-
58- To disable test/test_idle.py, there are at least two choices.
59- a. Comment out 'load_tests' line, no no tests are discovered (simple and safe);
60- Running no tests passes, so there is no indication that nothing was run.
61- b.Before that line, make module an unexpected skip for regrtest with
62- import unittest; raise unittest.SkipTest('skip for buildbots')
63- When run directly with unittest, this causes a normal exit and traceback.
0 commit comments