README.txt
1 README FOR IDLE TESTS IN IDLELIB.IDLE_TEST
2
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
14
15 1. Test Files
16
17 The idle directory, idlelib, has over 60 xyz.py files. The idle_test
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
20 '.' and 'as', and before and after '_' to be filled in.
21
22 import unittest
23 from test.support import requires
24 import idlelib. as
25
26 class _Test(unittest.TestCase):
27
28 def test_(self):
29
30 if __name__ == '__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.
36
37 if __name__ == "__main__":
38 import unittest
39 unittest.main('idlelib.idle_test.test_', verbosity=2, exit=False)
40
41
42
43 2. GUI Tests
44
45 When run as part of the Python test suite, Idle GUI tests need to run
46 test.test_support.requires('gui') (test.support in 3.x). 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. The Tk root created in a setUpX function should
55 be destroyed in the corresponding tearDownX and the module or class attribute
56 deleted. Others widgets should descend from the single root and the attributes
57 deleted BEFORE root is destroyed. See https://bugs.python.org/issue20567.
58
59 @classmethod
60 def setUpClass(cls):
61 requires('gui')
62 cls.root = tk.Tk()
63 cls.text = tk.Text(root)
64
65 @classmethod
66 def tearDownClass(cls):
67 del cls.text
68 cls.root.destroy()
69 del cls.root
70
71 WARNING: In 2.7, "requires('gui') MUST NOT be called at module scope.
72 See https://bugs.python.org/issue18910
73
74 Requires('gui') causes the test(s) it guards to be skipped if any of
75 these conditions are met:
76
77 - The tests are being run by regrtest.py, and it was started without enabling
78 the "gui" resource with the "-u" command line option.
79
80 - The tests are being run on Windows by a service that is not allowed to
81 interact with the graphical environment.
82
83 - The tests are being run on Linux and X Windows is not available.
84
85 - The tests are being run on Mac OSX in a process that cannot make a window
86 manager connection.
87
88 - tkinter.Tk cannot be successfully instantiated for some reason.
89
90 - test.support.use_resources has been set by something other than
91 regrtest.py and does not contain "gui".
92
93 Tests of non-GUI operations should avoid creating tk widgets. Incidental uses of
94 tk variables and messageboxes can be replaced by the mock classes in
95 idle_test/mock_tk.py. The mock text handles some uses of the tk Text widget.
96
97
98 3. Running Unit Tests
99
100 Assume that xyz.py and test_xyz.py both end with a unittest.main() call.
101 Running either from an Idle editor runs all tests in the test_xyz file with the
102 version of Python running Idle. Test output appears in the Shell window. The
103 'verbosity=2' option lists all test methods in the file, which is appropriate
104 when developing tests. The 'exit=False' option is needed in xyx.py files when an
105 htest follows.
106
107 The following command lines also run all test methods, including
108 GUI tests, in test_xyz.py. (Both '-m idlelib' and '-m idlelib.idle' start
109 Idle and so cannot run tests.)
110
111 python -m idlelib.xyz
112 python -m idlelib.idle_test.test_xyz
113
114 The following runs all idle_test/test_*.py tests interactively.
115
116 >>> import unittest
117 >>> unittest.main('idlelib.idle_test', verbosity=2)
118
119 The following run all Idle tests at a command line. Option '-v' is the same as
120 'verbosity=2'. (For 2.7, replace 'test' in the second line with
121 'test.regrtest'.)
122
123 python -m unittest -v idlelib.idle_test
124 python -m test -v -ugui test_idle
125 python -m test.test_idle
126
127 The idle tests are 'discovered' by idlelib.idle_test.__init__.load_tests,
128 which is also imported into test.test_idle. Normally, neither file should be
129 changed when working on individual test modules. The third command runs
130 unittest indirectly through regrtest. The same happens when the entire test
131 suite is run with 'python -m test'. So that command must work for buildbots
132 to stay green. Idle tests must not disturb the environment in a way that
133 makes other tests fail (issue 18081).
134
135 To run an individual Testcase or test method, extend the dotted name given to
136 unittest on the command line.
137
138 python -m unittest -v idlelib.idle_test.test_xyz.Test_case.test_meth
139
140
141 4. Human-mediated Tests
142
143 Human-mediated tests are widget tests that cannot be automated but need human
144 verification. They are contained in idlelib/idle_test/htest.py, which has
145 instructions. (Some modules need an auxiliary function, identified with # htest
146 # on the header line.) The set is about complete, though some tests need
147 improvement. To run all htests, run the htest file from an editor or from the
148 command line with:
149
150 python -m idlelib.idle_test.htest
151