shift options and tests to terminal plugin
--HG-- branch : 1.0.x
This commit is contained in:
		
							parent
							
								
									1349edd3c6
								
							
						
					
					
						commit
						30d77f77af
					
				|  | @ -0,0 +1,422 @@ | ||||||
|  | import py | ||||||
|  | 
 | ||||||
|  | EXPECTTIMEOUT=10.0 | ||||||
|  | 
 | ||||||
|  | class TestGeneralUsage: | ||||||
|  |     def test_config_error(self, testdir): | ||||||
|  |         testdir.makeconftest(""" | ||||||
|  |             def pytest_configure(config): | ||||||
|  |                 raise config.Error("hello") | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest(testdir.tmpdir) | ||||||
|  |         assert result.ret != 0 | ||||||
|  |         assert result.stderr.fnmatch_lines([ | ||||||
|  |             '*ERROR: hello' | ||||||
|  |         ]) | ||||||
|  | 
 | ||||||
|  |     def test_config_preparse_plugin_option(self, testdir): | ||||||
|  |         testdir.makepyfile(pytest_xyz=""" | ||||||
|  |             def pytest_addoption(parser): | ||||||
|  |                 parser.addoption("--xyz", dest="xyz", action="store") | ||||||
|  |         """) | ||||||
|  |         testdir.makepyfile(test_one=""" | ||||||
|  |             import py | ||||||
|  |             def test_option(): | ||||||
|  |                 assert py.test.config.option.xyz == "123" | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest("-p", "xyz", "--xyz=123") | ||||||
|  |         assert result.ret == 0 | ||||||
|  |         assert result.stdout.fnmatch_lines([ | ||||||
|  |             '*1 passed*', | ||||||
|  |         ]) | ||||||
|  | 
 | ||||||
|  |     def test_basetemp(self, testdir): | ||||||
|  |         mytemp = testdir.tmpdir.mkdir("mytemp") | ||||||
|  |         p = testdir.makepyfile(""" | ||||||
|  |             import py | ||||||
|  |             def test_1():  | ||||||
|  |                 py.test.ensuretemp('xyz') | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest(p, '--basetemp=%s' %mytemp) | ||||||
|  |         assert result.ret == 0 | ||||||
|  |         assert mytemp.join('xyz').check(dir=1) | ||||||
|  |                  | ||||||
|  |     def test_assertion_magic(self, testdir): | ||||||
|  |         p = testdir.makepyfile(""" | ||||||
|  |             def test_this(): | ||||||
|  |                 x = 0 | ||||||
|  |                 assert x | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest(p) | ||||||
|  |         extra = result.stdout.fnmatch_lines([ | ||||||
|  |             ">       assert x",  | ||||||
|  |             "E       assert 0", | ||||||
|  |         ]) | ||||||
|  |         assert result.ret == 1 | ||||||
|  | 
 | ||||||
|  |     def test_nested_import_error(self, testdir): | ||||||
|  |         p = testdir.makepyfile(""" | ||||||
|  |                 import import_fails | ||||||
|  |                 def test_this(): | ||||||
|  |                     assert import_fails.a == 1 | ||||||
|  |         """) | ||||||
|  |         testdir.makepyfile(import_fails="import does_not_work") | ||||||
|  |         result = testdir.runpytest(p) | ||||||
|  |         extra = result.stdout.fnmatch_lines([ | ||||||
|  |             ">   import import_fails", | ||||||
|  |             "E   ImportError: No module named does_not_work", | ||||||
|  |         ]) | ||||||
|  |         assert result.ret == 1 | ||||||
|  | 
 | ||||||
|  |     def test_skipped_reasons(self, testdir): | ||||||
|  |         testdir.makepyfile( | ||||||
|  |             test_one=""" | ||||||
|  |                 from conftest import doskip | ||||||
|  |                 def setup_function(func): | ||||||
|  |                     doskip() | ||||||
|  |                 def test_func(): | ||||||
|  |                     pass | ||||||
|  |                 class TestClass: | ||||||
|  |                     def test_method(self): | ||||||
|  |                         doskip() | ||||||
|  |            """, | ||||||
|  |            test_two = """ | ||||||
|  |                 from conftest import doskip | ||||||
|  |                 doskip() | ||||||
|  |            """, | ||||||
|  |            conftest = """ | ||||||
|  |                 import py | ||||||
|  |                 def doskip(): | ||||||
|  |                     py.test.skip('test') | ||||||
|  |             """ | ||||||
|  |         ) | ||||||
|  |         result = testdir.runpytest()  | ||||||
|  |         extra = result.stdout.fnmatch_lines([ | ||||||
|  |             "*test_one.py ss", | ||||||
|  |             "*test_two.py S", | ||||||
|  |             "___* skipped test summary *_",  | ||||||
|  |             "*conftest.py:3: *3* Skipped: 'test'",  | ||||||
|  |         ]) | ||||||
|  |         assert result.ret == 0 | ||||||
|  | 
 | ||||||
|  |     def test_deselected(self, testdir): | ||||||
|  |         testpath = testdir.makepyfile(""" | ||||||
|  |                 def test_one(): | ||||||
|  |                     pass | ||||||
|  |                 def test_two(): | ||||||
|  |                     pass | ||||||
|  |                 def test_three(): | ||||||
|  |                     pass | ||||||
|  |            """ | ||||||
|  |         ) | ||||||
|  |         result = testdir.runpytest("-k", "test_two:", testpath) | ||||||
|  |         extra = result.stdout.fnmatch_lines([ | ||||||
|  |             "*test_deselected.py ..",  | ||||||
|  |             "=* 1 test*deselected by 'test_two:'*=",  | ||||||
|  |         ]) | ||||||
|  |         assert result.ret == 0 | ||||||
|  | 
 | ||||||
|  |     def test_no_skip_summary_if_failure(self, testdir): | ||||||
|  |         testdir.makepyfile(""" | ||||||
|  |             import py | ||||||
|  |             def test_ok(): | ||||||
|  |                 pass | ||||||
|  |             def test_fail(): | ||||||
|  |                 assert 0 | ||||||
|  |             def test_skip(): | ||||||
|  |                 py.test.skip("dontshow") | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest()  | ||||||
|  |         assert result.stdout.str().find("skip test summary") == -1 | ||||||
|  |         assert result.ret == 1 | ||||||
|  | 
 | ||||||
|  |     def test_passes(self, testdir): | ||||||
|  |         p1 = testdir.makepyfile(""" | ||||||
|  |             def test_passes(): | ||||||
|  |                 pass | ||||||
|  |             class TestClass: | ||||||
|  |                 def test_method(self): | ||||||
|  |                     pass | ||||||
|  |         """) | ||||||
|  |         old = p1.dirpath().chdir() | ||||||
|  |         try: | ||||||
|  |             result = testdir.runpytest() | ||||||
|  |         finally: | ||||||
|  |             old.chdir() | ||||||
|  |         extra = result.stdout.fnmatch_lines([ | ||||||
|  |             "test_passes.py ..",  | ||||||
|  |             "* 2 pass*", | ||||||
|  |         ]) | ||||||
|  |         assert result.ret == 0 | ||||||
|  | 
 | ||||||
|  |     def test_header_trailer_info(self, testdir): | ||||||
|  |         p1 = testdir.makepyfile(""" | ||||||
|  |             def test_passes(): | ||||||
|  |                 pass | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest() | ||||||
|  |         verinfo = ".".join(map(str, py.std.sys.version_info[:3])) | ||||||
|  |         extra = result.stdout.fnmatch_lines([ | ||||||
|  |             "*===== test session starts ====*", | ||||||
|  |             "python: platform %s -- Python %s*" %( | ||||||
|  |                     py.std.sys.platform, verinfo), # , py.std.sys.executable), | ||||||
|  |             "*test_header_trailer_info.py .", | ||||||
|  |             "=* 1 passed in *.[0-9][0-9] seconds *=",  | ||||||
|  |         ]) | ||||||
|  | 
 | ||||||
|  |     def test_traceback_failure(self, testdir): | ||||||
|  |         p1 = testdir.makepyfile(""" | ||||||
|  |             def g(): | ||||||
|  |                 return 2 | ||||||
|  |             def f(x): | ||||||
|  |                 assert x == g() | ||||||
|  |             def test_onefails(): | ||||||
|  |                 f(3) | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest(p1) | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             "*test_traceback_failure.py F",  | ||||||
|  |             "====* FAILURES *====", | ||||||
|  |             "____*____",  | ||||||
|  |             "", | ||||||
|  |             "    def test_onefails():", | ||||||
|  |             ">       f(3)", | ||||||
|  |             "", | ||||||
|  |             "*test_*.py:6: ", | ||||||
|  |             "_ _ _ *", | ||||||
|  |             #"", | ||||||
|  |             "    def f(x):", | ||||||
|  |             ">       assert x == g()", | ||||||
|  |             "E       assert 3 == 2", | ||||||
|  |             "E        +  where 2 = g()", | ||||||
|  |             "", | ||||||
|  |             "*test_traceback_failure.py:4: AssertionError" | ||||||
|  |         ]) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def test_showlocals(self, testdir):  | ||||||
|  |         p1 = testdir.makepyfile(""" | ||||||
|  |             def test_showlocals(): | ||||||
|  |                 x = 3 | ||||||
|  |                 y = "x" * 5000  | ||||||
|  |                 assert 0 | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest(p1, '-l') | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             #"_ _ * Locals *",  | ||||||
|  |             "x* = 3", | ||||||
|  |             "y* = 'xxxxxx*" | ||||||
|  |         ]) | ||||||
|  | 
 | ||||||
|  |     def test_verbose_reporting(self, testdir): | ||||||
|  |         p1 = testdir.makepyfile(""" | ||||||
|  |             import py | ||||||
|  |             def test_fail(): | ||||||
|  |                 raise ValueError() | ||||||
|  |             def test_pass(): | ||||||
|  |                 pass | ||||||
|  |             class TestClass: | ||||||
|  |                 def test_skip(self): | ||||||
|  |                     py.test.skip("hello") | ||||||
|  |             def test_gen(): | ||||||
|  |                 def check(x): | ||||||
|  |                     assert x == 1 | ||||||
|  |                 yield check, 0 | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest(p1, '-v') | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             "*test_verbose_reporting.py:2: test_fail*FAIL*",  | ||||||
|  |             "*test_verbose_reporting.py:4: test_pass*PASS*", | ||||||
|  |             "*test_verbose_reporting.py:7: TestClass.test_skip*SKIP*", | ||||||
|  |             "*test_verbose_reporting.py:10: test_gen*FAIL*", | ||||||
|  |         ]) | ||||||
|  |         assert result.ret == 1 | ||||||
|  |         result = testdir.runpytest(p1, '-v', '-n 1') | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             "*FAIL*test_verbose_reporting.py:2: test_fail*",  | ||||||
|  |         ]) | ||||||
|  |         assert result.ret == 1 | ||||||
|  | 
 | ||||||
|  | class TestDistribution: | ||||||
|  |     def test_dist_conftest_options(self, testdir): | ||||||
|  |         p1 = testdir.tmpdir.ensure("dir", 'p1.py') | ||||||
|  |         p1.dirpath("__init__.py").write("") | ||||||
|  |         p1.dirpath("conftest.py").write(py.code.Source(""" | ||||||
|  |             print "importing conftest", __file__ | ||||||
|  |             import py | ||||||
|  |             Option = py.test.config.Option  | ||||||
|  |             option = py.test.config.addoptions("someopt",  | ||||||
|  |                 Option('--someopt', action="store_true", dest="someopt", default=False)) | ||||||
|  |             dist_rsync_roots = ['../dir'] | ||||||
|  |             print "added options", option | ||||||
|  |             print "config file seen from conftest", py.test.config | ||||||
|  |         """)) | ||||||
|  |         p1.write(py.code.Source(""" | ||||||
|  |             import py, conftest | ||||||
|  |             def test_1():  | ||||||
|  |                 print "config from test_1", py.test.config | ||||||
|  |                 print "conftest from test_1", conftest.__file__ | ||||||
|  |                 print "test_1: py.test.config.option.someopt", py.test.config.option.someopt | ||||||
|  |                 print "test_1: conftest", conftest | ||||||
|  |                 print "test_1: conftest.option.someopt", conftest.option.someopt | ||||||
|  |                 assert conftest.option.someopt  | ||||||
|  |         """)) | ||||||
|  |         result = testdir.runpytest('-d', '--tx=popen', p1, '--someopt') | ||||||
|  |         assert result.ret == 0 | ||||||
|  |         extra = result.stdout.fnmatch_lines([ | ||||||
|  |             "*1 passed*",  | ||||||
|  |         ]) | ||||||
|  | 
 | ||||||
|  |     def test_manytests_to_one_popen(self, testdir): | ||||||
|  |         p1 = testdir.makepyfile(""" | ||||||
|  |                 import py | ||||||
|  |                 def test_fail0(): | ||||||
|  |                     assert 0 | ||||||
|  |                 def test_fail1(): | ||||||
|  |                     raise ValueError() | ||||||
|  |                 def test_ok(): | ||||||
|  |                     pass | ||||||
|  |                 def test_skip(): | ||||||
|  |                     py.test.skip("hello") | ||||||
|  |             """,  | ||||||
|  |         ) | ||||||
|  |         result = testdir.runpytest(p1, '-d', '--tx=popen', '--tx=popen') | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             "*1*popen*Python*", | ||||||
|  |             "*2*popen*Python*", | ||||||
|  |             "*2 failed, 1 passed, 1 skipped*", | ||||||
|  |         ]) | ||||||
|  |         assert result.ret == 1 | ||||||
|  | 
 | ||||||
|  |     def test_dist_conftest_specified(self, testdir): | ||||||
|  |         p1 = testdir.makepyfile(""" | ||||||
|  |                 import py | ||||||
|  |                 def test_fail0(): | ||||||
|  |                     assert 0 | ||||||
|  |                 def test_fail1(): | ||||||
|  |                     raise ValueError() | ||||||
|  |                 def test_ok(): | ||||||
|  |                     pass | ||||||
|  |                 def test_skip(): | ||||||
|  |                     py.test.skip("hello") | ||||||
|  |             """,  | ||||||
|  |         ) | ||||||
|  |         testdir.makeconftest(""" | ||||||
|  |             pytest_option_tx = 'popen popen popen'.split() | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest(p1, '-d') | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             "*1*popen*Python*", | ||||||
|  |             "*2*popen*Python*", | ||||||
|  |             "*3*popen*Python*", | ||||||
|  |             "*2 failed, 1 passed, 1 skipped*", | ||||||
|  |         ]) | ||||||
|  |         assert result.ret == 1 | ||||||
|  | 
 | ||||||
|  |     def test_dist_tests_with_crash(self, testdir): | ||||||
|  |         if not hasattr(py.std.os, 'kill'): | ||||||
|  |             py.test.skip("no os.kill") | ||||||
|  |          | ||||||
|  |         p1 = testdir.makepyfile(""" | ||||||
|  |                 import py | ||||||
|  |                 def test_fail0(): | ||||||
|  |                     assert 0 | ||||||
|  |                 def test_fail1(): | ||||||
|  |                     raise ValueError() | ||||||
|  |                 def test_ok(): | ||||||
|  |                     pass | ||||||
|  |                 def test_skip(): | ||||||
|  |                     py.test.skip("hello") | ||||||
|  |                 def test_crash(): | ||||||
|  |                     import time | ||||||
|  |                     import os | ||||||
|  |                     time.sleep(0.5) | ||||||
|  |                     os.kill(os.getpid(), 15) | ||||||
|  |             """ | ||||||
|  |         ) | ||||||
|  |         result = testdir.runpytest(p1, '-d', '--tx=3*popen') | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             "*popen*Python*", | ||||||
|  |             "*popen*Python*", | ||||||
|  |             "*popen*Python*", | ||||||
|  |             "*node down*", | ||||||
|  |             "*3 failed, 1 passed, 1 skipped*" | ||||||
|  |         ]) | ||||||
|  |         assert result.ret == 1 | ||||||
|  | 
 | ||||||
