temporarily adding files for playing with hudson
--HG-- branch : trunk
This commit is contained in:
		
							parent
							
								
									7864f6a4fd
								
							
						
					
					
						commit
						cd96e52144
					
				|  | @ -0,0 +1,21 @@ | |||
| import os, sys, subprocess, urllib | ||||
| 
 | ||||
| BUILDNAME=os.environ.get('BUILD_NUMBER', "1") | ||||
| BIN=os.path.abspath(os.path.join(BUILDNAME, 'bin')) | ||||
| PYTHON=os.path.join(BIN, 'python') | ||||
| 
 | ||||
| def call(*args): | ||||
|     ret = subprocess.call(list(args)) | ||||
|     assert ret == 0 | ||||
| 
 | ||||
| def bincall(*args): | ||||
|     args = list(args) | ||||
|     args[0] = os.path.join(BIN, args[0]) | ||||
|     call(*args) | ||||
| 
 | ||||
| call("virtualenv", BUILDNAME, '--no-site-packages') | ||||
| bincall("python", "setup.py", "develop", "-q") | ||||
| bincall("pip", "install", "-r", "testing/pip-reqs1.txt",  | ||||
|                "-q", "--download-cache=download") | ||||
| bincall("py.test", "-p", "xmlresult", "--xmlresult=junit.xml",  | ||||
|         "--report=skipped", "--runslowtest") | ||||
|  | @ -0,0 +1,189 @@ | |||
| """ | ||||
|    xmlresult plugin for machine-readable logging of test results.  | ||||
|    Useful for cruisecontrol integration code. | ||||
|     | ||||
|    An adaptation of pytest_resultlog.py | ||||
| """ | ||||
| 
 | ||||
| import time | ||||
| 
 | ||||
| def pytest_addoption(parser): | ||||
|     group = parser.addgroup("xmlresult", "xmlresult plugin options") | ||||
|     group.addoption('--xmlresult', action="store", dest="xmlresult", metavar="path", default=None, | ||||
|            help="path for machine-readable xml result log.") | ||||
| 
 | ||||
| def pytest_configure(config): | ||||
|     xmlresult = config.option.xmlresult | ||||
|     if xmlresult: | ||||
|         logfile = open(xmlresult, 'w', 1) # line buffered | ||||
|         config._xmlresult = XMLResult(logfile)  | ||||
|         config.pluginmanager.register(config._xmlresult) | ||||
| 
 | ||||
| def pytest_unconfigure(config): | ||||
|     xmlresult = getattr(config, '_xmlresult', None) | ||||
|     if xmlresult: | ||||
|         xmlresult.logfile.close() | ||||
|         del config._xmlresult  | ||||
|         config.pluginmanager.unregister(xmlresult) | ||||
| 
 | ||||
| def generic_path(item): | ||||
|     chain = item.listchain() | ||||
|     gpath = [chain[0].name] | ||||
|     fspath = chain[0].fspath | ||||
|     fspart = False | ||||
|     for node in chain[1:]: | ||||
|         newfspath = node.fspath | ||||
|         if newfspath == fspath: | ||||
|             if fspart: | ||||
|                 gpath.append(':') | ||||
|                 fspart = False | ||||
|             else: | ||||
|                 gpath.append('.') | ||||
|         else: | ||||
|             gpath.append('/') | ||||
|             fspart = True | ||||
|         name = node.name | ||||
|         if name[0] in '([': | ||||
|             gpath.pop() | ||||
|         gpath.append(name) | ||||
|         fspath = newfspath | ||||
|     return ''.join(gpath) | ||||
|          | ||||
| class XMLResult(object): | ||||
|     test_start_time = 0.0 | ||||
|     test_taken_time = 0.0 | ||||
|     test_count = 0 | ||||
|     error_count = 0 | ||||
|     failure_count = 0 | ||||
|     skip_count = 0 | ||||
|      | ||||
|     def __init__(self, logfile): | ||||
|         self.logfile = logfile | ||||
|         self.test_logs = [] | ||||
|      | ||||
|     def write_log_entry(self, testpath, shortrepr, longrepr): | ||||
|         self.test_count += 1 | ||||
|         # Create an xml log entry for the tests | ||||
|         self.test_logs.append('<testcase test_method="%s" name="%s" time="%.3f">' % (testpath.split(':')[-1], testpath, self.test_taken_time)) | ||||
|          | ||||
|         # Do we have any other data to capture for Errors, Fails and Skips | ||||
|         if shortrepr in ['E', 'F', 'S']: | ||||
|              | ||||
|             if shortrepr == 'E': | ||||
|                 self.error_count += 1 | ||||
|             elif shortrepr == 'F': | ||||
|                 self.failure_count += 1 | ||||
|             elif shortrepr == 'S': | ||||
|                 self.skip_count += 1 | ||||
|              | ||||
|             tag_map = {'E': 'error', 'F': 'failure', 'S': 'skipped'} | ||||
|             self.test_logs.append("<%s>" % tag_map[shortrepr]) | ||||
|              | ||||
|             # Output any more information | ||||
|             for line in longrepr.splitlines(): | ||||
|                 self.test_logs.append("<![CDATA[%s\n]]>" % line) | ||||
|             self.test_logs.append("</%s>" % tag_map[shortrepr]) | ||||
|         self.test_logs.append("</testcase>") | ||||
| 
 | ||||
