1 | README FOR IDLE TESTS IN IDLELIB.IDLE_TEST
|
---|
2 |
|
---|
3 |
|
---|
4 | 1. Test Files
|
---|
5 |
|
---|
6 | The 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 | ---
|
---|
12 | import unittest
|
---|
13 | from test.support import requires
|
---|
14 | import idlelib. as
|
---|
15 |
|
---|
16 | class _Test(unittest.TestCase):
|
---|
17 |
|
---|
18 | def test_(self):
|
---|
19 |
|
---|
20 | if __name__ == '__main__':
|
---|
21 | unittest.main(verbosity=2, exit=2)
|
---|
22 | ---
|
---|
23 | Idle tests are run with unittest; do not use regrtest's test_main.
|
---|
24 |
|
---|
25 | Once test_xyy is written, the following should go at the end of xyy.py,
|
---|
26 | with xyz (lowercased) added after 'test_'.
|
---|
27 | ---
|
---|
28 | if __name__ == "__main__":
|
---|
29 | from test import support; support.use_resources = ['gui']
|
---|
30 | import unittest
|
---|
31 | unittest.main('idlelib.idle_test.test_', verbosity=2, exit=False)
|
---|
32 | ---
|
---|
33 |
|
---|
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 | All gui objects must be destroyed by the end of the test, perhaps in a tearDown
|
---|
45 | function. Creating the Tk root directly in a setUp allows a reference to be saved
|
---|
46 | so it can be properly destroyed in the corresponding tearDown.
|
---|
47 | ---
|
---|
48 | @classmethod
|
---|
49 | def setUpClass(cls):
|
---|
50 | requires('gui')
|
---|
51 | cls.root = tk.Tk()
|
---|
52 |
|
---|
53 | @classmethod
|
---|
54 | def tearDownClass(cls):
|
---|
55 | cls.root.destroy()
|
---|
56 | ---
|
---|
57 |
|
---|
58 | Support.requires('gui') returns true if it is either called in a main module
|
---|
59 | (which never happens on buildbots) or if use_resources contains 'gui'.
|
---|
60 | Use_resources is set by test.regrtest but not by unittest. So when running
|
---|
61 | tests in another module with unittest, we set it ourselves, as in the xyz.py
|
---|
62 | template above.
|
---|
63 |
|
---|
64 | Since non-gui tests always run, but gui tests only sometimes, tests of non-gui
|
---|
65 | operations should best avoid needing a gui. Methods that make incidental use of
|
---|
66 | tkinter (tk) variables and messageboxes can do this by using the mock classes in
|
---|
67 | idle_test/mock_tk.py. There is also a mock text that will handle some uses of the
|
---|
68 | tk Text widget.
|
---|
69 |
|
---|
70 |
|
---|
71 | 3. Running Tests
|
---|
72 |
|
---|
73 | Assume that xyz.py and test_xyz.py end with the "if __name__" statements given
|
---|
74 | above. In Idle, pressing F5 in an editor window with either loaded will run all
|
---|
75 | tests in the test_xyz file with the version of Python running Idle. The test
|
---|
76 | report and any tracebacks will appear in the Shell window. The options in these
|
---|
77 | "if __name__" statements are appropriate for developers running (as opposed to
|
---|
78 | importing) either of the files during development: verbosity=2 lists all test
|
---|
79 | methods in the file; exit=False avoids a spurious sys.exit traceback that would
|
---|
80 | otherwise occur when running in Idle. The following command lines also run
|
---|
81 | all test methods, including gui tests, in test_xyz.py. (The exceptions are that
|
---|
82 | idlelib and idlelib.idle start Idle and idlelib.PyShell should (issue 18330).)
|
---|
83 |
|
---|
84 | python -m idlelib.xyz # With the capitalization of the xyz module
|
---|
85 | python -m idlelib.idle_test.test_xyz
|
---|
86 |
|
---|
87 | To run all idle_test/test_*.py tests, either interactively
|
---|
88 | ('>>>', with unittest imported) or from a command line, use one of the
|
---|
89 | following. (Notes: unittest does not run gui tests; in 2.7, 'test ' (with the
|
---|
90 | space) is 'test.regrtest '; where present, -v and -ugui can be omitted.)
|
---|
91 |
|
---|
92 | >>> unittest.main('idlelib.idle_test', verbosity=2, exit=False)
|
---|
93 | python -m unittest -v idlelib.idle_test
|
---|
94 | python -m test -v -ugui test_idle
|
---|
95 | python -m test.test_idle
|
---|
96 |
|
---|
97 | The idle tests are 'discovered' by idlelib.idle_test.__init__.load_tests,
|
---|
98 | which is also imported into test.test_idle. Normally, neither file should be
|
---|
99 | changed when working on individual test modules. The third command runs runs
|
---|
100 | unittest indirectly through regrtest. The same happens when the entire test
|
---|
101 | suite is run with 'python -m test'. So that command must work for buildbots
|
---|
102 | to stay green. Idle tests must not disturb the environment in a way that
|
---|
103 | makes other tests fail (issue 18081).
|
---|
104 |
|
---|
105 | To run an individual Testcase or test method, extend the dotted name given to
|
---|
106 | unittest on the command line. (But gui tests will not this way.)
|
---|
107 |
|
---|
108 | python -m unittest -v idlelib.idle_test.text_xyz.Test_case.test_meth
|
---|