|  |     def test_distribution_rsyncdirs_example(self, testdir): | ||||||
|  |         source = testdir.mkdir("source") | ||||||
|  |         dest = testdir.mkdir("dest") | ||||||
|  |         subdir = source.mkdir("example_pkg") | ||||||
|  |         subdir.ensure("__init__.py") | ||||||
|  |         p = subdir.join("test_one.py") | ||||||
|  |         p.write("def test_5(): assert not __file__.startswith(%r)" % str(p)) | ||||||
|  |         result = testdir.runpytest("-d", "--rsyncdir=%(subdir)s" % locals(),  | ||||||
|  |             "--tx=popen//chdir=%(dest)s" % locals(), p) | ||||||
|  |         assert result.ret == 0 | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             "*1* *popen*platform*", | ||||||
|  |             #"RSyncStart: [G1]", | ||||||
|  |             #"RSyncFinished: [G1]", | ||||||
|  |             "*1 passed*" | ||||||
|  |         ]) | ||||||
|  |         assert dest.join(subdir.basename).check(dir=1) | ||||||
|  | 
 | ||||||
|  |     def test_dist_each(self, testdir): | ||||||
|  |         interpreters = [] | ||||||
|  |         for name in ("python2.4", "python2.5"): | ||||||
|  |             interp = py.path.local.sysfind(name) | ||||||
|  |             if interp is None: | ||||||
|  |                 py.test.skip("%s not found" % name) | ||||||
|  |             interpreters.append(interp) | ||||||
|  | 
 | ||||||
