blob: 2eaa15cf37a42ff8adc8aff6f773cf1057cfff56 [file] [log] [blame]
import os
import sys
helpers_dir = os.getenv("PYCHARM_HELPERS_DIR", sys.path[0])
if sys.path[0] != helpers_dir:
sys.path.insert(0, helpers_dir)
from tcmessages import TeamcityServiceMessages
from pycharm_run_utils import adjust_sys_path
adjust_sys_path(False)
messages = TeamcityServiceMessages(prepend_linebreak=True)
messages.testMatrixEntered()
try:
import pytest
PYVERSION = [int(x) for x in pytest.__version__.split(".")]
except:
import py
PYVERSION = [int(x) for x in py.__version__.split(".")]
def get_name(nodeid):
return nodeid.split("::")[-1]
def fspath_to_url(fspath):
return "file:///" + str(fspath).replace("\\", "/")
if PYVERSION > [1, 4, 0]:
items = {}
current_suite = None
current_file = None
current_file_suite = None
def pytest_runtest_logstart(nodeid, location):
path = "file://" + os.path.realpath(location[0])
if location[1]:
path += ":" +str(location[1] + 1)
global current_suite, current_file, current_file_suite
current_file = nodeid.split("::")[0]
file_suite = current_file.split("/")[-1]
if file_suite != current_file_suite:
if current_suite:
messages.testSuiteFinished(current_suite)
if current_file_suite:
messages.testSuiteFinished(current_file_suite)
current_file_suite = file_suite
if current_file_suite:
messages.testSuiteStarted(current_file_suite, location="file://" + os.path.realpath(location[0]))
if location[2].find(".") != -1:
suite = location[2].split(".")[0]
name = location[2].split(".")[-1]
else:
name = location[2]
splitted = nodeid.split("::")
try:
ind = splitted.index(name.split("[")[0])
except ValueError:
try:
ind = splitted.index(name)
except ValueError:
ind = 0
if splitted[ind-1] == current_file:
suite = None
else:
suite = current_suite
if suite != current_suite:
if current_suite:
messages.testSuiteFinished(current_suite)
current_suite = suite
if current_suite:
messages.testSuiteStarted(current_suite, location="file://" + os.path.realpath(location[0]))
messages.testStarted(name, location=path)
items[nodeid] = name
def pytest_runtest_logreport(report):
name = items[report.nodeid]
if report.skipped:
messages.testIgnored(name)
elif report.failed:
messages.testFailed(name, details=report.longrepr)
elif report.when == "call":
messages.testFinished(name)
def pytest_sessionfinish(session, exitstatus):
if current_suite:
messages.testSuiteFinished(current_suite)
if current_file_suite:
messages.testSuiteFinished(current_file_suite)
from _pytest.terminal import TerminalReporter
class PycharmTestReporter(TerminalReporter):
def __init__(self, config, file=None):
TerminalReporter.__init__(self, config, file)
def summary_errors(self):
reports = self.getreports('error')
if not reports:
return
for rep in self.stats['error']:
name = rep.nodeid.split("/")[-1]
location = None
if hasattr(rep, 'location'):
location, lineno, domain = rep.location
messages.testSuiteStarted(name, location=fspath_to_url(location))
messages.testStarted("<noname>", location=fspath_to_url(location))
TerminalReporter.summary_errors(self)
messages.testError("<noname>")
messages.testSuiteFinished(name)
else:
def pytest_collectstart(collector):
if collector.name != "()":
messages.testSuiteStarted(collector.name, location=fspath_to_url(collector.fspath))
def pytest_runtest_makereport(item, call):
if call.when == "setup":
fspath, lineno, msg = item.reportinfo()
url = fspath_to_url(fspath)
if lineno: url += ":" + str(lineno)
# messages.testStarted(item.name, location=url)
def pytest_runtest_logreport(report):
if report.item._args:
name = report.item.function.__name__ + str(report.item._args)
else:
name = report.item.name
if report.failed:
messages.testFailed(name, details=report.longrepr)
elif report.skipped:
messages.testIgnored(name)
else:
messages.testFinished(name)
def pytest_collectreport(report):
if report.collector.name != "()":
messages.testSuiteFinished(report.collector.name)
def pytest_itemstart(item, node=None):
if item._args:
name = item.function.__name__ + str(item._args)
else:
name = item.name
if hasattr(item, "_fslineno"):
path = fspath_to_url(item._fslineno[0]) + ":" + str(item._fslineno[1] + 1)
else:
path = fspath_to_url(item.fspath)
messages.testStarted(name, location=path)