diff --git a/.travis.yml b/.travis.yml index 1c865fb9e..a6fc5757d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,32 @@ +sudo: false language: python # command to install dependencies -install: "pip install -U detox" +install: "pip install -U tox" # # command to run tests -script: detox --recreate -i ALL=https://devpi.net/hpk/dev/ +env: + matrix: + - TESTENV=flakes + - TESTENV=py26 + - TESTENV=py27 + - TESTENV=py34 + - TESTENV=pypy + - TESTENV=py27-pexpect + - TESTENV=py33-pexpect + - TESTENV=py27-nobyte + - TESTENV=py33 + - TESTENV=py27-xdist + - TESTENV=py33-xdist + - TESTENV=py27 + - TESTENV=py27-trial + - TESTENV=py33 + - TESTENV=py33-trial + # inprocess tests by default were introduced in 2.8 only; + # this TESTENV should be enabled when merged back to master + #- TESTENV=py27-subprocess + - TESTENV=doctesting + - TESTENV=py27-cxfreeze + - TESTENV=coveralls +script: tox --recreate -i ALL=https://devpi.net/hpk/dev/ -e $TESTENV notifications: irc: diff --git a/AUTHORS b/AUTHORS index fc434fca5..bb5fec0d6 100644 --- a/AUTHORS +++ b/AUTHORS @@ -8,6 +8,7 @@ Andreas Zeidler Andy Freeland Anthon van der Neut Armin Rigo +Aron Curzon Benjamin Peterson Bob Ippolito Brian Dorsey diff --git a/CHANGELOG b/CHANGELOG index 952694d7b..74fb004f6 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,9 @@ 2.7.2 (compared to 2.7.1) ----------------------------- +- Automatically create directory for junitxml and results log. + Thanks Aron Curzon. + - fix issue713: JUnit XML reports for doctest failures. Thanks Punyashloka Biswal. diff --git a/_pytest/junitxml.py b/_pytest/junitxml.py index ef07c7a08..8f6c36ff9 100644 --- a/_pytest/junitxml.py +++ b/_pytest/junitxml.py @@ -205,6 +205,9 @@ class LogXML(object): self.suite_start_time = time.time() def pytest_sessionfinish(self): + dirname = os.path.dirname(os.path.abspath(self.logfile)) + if not os.path.isdir(dirname): + os.makedirs(dirname) logfile = open(self.logfile, 'w', encoding='utf-8') suite_stop_time = time.time() suite_time_delta = suite_stop_time - self.suite_start_time diff --git a/_pytest/resultlog.py b/_pytest/resultlog.py index 0c100552f..3670f0214 100644 --- a/_pytest/resultlog.py +++ b/_pytest/resultlog.py @@ -3,6 +3,7 @@ text file. """ import py +import os def pytest_addoption(parser): group = parser.getgroup("terminal reporting", "resultlog plugin options") @@ -14,6 +15,9 @@ def pytest_configure(config): resultlog = config.option.resultlog # prevent opening resultlog on slave nodes (xdist) if resultlog and not hasattr(config, 'slaveinput'): + dirname = os.path.dirname(os.path.abspath(resultlog)) + if not os.path.isdir(dirname): + os.makedirs(dirname) logfile = open(resultlog, 'w', 1) # line buffered config._resultlog = ResultLog(config, logfile) config.pluginmanager.register(config._resultlog) diff --git a/testing/test_junitxml.py b/testing/test_junitxml.py index 9da836bbe..d019f87cc 100644 --- a/testing/test_junitxml.py +++ b/testing/test_junitxml.py @@ -474,6 +474,16 @@ def test_logxml_changingdir(testdir): assert result.ret == 0 assert testdir.tmpdir.join("a/x.xml").check() +def test_logxml_makedir(testdir): + """--junitxml should automatically create directories for the xml file""" + testdir.makepyfile(""" + def test_pass(): + pass + """) + result = testdir.runpytest("--junitxml=path/to/results.xml") + assert result.ret == 0 + assert testdir.tmpdir.join("path/to/results.xml").check() + def test_escaped_parametrized_names_xml(testdir): testdir.makepyfile(""" import pytest diff --git a/testing/test_resultlog.py b/testing/test_resultlog.py index e4f3faccc..ef1d6d040 100644 --- a/testing/test_resultlog.py +++ b/testing/test_resultlog.py @@ -180,6 +180,21 @@ def test_generic(testdir, LineMatcher): "x *:test_xfail_norun", ]) +def test_makedir_for_resultlog(testdir, LineMatcher): + """--resultlog should automatically create directories for the log file""" + testdir.plugins.append("resultlog") + testdir.makepyfile(""" + import pytest + def test_pass(): + pass + """) + testdir.runpytest("--resultlog=path/to/result.log") + lines = testdir.tmpdir.join("path/to/result.log").readlines(cr=0) + LineMatcher(lines).fnmatch_lines([ + ". *:test_pass", + ]) + + def test_no_resultlog_on_slaves(testdir): config = testdir.parseconfig("-p", "resultlog", "--resultlog=resultlog") diff --git a/tox.ini b/tox.ini index 9f683c46f..0e315c03b 100644 --- a/tox.ini +++ b/tox.ini @@ -132,6 +132,18 @@ commands= {envpython} runtests_setup.py build --build-exe build {envpython} tox_run.py +[testenv:coveralls] +changedir=testing +basepython=python3.4 +deps = + {[testenv]deps} + coveralls +commands= + coverage run --source=_pytest {envdir}/bin/py.test + coverage report -m + coveralls +passenv=COVERALLS_REPO_TOKEN + [pytest] minversion=2.0 plugins=pytester