|  |         testdir.makepyfile(__init__="", test_one=""" | ||||||
|  |             import sys | ||||||
|  |             def test_hello(): | ||||||
|  |                 print "%s...%s" % sys.version_info[:2] | ||||||
|  |                 assert 0 | ||||||
|  |         """) | ||||||
|  |         args = ["--dist=each"] | ||||||
|  |         args += ["--tx", "popen//python=%s" % interpreters[0]] | ||||||
|  |         args += ["--tx", "popen//python=%s" % interpreters[1]] | ||||||
|  |         result = testdir.runpytest(*args) | ||||||
|  |         result.stdout.fnmatch_lines(["2...4"]) | ||||||
|  |         result.stdout.fnmatch_lines(["2...5"]) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class TestInteractive: | ||||||
|  |     def test_simple_looponfail_interaction(self, testdir): | ||||||
|  |         p1 = testdir.makepyfile(""" | ||||||
|  |             def test_1(): | ||||||
|  |                 assert 1 == 0  | ||||||
|  |         """) | ||||||
|  |         p1.setmtime(p1.mtime() - 50.0)   | ||||||
|  |         child = testdir.spawn_pytest("--looponfail %s" % p1) | ||||||
|  |         child.expect("assert 1 == 0") | ||||||
|  |         child.expect("test_simple_looponfail_interaction.py:") | ||||||
|  |         child.expect("1 failed") | ||||||
|  |         child.expect("waiting for changes") | ||||||
|  |         p1.write(py.code.Source(""" | ||||||
|  |             def test_1(): | ||||||
|  |                 assert 1 == 1 | ||||||
|  |         """)) | ||||||
|  |         child.expect("MODIFIED.*test_simple_looponfail_interaction.py", timeout=4.0) | ||||||
|  |         child.expect("1 passed", timeout=5.0) | ||||||
|  |         child.kill(15) | ||||||
|  |         | ||||||
|  | class TestKeyboardInterrupt:  | ||||||
|  |     def test_raised_in_testfunction(self, testdir): | ||||||
|  |         p1 = testdir.makepyfile(""" | ||||||
|  |             import py | ||||||
|  |             def test_fail(): | ||||||
|  |                 raise ValueError() | ||||||
|  |             def test_inter(): | ||||||
|  |                 raise KeyboardInterrupt() | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest(p1) | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             #"*test_inter() INTERRUPTED", | ||||||
|  |             "*KEYBOARD INTERRUPT*", | ||||||
|  |             "*1 failed*",  | ||||||
|  |         ]) | ||||||
|  | 
 | ||||||
|  | @ -38,7 +38,7 @@ def pytest_report_iteminfo(item): | ||||||
|     return item.reportinfo() |     return item.reportinfo() | ||||||
| 
 | 
 | ||||||
| def pytest_addoption(parser): | def pytest_addoption(parser): | ||||||
|     group = parser.getgroup("general", "test collection and failure interaction options") |     group = parser.getgroup("general", "general testing options") | ||||||
|     group._addoption('-v', '--verbose', action="count",  |     group._addoption('-v', '--verbose', action="count",  | ||||||
|                dest="verbose", default=0, help="increase verbosity."), |                dest="verbose", default=0, help="increase verbosity."), | ||||||
|     group._addoption('-x', '--exitfirst', |     group._addoption('-x', '--exitfirst', | ||||||
|  | @ -67,23 +67,8 @@ def pytest_addoption(parser): | ||||||
|                help="run tests, re-run failing test set until all pass.") |                help="run tests, re-run failing test set until all pass.") | ||||||
| 
 | 
 | ||||||
|     group = parser.addgroup("test process debugging") |     group = parser.addgroup("test process debugging") | ||||||
|     group.addoption('--collectonly', |  | ||||||
|         action="store_true", dest="collectonly", |  | ||||||
|         help="only collect tests, don't execute them."), |  | ||||||
|     group.addoption('--traceconfig', |  | ||||||
|                action="store_true", dest="traceconfig", default=False, |  | ||||||
|                help="trace considerations of conftest.py files."), |  | ||||||
|     group._addoption('--nomagic', |  | ||||||
|                action="store_true", dest="nomagic", default=False, |  | ||||||
|                help="don't reinterpret asserts, no traceback cutting. ") |  | ||||||
|     group._addoption('--fulltrace', |  | ||||||
|                action="store_true", dest="fulltrace", default=False, |  | ||||||
|                help="don't cut any tracebacks (default is to cut).") |  | ||||||
|     group.addoption('--basetemp', dest="basetemp", default=None, metavar="dir", |     group.addoption('--basetemp', dest="basetemp", default=None, metavar="dir", | ||||||
|                help="base temporary directory for this test run.") |                help="base temporary directory for this test run.") | ||||||
|     group.addoption('--debug', |  | ||||||
|                action="store_true", dest="debug", default=False, |  | ||||||
|                help="generate and show debugging information.") |  | ||||||
| 
 | 
 | ||||||
|     group = parser.addgroup("dist", "distributed testing") #  see http://pytest.org/help/dist") |     group = parser.addgroup("dist", "distributed testing") #  see http://pytest.org/help/dist") | ||||||
|     group._addoption('--dist', metavar="distmode",  |     group._addoption('--dist', metavar="distmode",  | ||||||
|  |  | ||||||
|  | @ -6,6 +6,24 @@ This is a good source for looking at the various reporting hooks. | ||||||
| import py | import py | ||||||
| import sys | import sys | ||||||
| 
 | 
 | ||||||
|  | def pytest_addoption(parser): | ||||||
|  |     group = parser.getgroup("test process debugging") | ||||||
|  |     group.addoption('--collectonly', | ||||||
|  |         action="store_true", dest="collectonly", | ||||||
|  |         help="only collect tests, don't execute them."), | ||||||
|  |     group.addoption('--traceconfig', | ||||||
|  |                action="store_true", dest="traceconfig", default=False, | ||||||
|  |                help="trace considerations of conftest.py files."), | ||||||
|  |     group._addoption('--nomagic', | ||||||
|  |                action="store_true", dest="nomagic", default=False, | ||||||
|  |                help="don't reinterpret asserts, no traceback cutting. ") | ||||||
|  |     group._addoption('--fulltrace', | ||||||
|  |                action="store_true", dest="fulltrace", default=False, | ||||||
|  |                help="don't cut any tracebacks (default is to cut).") | ||||||
|  |     group.addoption('--debug', | ||||||
|  |                action="store_true", dest="debug", default=False, | ||||||
|  |                help="generate and show debugging information.") | ||||||
|  | 
 | ||||||
| def pytest_configure(config): | def pytest_configure(config): | ||||||
|     if config.option.collectonly: |     if config.option.collectonly: | ||||||
|         reporter = CollectonlyReporter(config) |         reporter = CollectonlyReporter(config) | ||||||
|  |  | ||||||
|  | @ -352,6 +352,40 @@ class TestCollectonly: | ||||||
|         ]) |         ]) | ||||||
|         assert result.ret == 3 |         assert result.ret == 3 | ||||||
| 
 | 
 | ||||||
|  |     def test_collectonly_simple(self, testdir): | ||||||
|  |         p = testdir.makepyfile(""" | ||||||
|  |             def test_func1(): | ||||||
|  |                 pass | ||||||
|  |             class TestClass: | ||||||
|  |                 def test_method(self): | ||||||
|  |                     pass | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest("--collectonly", p) | ||||||
|  |         stderr = result.stderr.str().strip() | ||||||
|  |         assert stderr.startswith("inserting into sys.path") | ||||||
|  |         assert result.ret == 0 | ||||||
|  |         extra = result.stdout.fnmatch_lines(py.code.Source(""" | ||||||
|  |             <Module '*.py'> | ||||||
|  |               <Function 'test_func1'*> | ||||||
|  |               <Class 'TestClass'> | ||||||
|  |                 <Instance '()'> | ||||||
|  |                   <Function 'test_method'*> | ||||||
|  |         """).strip()) | ||||||
|  | 
 | ||||||
|  |     def test_collectonly_error(self, testdir): | ||||||
|  |         p = testdir.makepyfile("import Errlkjqweqwe") | ||||||
|  |         result = testdir.runpytest("--collectonly", p) | ||||||
|  |         stderr = result.stderr.str().strip() | ||||||
|  |         assert stderr.startswith("inserting into sys.path") | ||||||
|  |         assert result.ret == 1 | ||||||
|  |         extra = result.stdout.fnmatch_lines(py.code.Source(""" | ||||||
|  |             <Module '*.py'> | ||||||
|  |               *ImportError* | ||||||
|  |             !!!*failures*!!! | ||||||
|  |             *test_collectonly_error.py:1* | ||||||
|  |         """).strip()) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| def test_repr_python_version(monkeypatch): | def test_repr_python_version(monkeypatch): | ||||||
|     monkeypatch.setattr(sys, 'version_info', (2, 5, 1, 'final', 0)) |     monkeypatch.setattr(sys, 'version_info', (2, 5, 1, 'final', 0)) | ||||||
|     assert repr_pythonversion() == "2.5.1-final-0" |     assert repr_pythonversion() == "2.5.1-final-0" | ||||||
|  | @ -417,3 +451,174 @@ class TestFixtureReporting: | ||||||
|             "*failingfunc*", |             "*failingfunc*", | ||||||
|             "*1 failed*1 error*", |             "*1 failed*1 error*", | ||||||
|          ]) |          ]) | ||||||
|  | 
 | ||||||
