diff options
Diffstat (limited to 'third_party/python/pytest/testing/test_session.py')
-rw-r--r-- | third_party/python/pytest/testing/test_session.py | 343 |
1 files changed, 343 insertions, 0 deletions
diff --git a/third_party/python/pytest/testing/test_session.py b/third_party/python/pytest/testing/test_session.py new file mode 100644 index 0000000000..4a594009ba --- /dev/null +++ b/third_party/python/pytest/testing/test_session.py @@ -0,0 +1,343 @@ +from __future__ import absolute_import, division, print_function + +import pytest + +from _pytest.main import EXIT_NOTESTSCOLLECTED + + +class SessionTests(object): + + def test_basic_testitem_events(self, testdir): + tfile = testdir.makepyfile( + """ + def test_one(): + pass + def test_one_one(): + assert 0 + def test_other(): + raise ValueError(23) + class TestClass(object): + def test_two(self, someargs): + pass + """ + ) + reprec = testdir.inline_run(tfile) + passed, skipped, failed = reprec.listoutcomes() + assert len(skipped) == 0 + assert len(passed) == 1 + assert len(failed) == 3 + + def end(x): + return x.nodeid.split("::")[-1] + + assert end(failed[0]) == "test_one_one" + assert end(failed[1]) == "test_other" + itemstarted = reprec.getcalls("pytest_itemcollected") + assert len(itemstarted) == 4 + # XXX check for failing funcarg setup + # colreports = reprec.getcalls("pytest_collectreport") + # assert len(colreports) == 4 + # assert colreports[1].report.failed + + def test_nested_import_error(self, testdir): + tfile = testdir.makepyfile( + """ + import import_fails + def test_this(): + assert import_fails.a == 1 + """, + import_fails=""" + import does_not_work + a = 1 + """, + ) + reprec = testdir.inline_run(tfile) + values = reprec.getfailedcollections() + assert len(values) == 1 + out = str(values[0].longrepr) + assert out.find("does_not_work") != -1 + + def test_raises_output(self, testdir): + reprec = testdir.inline_runsource( + """ + import pytest + def test_raises_doesnt(): + pytest.raises(ValueError, int, "3") + """ + ) + passed, skipped, failed = reprec.listoutcomes() + assert len(failed) == 1 + out = failed[0].longrepr.reprcrash.message + if not out.find("DID NOT RAISE") != -1: + print(out) + pytest.fail("incorrect raises() output") + + def test_generator_yields_None(self, testdir): + reprec = testdir.inline_runsource( + """ + def test_1(): + yield None + """ + ) + failures = reprec.getfailedcollections() + out = failures[0].longrepr.reprcrash.message + i = out.find("TypeError") + assert i != -1 + + def test_syntax_error_module(self, testdir): + reprec = testdir.inline_runsource("this is really not python") + values = reprec.getfailedcollections() + assert len(values) == 1 + out = str(values[0].longrepr) + assert out.find(str("not python")) != -1 + + def test_exit_first_problem(self, testdir): + reprec = testdir.inline_runsource( + """ + def test_one(): assert 0 + def test_two(): assert 0 + """, + "--exitfirst", + ) + passed, skipped, failed = reprec.countoutcomes() + assert failed == 1 + assert passed == skipped == 0 + + def test_maxfail(self, testdir): + reprec = testdir.inline_runsource( + """ + def test_one(): assert 0 + def test_two(): assert 0 + def test_three(): assert 0 + """, + "--maxfail=2", + ) + passed, skipped, failed = reprec.countoutcomes() + assert failed == 2 + assert passed == skipped == 0 + + def test_broken_repr(self, testdir): + p = testdir.makepyfile( + """ + import pytest + class BrokenRepr1(object): + foo=0 + def __repr__(self): + raise Exception("Ha Ha fooled you, I'm a broken repr().") + + class TestBrokenClass(object): + def test_explicit_bad_repr(self): + t = BrokenRepr1() + pytest.raises(Exception, 'repr(t)') + + def test_implicit_bad_repr1(self): + t = BrokenRepr1() + assert t.foo == 1 + + """ + ) + reprec = testdir.inline_run(p) + passed, skipped, failed = reprec.listoutcomes() + assert len(failed) == 1 + out = failed[0].longrepr.reprcrash.message + assert ( + out.find( + """[Exception("Ha Ha fooled you, I'm a broken repr().") raised in repr()]""" + ) + != -1 + ) # ' + + def test_skip_file_by_conftest(self, testdir): + testdir.makepyfile( + conftest=""" + import pytest + def pytest_collect_file(): + pytest.skip("intentional") + """, + test_file=""" + def test_one(): pass + """, + ) + try: + reprec = testdir.inline_run(testdir.tmpdir) + except pytest.skip.Exception: + pytest.fail("wrong skipped caught") + reports = reprec.getreports("pytest_collectreport") + assert len(reports) == 1 + assert reports[0].skipped + + +class TestNewSession(SessionTests): + + def test_order_of_execution(self, testdir): + reprec = testdir.inline_runsource( + """ + values = [] + def test_1(): + values.append(1) + def test_2(): + values.append(2) + def test_3(): + assert values == [1,2] + class Testmygroup(object): + reslist = values + def test_1(self): + self.reslist.append(1) + def test_2(self): + self.reslist.append(2) + def test_3(self): + self.reslist.append(3) + def test_4(self): + assert self.reslist == [1,2,1,2,3] + """ + ) + passed, skipped, failed = reprec.countoutcomes() + assert failed == skipped == 0 + assert passed == 7 + # also test listnames() here ... + + def test_collect_only_with_various_situations(self, testdir): + p = testdir.makepyfile( + test_one=""" + def test_one(): + raise ValueError() + + class TestX(object): + def test_method_one(self): + pass + + class TestY(TestX): + pass + """, + test_three="xxxdsadsadsadsa", + __init__="", + ) + reprec = testdir.inline_run("--collect-only", p.dirpath()) + + itemstarted = reprec.getcalls("pytest_itemcollected") + assert len(itemstarted) == 3 + assert not reprec.getreports("pytest_runtest_logreport") + started = reprec.getcalls("pytest_collectstart") + finished = reprec.getreports("pytest_collectreport") + assert len(started) == len(finished) + assert len(started) == 7 # XXX extra TopCollector + colfail = [x for x in finished if x.failed] + assert len(colfail) == 1 + + def test_minus_x_import_error(self, testdir): + testdir.makepyfile(__init__="") + testdir.makepyfile(test_one="xxxx", test_two="yyyy") + reprec = testdir.inline_run("-x", testdir.tmpdir) + finished = reprec.getreports("pytest_collectreport") + colfail = [x for x in finished if x.failed] + assert len(colfail) == 1 + + def test_minus_x_overridden_by_maxfail(self, testdir): + testdir.makepyfile(__init__="") + testdir.makepyfile(test_one="xxxx", test_two="yyyy", test_third="zzz") + reprec = testdir.inline_run("-x", "--maxfail=2", testdir.tmpdir) + finished = reprec.getreports("pytest_collectreport") + colfail = [x for x in finished if x.failed] + assert len(colfail) == 2 + + +def test_plugin_specify(testdir): + pytest.raises( + ImportError, + """ + testdir.parseconfig("-p", "nqweotexistent") + """, + ) + # pytest.raises(ImportError, + # "config.do_configure(config)" + # ) + + +def test_plugin_already_exists(testdir): + config = testdir.parseconfig("-p", "terminal") + assert config.option.plugins == ["terminal"] + config._do_configure() + config._ensure_unconfigure() + + +def test_exclude(testdir): + hellodir = testdir.mkdir("hello") + hellodir.join("test_hello.py").write("x y syntaxerror") + hello2dir = testdir.mkdir("hello2") + hello2dir.join("test_hello2.py").write("x y syntaxerror") + testdir.makepyfile(test_ok="def test_pass(): pass") + result = testdir.runpytest("--ignore=hello", "--ignore=hello2") + assert result.ret == 0 + result.stdout.fnmatch_lines(["*1 passed*"]) + + +def test_deselect(testdir): + testdir.makepyfile( + test_a=""" + import pytest + def test_a1(): pass + @pytest.mark.parametrize('b', range(3)) + def test_a2(b): pass + """ + ) + result = testdir.runpytest( + "-v", "--deselect=test_a.py::test_a2[1]", "--deselect=test_a.py::test_a2[2]" + ) + assert result.ret == 0 + result.stdout.fnmatch_lines(["*2 passed, 2 deselected*"]) + for line in result.stdout.lines: + assert not line.startswith(("test_a.py::test_a2[1]", "test_a.py::test_a2[2]")) + + +def test_sessionfinish_with_start(testdir): + testdir.makeconftest( + """ + import os + values = [] + def pytest_sessionstart(): + values.append(os.getcwd()) + os.chdir("..") + + def pytest_sessionfinish(): + assert values[0] == os.getcwd() + + """ + ) + res = testdir.runpytest("--collect-only") + assert res.ret == EXIT_NOTESTSCOLLECTED + + +@pytest.mark.parametrize("path", ["root", "{relative}/root", "{environment}/root"]) +def test_rootdir_option_arg(testdir, monkeypatch, path): + monkeypatch.setenv("PY_ROOTDIR_PATH", str(testdir.tmpdir)) + path = path.format(relative=str(testdir.tmpdir), environment="$PY_ROOTDIR_PATH") + + rootdir = testdir.mkdir("root") + rootdir.mkdir("tests") + testdir.makepyfile( + """ + import os + def test_one(): + assert 1 + """ + ) + + result = testdir.runpytest("--rootdir={}".format(path)) + result.stdout.fnmatch_lines( + ["*rootdir: {}/root, inifile:*".format(testdir.tmpdir), "*1 passed*"] + ) + + +def test_rootdir_wrong_option_arg(testdir): + testdir.makepyfile( + """ + import os + def test_one(): + assert 1 + """ + ) + + result = testdir.runpytest("--rootdir=wrong_dir") + result.stderr.fnmatch_lines( + ["*Directory *wrong_dir* not found. Check your '--rootdir' option.*"] + ) |