| 
									
										
										
										
											2013-05-27 21:32:03 -04:00
										 |  |  | README FOR IDLE TESTS IN IDLELIB.IDLE_TEST | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-16 14:23:39 -04:00
										 |  |  | 0. Quick Start | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Automated unit tests were added in 2.7 for Python 2.x and 3.3 for Python 3.x. | 
					
						
							|  |  |  | To run the tests from a command line: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | python -m test.test_idle | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Human-mediated tests were added later in 2.7 and in 3.4. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | python -m idlelib.idle_test.htest | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-29 18:22:02 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 1. Test Files | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-27 21:32:03 -04:00
										 |  |  | The idle directory, idlelib, has over 60 xyz.py files. The idle_test | 
					
						
							| 
									
										
										
										
											2015-05-16 14:23:39 -04:00
										 |  |  | subdirectory should contain a test_xyz.py for each, where 'xyz' is lowercased | 
					
						
							|  |  |  | even if xyz.py is not. Here is a possible template, with the blanks after after | 
					
						
							|  |  |  | '.' and 'as', and before and after '_' to be filled in. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-27 21:32:03 -04:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2013-06-29 18:22:02 -04:00
										 |  |  | from test.support import requires | 
					
						
							|  |  |  | import idlelib. as | 
					
						
							| 
									
										
										
										
											2013-05-27 21:32:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-29 18:22:02 -04:00
										 |  |  | class _Test(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2013-05-27 21:32:03 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							| 
									
										
										
										
											2015-05-16 14:23:39 -04:00
										 |  |  |     unittest.main(verbosity=2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Add the following at the end of xyy.py, with the appropriate name added after | 
					
						
							|  |  |  | 'test_'. Some files already have something like this for htest.  If so, insert | 
					
						
							|  |  |  | the import and unittest.main lines before the htest lines. | 
					
						
							| 
									
										
										
										
											2013-05-27 21:32:03 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     import unittest | 
					
						
							|  |  |  |     unittest.main('idlelib.idle_test.test_', verbosity=2, exit=False) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-29 18:22:02 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-16 14:23:39 -04:00
										 |  |  | 2. GUI Tests | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | When run as part of the Python test suite, Idle gui tests need to run | 
					
						
							|  |  |  | test.support.requires('gui') (test.test_support in 2.7).  A test is a gui test | 
					
						
							|  |  |  | if it creates a Tk root or master object either directly or indirectly by | 
					
						
							|  |  |  | instantiating a tkinter or idle class.  For the benefit of test processes that | 
					
						
							|  |  |  | either have no graphical environment available or are not allowed to use it, gui | 
					
						
							|  |  |  | tests must be 'guarded' by "requires('gui')" in a setUp function or method. | 
					
						
							|  |  |  | This will typically be setUpClass. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To avoid interfering with other gui tests, all gui objects must be destroyed and | 
					
						
							|  |  |  | deleted by the end of the test.  Widgets, such as a Tk root, created in a setUpX | 
					
						
							|  |  |  | function, should be destroyed in the corresponding tearDownX.  Module and class | 
					
						
							|  |  |  | widget attributes should also be deleted.. | 
					
						
							| 
									
										
										
										
											2013-07-28 16:39:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-29 18:22:02 -04:00
										 |  |  |     @classmethod | 
					
						
							|  |  |  |     def setUpClass(cls): | 
					
						
							|  |  |  |         requires('gui') | 
					
						
							| 
									
										
										
										
											2013-07-28 16:39:44 -04:00
										 |  |  |         cls.root = tk.Tk() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def tearDownClass(cls): | 
					
						
							|  |  |  |         cls.root.destroy() | 
					
						
							| 
									
										
										
										
											2014-02-27 18:47:49 -05:00
										 |  |  |         del cls.root | 
					
						
							| 
									
										
										
										
											2013-06-29 18:22:02 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-16 14:23:39 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | Requires('gui') causes the test(s) it guards to be skipped if any of | 
					
						
							| 
									
										
										
										
											2014-06-02 16:01:29 -05:00
										 |  |  | a few conditions are met: | 
					
						
							| 
									
										
										
										
											2015-05-16 14:23:39 -04:00
										 |  |  |      | 
					
						
							|  |  |  |  - The tests are being run by regrtest.py, and it was started without enabling | 
					
						
							|  |  |  |    the "gui" resource with the "-u" command line option. | 
					
						
							|  |  |  |     | 
					
						
							| 
									
										
										
										
											2014-06-02 16:01:29 -05:00
										 |  |  |  - The tests are being run on Windows by a service that is not allowed to | 
					
						
							|  |  |  |    interact with the graphical environment. | 
					
						
							| 
									
										
										
										
											2015-05-16 14:23:39 -04:00
										 |  |  |     | 
					
						
							| 
									
										
										
										
											2014-06-02 16:01:29 -05:00
										 |  |  |  - The tests are being run on Mac OSX in a process that cannot make a window | 
					
						
							|  |  |  |    manager connection. | 
					
						
							| 
									
										
										
										
											2015-05-16 14:23:39 -04:00
										 |  |  |     | 
					
						
							| 
									
										
										
										
											2014-06-02 16:01:29 -05:00
										 |  |  |  - tkinter.Tk cannot be successfully instantiated for some reason. | 
					
						
							| 
									
										
										
										
											2015-05-16 14:23:39 -04:00
										 |  |  |   | 
					
						
							| 
									
										
										
										
											2014-06-02 16:01:29 -05:00
										 |  |  |  - test.support.use_resources has been set by something other than | 
					
						
							|  |  |  |    regrtest.py and does not contain "gui". | 
					
						
							| 
									
										
										
										
											2015-05-16 14:23:39 -04:00
										 |  |  |     | 
					
						
							|  |  |  | Tests of non-gui operations should avoid creating tk widgets. Incidental uses of | 
					
						
							|  |  |  | tk variables and messageboxes can be replaced by the mock classes in | 
					
						
							|  |  |  | idle_test/mock_tk.py. The mock text handles some uses of the tk Text widget. | 
					
						
							| 
									
										
										
										
											2013-06-29 18:22:02 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-16 14:23:39 -04:00
										 |  |  | 3. Running Unit Tests | 
					
						
							| 
									
										
										
										
											2013-06-29 18:22:02 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-16 14:23:39 -04:00
										 |  |  | Assume that xyz.py and test_xyz.py both end with a unittest.main() call. | 
					
						
							|  |  |  | Running either from an Idle editor runs all tests in the test_xyz file with the | 
					
						
							|  |  |  | version of Python running Idle.  Test output appears in the Shell window.  The | 
					
						
							|  |  |  | 'verbosity=2' option lists all test methods in the file, which is appropriate | 
					
						
							|  |  |  | when developing tests. The 'exit=False' option is needed in xyx.py files when an | 
					
						
							|  |  |  | htest follows. | 
					
						
							| 
									
										
										
										
											2013-06-29 18:22:02 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-16 14:23:39 -04:00
										 |  |  | The following command lines also run all test methods, including | 
					
						
							|  |  |  | gui tests, in test_xyz.py. (Both '-m idlelib' and '-m idlelib.idle' start | 
					
						
							|  |  |  | Idle and so cannot run tests.) | 
					
						
							| 
									
										
										
										
											2013-05-27 21:32:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-16 14:23:39 -04:00
										 |  |  | python -m idlelib.xyz | 
					
						
							| 
									
										
										
										
											2013-06-29 18:22:02 -04:00
										 |  |  | python -m idlelib.idle_test.test_xyz | 
					
						
							| 
									
										
										
										
											2013-05-27 21:32:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-16 14:23:39 -04:00
										 |  |  | The following runs all idle_test/test_*.py tests interactively. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | >>> import unittest | 
					
						
							|  |  |  | >>> unittest.main('idlelib.idle_test', verbosity=2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The following run all Idle tests at a command line.  Option '-v' is the same as | 
					
						
							|  |  |  | 'verbosity=2'.  (For 2.7, replace 'test' in the second line with | 
					
						
							|  |  |  | 'test.regrtest'.) | 
					
						
							| 
									
										
										
										
											2013-05-27 21:32:03 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | python -m unittest -v idlelib.idle_test | 
					
						
							| 
									
										
										
										
											2013-06-29 18:22:02 -04:00
										 |  |  | python -m test -v -ugui test_idle | 
					
						
							| 
									
										
										
										
											2013-05-27 21:32:03 -04:00
										 |  |  | python -m test.test_idle | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-29 18:22:02 -04:00
										 |  |  | The idle tests are 'discovered' by idlelib.idle_test.__init__.load_tests, | 
					
						
							| 
									
										
										
										
											2013-05-27 21:32:03 -04:00
										 |  |  | which is also imported into test.test_idle. Normally, neither file should be | 
					
						
							| 
									
										
										
										
											2014-06-02 16:01:29 -05:00
										 |  |  | changed when working on individual test modules. The third command runs | 
					
						
							| 
									
										
										
										
											2013-05-27 21:32:03 -04:00
										 |  |  | unittest indirectly through regrtest. The same happens when the entire test | 
					
						
							| 
									
										
										
										
											2013-06-29 18:22:02 -04:00
										 |  |  | suite is run with 'python -m test'. So that command must work for buildbots | 
					
						
							|  |  |  | to stay green. Idle tests must not disturb the environment in a way that | 
					
						
							|  |  |  | makes other tests fail (issue 18081). | 
					
						
							| 
									
										
										
										
											2013-05-27 21:32:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-29 18:22:02 -04:00
										 |  |  | To run an individual Testcase or test method, extend the dotted name given to | 
					
						
							| 
									
										
										
										
											2014-06-02 16:01:29 -05:00
										 |  |  | unittest on the command line. | 
					
						
							| 
									
										
										
										
											2013-05-27 21:32:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-15 13:01:08 +02:00
										 |  |  | python -m unittest -v idlelib.idle_test.test_xyz.Test_case.test_meth | 
					
						
							| 
									
										
										
										
											2015-05-16 14:23:39 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 4. Human-mediated Tests | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Human-mediated tests are widget tests that cannot be automated but need human | 
					
						
							|  |  |  | verification. They are contained in idlelib/idle_test/htest.py, which has | 
					
						
							|  |  |  | instructions.  (Some modules need an auxiliary function, identified with # htest | 
					
						
							|  |  |  | # on the header line.)  The set is about complete, though some tests need | 
					
						
							|  |  |  | improvement. To run all htests, run the htest file from an editor or from the | 
					
						
							|  |  |  | command line with: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | python -m idlelib.idle_test.htest |