|  | class TestTerminalFunctional: | ||||||
|  |     def test_skipped_reasons(self, testdir): | ||||||
|  |         testdir.makepyfile( | ||||||
|  |             test_one=""" | ||||||
|  |                 from conftest import doskip | ||||||
|  |                 def setup_function(func): | ||||||
|  |                     doskip() | ||||||
|  |                 def test_func(): | ||||||
|  |                     pass | ||||||
|  |                 class TestClass: | ||||||
|  |                     def test_method(self): | ||||||
|  |                         doskip() | ||||||
|  |            """, | ||||||
|  |            test_two = """ | ||||||
|  |                 from conftest import doskip | ||||||
|  |                 doskip() | ||||||
|  |            """, | ||||||
|  |            conftest = """ | ||||||
|  |                 import py | ||||||
|  |                 def doskip(): | ||||||
|  |                     py.test.skip('test') | ||||||
|  |             """ | ||||||
|  |         ) | ||||||
|  |         result = testdir.runpytest()  | ||||||
|  |         extra = result.stdout.fnmatch_lines([ | ||||||
|  |             "*test_one.py ss", | ||||||
|  |             "*test_two.py S", | ||||||
|  |             "___* skipped test summary *_",  | ||||||
|  |             "*conftest.py:3: *3* Skipped: 'test'",  | ||||||
|  |         ]) | ||||||
|  |         assert result.ret == 0 | ||||||
|  | 
 | ||||||