|     def log_outcome(self, node, shortrepr, longrepr): | ||||
|         self.write_log_entry(node.name, shortrepr, longrepr) | ||||
| 
 | ||||
|     def pytest_runtest_logreport(self, report): | ||||
|         code = report.shortrepr  | ||||
|         if report.passed: | ||||
|             longrepr = "" | ||||
|             code = "." | ||||
|         elif report.failed: | ||||
|             longrepr = str(report.longrepr) | ||||
|             code = "F" | ||||
|         elif report.skipped: | ||||
|             code = "S" | ||||
|             longrepr = str(report.longrepr.reprcrash.message) | ||||
|         self.log_outcome(report.item, code, longrepr) | ||||
|          | ||||
|     def pytest_runtest_setup(self, item): | ||||
|         self.test_start_time = time.time() | ||||
|      | ||||
|     def pytest_runtest_teardown(self, item): | ||||
|         self.test_taken_time = time.time() - self.test_start_time | ||||
|          | ||||
|     def pytest_collectreport(self, report): | ||||
|         if not report.passed: | ||||
|             if report.failed: | ||||
|                 code = "F" | ||||
|             else: | ||||
|                 assert report.skipped | ||||
|                 code = "S" | ||||
|             longrepr = str(report.longrepr.reprcrash) | ||||
|             self.log_outcome(report.collector, code, longrepr) | ||||
| 
 | ||||
|     def pytest_internalerror(self, excrepr): | ||||
|         path = excrepr.reprcrash.path | ||||
|         self.errors += 1 | ||||
|         self.write_log_entry(path, '!', str(excrepr)) | ||||
| 
 | ||||
|     def pytest_sessionstart(self, session): | ||||
|         self.suite_start_time = time.time() | ||||
| 
 | ||||
|     def pytest_sessionfinish(self, session, exitstatus): | ||||
|         """ | ||||
|         Write the xml output | ||||
|         """ | ||||
|         suite_stop_time = time.time() | ||||
|         suite_time_delta = suite_stop_time - self.suite_start_time | ||||
|         self.logfile.write('<testsuite ') | ||||
|         self.logfile.write('errors="%i" ' % self.error_count) | ||||
|         self.logfile.write('failures="%i" ' % self.failure_count) | ||||
|         self.logfile.write('skips="%i" ' % self.skip_count) | ||||
|         self.logfile.write('name="" ') | ||||
|         self.logfile.write('tests="%i" ' % self.test_count) | ||||
|         self.logfile.write('time="%.3f"' % suite_time_delta) | ||||
|         self.logfile.write(' >') | ||||
|         self.logfile.writelines(self.test_logs) | ||||
|         self.logfile.write('</testsuite>') | ||||
|         self.logfile.close() | ||||
| 
 | ||||
| 
 | ||||
| # Tests | ||||
| def test_generic(testdir, LineMatcher): | ||||
|     testdir.plugins.append("resultlog") | ||||
|     testdir.makepyfile(""" | ||||
|         import py | ||||
|         def test_pass(): | ||||
|             pass | ||||
|         def test_fail(): | ||||
|             assert 0 | ||||
|         def test_skip(): | ||||
|             py.test.skip("") | ||||
|     """) | ||||
|     testdir.runpytest("--xmlresult=result.xml") | ||||
|     lines = testdir.tmpdir.join("result.xml").readlines(cr=0) | ||||
|     LineMatcher(lines).fnmatch_lines([ | ||||
|         '*testsuite errors="0" failures="1" skips="1" name="" tests="3"*' | ||||
|     ]) | ||||
|     LineMatcher(lines).fnmatch_lines([ | ||||
|         '*<failure><![CDATA[def test_fail():*' | ||||
|     ]) | ||||
|     LineMatcher(lines).fnmatch_lines([ | ||||
|         '*<skipped><![CDATA[Skipped: <Skipped instance>*' | ||||
|     ]) | ||||
| 
 | ||||
| def test_generic_path(): | ||||
|     from py.__.test.collect import Node, Item, FSCollector | ||||
|     p1 = Node('a') | ||||
|     assert p1.fspath is None | ||||
|     p2 = Node('B', parent=p1) | ||||
|     p3 = Node('()', parent = p2) | ||||
|     item = Item('c', parent = p3) | ||||
|     res = generic_path(item) | ||||
|     assert res == 'a.B().c' | ||||
| 
 | ||||
|     p0 = FSCollector('proj/test') | ||||
|     p1 = FSCollector('proj/test/a', parent=p0) | ||||
|     p2 = Node('B', parent=p1) | ||||
|     p3 = Node('()', parent = p2) | ||||
|     p4 = Node('c', parent=p3) | ||||
|     item = Item('[1]', parent = p4) | ||||
| 
 | ||||
|     res = generic_path(item) | ||||
|     assert res == 'test/a:B().c[1]' | ||||
		Loading…
	
		Reference in New Issue