|  |     def test_deselected(self, testdir): | ||||||
|  |         testpath = testdir.makepyfile(""" | ||||||
|  |                 def test_one(): | ||||||
|  |                     pass | ||||||
|  |                 def test_two(): | ||||||
|  |                     pass | ||||||
|  |                 def test_three(): | ||||||
|  |                     pass | ||||||
|  |            """ | ||||||
|  |         ) | ||||||
|  |         result = testdir.runpytest("-k", "test_two:", testpath) | ||||||
|  |         extra = result.stdout.fnmatch_lines([ | ||||||
|  |             "*test_deselected.py ..",  | ||||||
|  |             "=* 1 test*deselected by 'test_two:'*=",  | ||||||
|  |         ]) | ||||||
|  |         assert result.ret == 0 | ||||||
|  | 
 | ||||||
|  |     def test_no_skip_summary_if_failure(self, testdir): | ||||||
|  |         testdir.makepyfile(""" | ||||||
|  |             import py | ||||||
|  |             def test_ok(): | ||||||
|  |                 pass | ||||||
|  |             def test_fail(): | ||||||
|  |                 assert 0 | ||||||
|  |             def test_skip(): | ||||||
|  |                 py.test.skip("dontshow") | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest()  | ||||||
|  |         assert result.stdout.str().find("skip test summary") == -1 | ||||||
|  |         assert result.ret == 1 | ||||||
|  | 
 | ||||||
|  |     def test_passes(self, testdir): | ||||||
|  |         p1 = testdir.makepyfile(""" | ||||||
|  |             def test_passes(): | ||||||
|  |                 pass | ||||||
|  |             class TestClass: | ||||||
|  |                 def test_method(self): | ||||||
|  |                     pass | ||||||
|  |         """) | ||||||
|  |         old = p1.dirpath().chdir() | ||||||
|  |         try: | ||||||
|  |             result = testdir.runpytest() | ||||||
|  |         finally: | ||||||
|  |             old.chdir() | ||||||
|  |         extra = result.stdout.fnmatch_lines([ | ||||||
|  |             "test_passes.py ..",  | ||||||
|  |             "* 2 pass*", | ||||||
|  |         ]) | ||||||
|  |         assert result.ret == 0 | ||||||
|  | 
 | ||||||
|  |     def test_header_trailer_info(self, testdir): | ||||||
|  |         p1 = testdir.makepyfile(""" | ||||||
|  |             def test_passes(): | ||||||
|  |                 pass | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest() | ||||||
|  |         verinfo = ".".join(map(str, py.std.sys.version_info[:3])) | ||||||
|  |         extra = result.stdout.fnmatch_lines([ | ||||||
|  |             "*===== test session starts ====*", | ||||||
|  |             "python: platform %s -- Python %s*" %( | ||||||
|  |                     py.std.sys.platform, verinfo), # , py.std.sys.executable), | ||||||
|  |             "*test_header_trailer_info.py .", | ||||||
|  |             "=* 1 passed in *.[0-9][0-9] seconds *=",  | ||||||
|  |         ]) | ||||||
|  | 
 | ||||||
|  |     def test_traceback_failure(self, testdir): | ||||||
|  |         p1 = testdir.makepyfile(""" | ||||||
|  |             def g(): | ||||||
|  |                 return 2 | ||||||
|  |             def f(x): | ||||||
|  |                 assert x == g() | ||||||
|  |             def test_onefails(): | ||||||
|  |                 f(3) | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest(p1) | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             "*test_traceback_failure.py F",  | ||||||
|  |             "====* FAILURES *====", | ||||||
|  |             "____*____",  | ||||||
|  |             "", | ||||||
|  |             "    def test_onefails():", | ||||||
|  |             ">       f(3)", | ||||||
|  |             "", | ||||||
|  |             "*test_*.py:6: ", | ||||||
|  |             "_ _ _ *", | ||||||
|  |             #"", | ||||||
|  |             "    def f(x):", | ||||||
|  |             ">       assert x == g()", | ||||||
|  |             "E       assert 3 == 2", | ||||||
|  |             "E        +  where 2 = g()", | ||||||
|  |             "", | ||||||
|  |             "*test_traceback_failure.py:4: AssertionError" | ||||||
|  |         ]) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def test_showlocals(self, testdir):  | ||||||
|  |         p1 = testdir.makepyfile(""" | ||||||
|  |             def test_showlocals(): | ||||||
|  |                 x = 3 | ||||||
|  |                 y = "x" * 5000  | ||||||
|  |                 assert 0 | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest(p1, '-l') | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             #"_ _ * Locals *",  | ||||||
|  |             "x* = 3", | ||||||
|  |             "y* = 'xxxxxx*" | ||||||
|  |         ]) | ||||||
|  | 
 | ||||||
|  |     def test_verbose_reporting(self, testdir): | ||||||
|  |         p1 = testdir.makepyfile(""" | ||||||
|  |             import py | ||||||
|  |             def test_fail(): | ||||||
|  |                 raise ValueError() | ||||||
|  |             def test_pass(): | ||||||
|  |                 pass | ||||||
|  |             class TestClass: | ||||||
|  |                 def test_skip(self): | ||||||
|  |                     py.test.skip("hello") | ||||||
|  |             def test_gen(): | ||||||
|  |                 def check(x): | ||||||
|  |                     assert x == 1 | ||||||
|  |                 yield check, 0 | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest(p1, '-v') | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             "*test_verbose_reporting.py:2: test_fail*FAIL*",  | ||||||
|  |             "*test_verbose_reporting.py:4: test_pass*PASS*", | ||||||
|  |             "*test_verbose_reporting.py:7: TestClass.test_skip*SKIP*", | ||||||
|  |             "*test_verbose_reporting.py:10: test_gen*FAIL*", | ||||||
|  |         ]) | ||||||
|  |         assert result.ret == 1 | ||||||
|  |         result = testdir.runpytest(p1, '-v', '-n 1') | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             "*FAIL*test_verbose_reporting.py:2: test_fail*",  | ||||||
|  |         ]) | ||||||
|  |         assert result.ret == 1 | ||||||
|  | 
 | ||||||
|  |  | ||||||
|  | @ -54,40 +54,6 @@ class TestGeneralUsage: | ||||||
|         ]) |         ]) | ||||||
|         assert result.ret == 1 |         assert result.ret == 1 | ||||||
| 
 | 
 | ||||||
|     def test_collectonly_simple(self, testdir): |  | ||||||
|         p = testdir.makepyfile(""" |  | ||||||
|             def test_func1(): |  | ||||||
|                 pass |  | ||||||
|             class TestClass: |  | ||||||
|                 def test_method(self): |  | ||||||
|                     pass |  | ||||||
|         """) |  | ||||||
|         result = testdir.runpytest("--collectonly", p) |  | ||||||
|         stderr = result.stderr.str().strip() |  | ||||||
|         assert stderr.startswith("inserting into sys.path") |  | ||||||
|         assert result.ret == 0 |  | ||||||
|         extra = result.stdout.fnmatch_lines(py.code.Source(""" |  | ||||||
|             <Module '*.py'> |  | ||||||
|               <Function 'test_func1'*> |  | ||||||
|               <Class 'TestClass'> |  | ||||||
|                 <Instance '()'> |  | ||||||
|                   <Function 'test_method'*> |  | ||||||
|         """).strip()) |  | ||||||
| 
 |  | ||||||
|     def test_collectonly_error(self, testdir): |  | ||||||
|         p = testdir.makepyfile("import Errlkjqweqwe") |  | ||||||
|         result = testdir.runpytest("--collectonly", p) |  | ||||||
|         stderr = result.stderr.str().strip() |  | ||||||
|         assert stderr.startswith("inserting into sys.path") |  | ||||||
|         assert result.ret == 1 |  | ||||||
|         extra = result.stdout.fnmatch_lines(py.code.Source(""" |  | ||||||
|             <Module '*.py'> |  | ||||||
|               *ImportError* |  | ||||||
|             !!!*failures*!!! |  | ||||||
|             *test_collectonly_error.py:1* |  | ||||||
|         """).strip()) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     def test_nested_import_error(self, testdir): |     def test_nested_import_error(self, testdir): | ||||||
|         p = testdir.makepyfile(""" |         p = testdir.makepyfile(""" | ||||||
|                 import import_fails |                 import import_fails | ||||||
|  | @ -102,175 +68,6 @@ class TestGeneralUsage: | ||||||
|         ]) |         ]) | ||||||
|         assert result.ret == 1 |         assert result.ret == 1 | ||||||
| 
 | 
 | ||||||
|     def test_skipped_reasons(self, testdir): |  | ||||||
|         testdir.makepyfile( |  | ||||||
|             test_one=""" |  | ||||||
|                 from conftest import doskip |  | ||||||
|                 def setup_function(func): |  | ||||||
|                     doskip() |  | ||||||
|                 def test_func(): |  | ||||||
|                     pass |  | ||||||
|                 class TestClass: |  | ||||||
|                     def test_method(self): |  | ||||||
|                         doskip() |  | ||||||
|            """, |  | ||||||
|            test_two = """ |  | ||||||
|                 from conftest import doskip |  | ||||||
|                 doskip() |  | ||||||
|            """, |  | ||||||
|            conftest = """ |  | ||||||
|                 import py |  | ||||||
|                 def doskip(): |  | ||||||
|                     py.test.skip('test') |  | ||||||
|             """ |  | ||||||
|         ) |  | ||||||
|         result = testdir.runpytest()  |  | ||||||
|         extra = result.stdout.fnmatch_lines([ |  | ||||||
|             "*test_one.py ss", |  | ||||||
|             "*test_two.py S", |  | ||||||
|             "___* skipped test summary *_",  |  | ||||||
|             "*conftest.py:3: *3* Skipped: 'test'",  |  | ||||||
|         ]) |  | ||||||
|         assert result.ret == 0 |  | ||||||
| 
 |  | ||||||
|     def test_deselected(self, testdir): |  | ||||||
|         testpath = testdir.makepyfile(""" |  | ||||||
|                 def test_one(): |  | ||||||
|                     pass |  | ||||||
|                 def test_two(): |  | ||||||
|                     pass |  | ||||||
|                 def test_three(): |  | ||||||
|                     pass |  | ||||||
|            """ |  | ||||||
|         ) |  | ||||||
|         result = testdir.runpytest("-k", "test_two:", testpath) |  | ||||||
|         extra = result.stdout.fnmatch_lines([ |  | ||||||
|             "*test_deselected.py ..",  |  | ||||||
|             "=* 1 test*deselected by 'test_two:'*=",  |  | ||||||
|         ]) |  | ||||||
|         assert result.ret == 0 |  | ||||||
| 
 |  | ||||||
|     def test_no_skip_summary_if_failure(self, testdir): |  | ||||||
|         testdir.makepyfile(""" |  | ||||||
|             import py |  | ||||||
|             def test_ok(): |  | ||||||
|                 pass |  | ||||||
|             def test_fail(): |  | ||||||
|                 assert 0 |  | ||||||
|             def test_skip(): |  | ||||||
|                 py.test.skip("dontshow") |  | ||||||
|         """) |  | ||||||
|         result = testdir.runpytest()  |  | ||||||
|         assert result.stdout.str().find("skip test summary") == -1 |  | ||||||
|         assert result.ret == 1 |  | ||||||
| 
 |  | ||||||
|     def test_passes(self, testdir): |  | ||||||
|         p1 = testdir.makepyfile(""" |  | ||||||
|             def test_passes(): |  | ||||||
|                 pass |  | ||||||
|             class TestClass: |  | ||||||
|                 def test_method(self): |  | ||||||
|                     pass |  | ||||||
|         """) |  | ||||||
|         old = p1.dirpath().chdir() |  | ||||||
|         try: |  | ||||||
|             result = testdir.runpytest() |  | ||||||
|         finally: |  | ||||||
|             old.chdir() |  | ||||||
|         extra = result.stdout.fnmatch_lines([ |  | ||||||
|             "test_passes.py ..",  |  | ||||||
|             "* 2 pass*", |  | ||||||
|         ]) |  | ||||||
|         assert result.ret == 0 |  | ||||||
| 
 |  | ||||||
|     def test_header_trailer_info(self, testdir): |  | ||||||
|         p1 = testdir.makepyfile(""" |  | ||||||
|             def test_passes(): |  | ||||||
|                 pass |  | ||||||
|         """) |  | ||||||
|         result = testdir.runpytest() |  | ||||||
|         verinfo = ".".join(map(str, py.std.sys.version_info[:3])) |  | ||||||
|         extra = result.stdout.fnmatch_lines([ |  | ||||||
|             "*===== test session starts ====*", |  | ||||||
|             "python: platform %s -- Python %s*" %( |  | ||||||
|                     py.std.sys.platform, verinfo), # , py.std.sys.executable), |  | ||||||
|             "*test_header_trailer_info.py .", |  | ||||||
|             "=* 1 passed in *.[0-9][0-9] seconds *=",  |  | ||||||
|         ]) |  | ||||||
| 
 |  | ||||||
|     def test_traceback_failure(self, testdir): |  | ||||||
|         p1 = testdir.makepyfile(""" |  | ||||||
|             def g(): |  | ||||||
|                 return 2 |  | ||||||
|             def f(x): |  | ||||||
|                 assert x == g() |  | ||||||
|             def test_onefails(): |  | ||||||
|                 f(3) |  | ||||||
|         """) |  | ||||||
|         result = testdir.runpytest(p1) |  | ||||||
|         result.stdout.fnmatch_lines([ |  | ||||||
|             "*test_traceback_failure.py F",  |  | ||||||
|             "====* FAILURES *====", |  | ||||||
|             "____*____",  |  | ||||||
|             "", |  | ||||||
|             "    def test_onefails():", |  | ||||||
|             ">       f(3)", |  | ||||||
|             "", |  | ||||||
|             "*test_*.py:6: ", |  | ||||||
|             "_ _ _ *", |  | ||||||
|             #"", |  | ||||||
|             "    def f(x):", |  | ||||||
|             ">       assert x == g()", |  | ||||||
|             "E       assert 3 == 2", |  | ||||||
|             "E        +  where 2 = g()", |  | ||||||
|             "", |  | ||||||
|             "*test_traceback_failure.py:4: AssertionError" |  | ||||||
|         ]) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     def test_showlocals(self, testdir):  |  | ||||||
|         p1 = testdir.makepyfile(""" |  | ||||||
|             def test_showlocals(): |  | ||||||
|                 x = 3 |  | ||||||
|                 y = "x" * 5000  |  | ||||||
|                 assert 0 |  | ||||||
|         """) |  | ||||||
|         result = testdir.runpytest(p1, '-l') |  | ||||||
|         result.stdout.fnmatch_lines([ |  | ||||||
|             #"_ _ * Locals *",  |  | ||||||
|             "x* = 3", |  | ||||||
|             "y* = 'xxxxxx*" |  | ||||||
|         ]) |  | ||||||
| 
 |  | ||||||
|     def test_verbose_reporting(self, testdir): |  | ||||||
|         p1 = testdir.makepyfile(""" |  | ||||||
|             import py |  | ||||||
|             def test_fail(): |  | ||||||
|                 raise ValueError() |  | ||||||
|             def test_pass(): |  | ||||||
|                 pass |  | ||||||
|             class TestClass: |  | ||||||
|                 def test_skip(self): |  | ||||||
|                     py.test.skip("hello") |  | ||||||
|             def test_gen(): |  | ||||||
|                 def check(x): |  | ||||||
|                     assert x == 1 |  | ||||||
|                 yield check, 0 |  | ||||||
|         """) |  | ||||||
|         result = testdir.runpytest(p1, '-v') |  | ||||||
|         result.stdout.fnmatch_lines([ |  | ||||||
|             "*test_verbose_reporting.py:2: test_fail*FAIL*",  |  | ||||||
|             "*test_verbose_reporting.py:4: test_pass*PASS*", |  | ||||||
|             "*test_verbose_reporting.py:7: TestClass.test_skip*SKIP*", |  | ||||||
|             "*test_verbose_reporting.py:10: test_gen*FAIL*", |  | ||||||
|         ]) |  | ||||||
|         assert result.ret == 1 |  | ||||||
|         result = testdir.runpytest(p1, '-v', '-n 1') |  | ||||||
|         result.stdout.fnmatch_lines([ |  | ||||||
|             "*FAIL*test_verbose_reporting.py:2: test_fail*",  |  | ||||||
|         ]) |  | ||||||
|         assert result.ret == 1 |  | ||||||
| 
 |  | ||||||
| class TestDistribution: | class TestDistribution: | ||||||
|     def test_dist_conftest_options(self, testdir): |     def test_dist_conftest_options(self, testdir): | ||||||
|         p1 = testdir.tmpdir.ensure("dir", 'p1.py') |         p1 = testdir.tmpdir.ensure("dir", 'p1.py') | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue