Thanks for the help! I’ve just released the plugin on PyPI: https://pypi.python.org/pypi/pytest-html
-- Dave Hunt Firefox OS Automation Engineer Mozilla Corporation [email protected] > On 19 Apr 2015, at 09:16, holger krekel <[email protected]> wrote: > > On Thu, Apr 16, 2015 at 17:46 +0100, Dave Hunt wrote: >> Thanks Bruno, the custom hook works well. Here’s the change: >> https://github.com/davehunt/pytest-html/commit/2a405a3cdc638c1896ab3d1074296496bb1fa3a8 >> >> <https://github.com/davehunt/pytest-html/commit/2a405a3cdc638c1896ab3d1074296496bb1fa3a8> >> >> Now I need to work out why I get issues when I use this with pytest-xdist. >> It looks like it’s complaining about the extra report details not being >> serializable?! See traceback below: > > Yes, you need to make sure that anything extra you put on the report is > marshallable. > In the case of your url you may just send a string and parse as url on > the logreport/master side. > > holger > > >> test_login.py::TestLogin::test_invalid_username INTERNALERROR> Traceback >> (most recent call last): >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/main.py", >> line 84, in wrap_session >> INTERNALERROR> doit(config, session) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/main.py", >> line 122, in _main >> INTERNALERROR> config.hook.pytest_runtestloop(session=session) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/core.py", >> line 521, in __call__ >> INTERNALERROR> return self._docall(self.methods, kwargs) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/core.py", >> line 528, in _docall >> INTERNALERROR> firstresult=self.firstresult).execute() >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/core.py", >> line 394, in execute >> INTERNALERROR> res = method(*args) >> INTERNALERROR> File "<remote exec>", line 56, in pytest_runtestloop >> INTERNALERROR> File "<remote exec>", line 72, in run_tests >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/core.py", >> line 521, in __call__ >> INTERNALERROR> return self._docall(self.methods, kwargs) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/core.py", >> line 528, in _docall >> INTERNALERROR> firstresult=self.firstresult).execute() >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/core.py", >> line 393, in execute >> INTERNALERROR> return wrapped_call(method(*args), self.execute) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/core.py", >> line 113, in wrapped_call >> INTERNALERROR> return call_outcome.get_result() >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/core.py", >> line 138, in get_result >> INTERNALERROR> py.builtin._reraise(*ex) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/core.py", >> line 123, in __init__ >> INTERNALERROR> self.result = func() >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/core.py", >> line 394, in execute >> INTERNALERROR> res = method(*args) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/runner.py", >> line 65, in pytest_runtest_protocol >> INTERNALERROR> runtestprotocol(item, nextitem=nextitem) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/runner.py", >> line 75, in runtestprotocol >> INTERNALERROR> reports.append(call_and_report(item, "call", log)) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/runner.py", >> line 123, in call_and_report >> INTERNALERROR> hook.pytest_runtest_logreport(report=report) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/core.py", >> line 521, in __call__ >> INTERNALERROR> return self._docall(self.methods, kwargs) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/core.py", >> line 528, in _docall >> INTERNALERROR> firstresult=self.firstresult).execute() >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/core.py", >> line 394, in execute >> INTERNALERROR> res = method(*args) >> INTERNALERROR> File "<remote exec>", line 86, in pytest_runtest_logreport >> INTERNALERROR> File "<remote exec>", line 23, in sendevent >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/execnet/gateway_base.py", >> line 691, in send >> INTERNALERROR> self.gateway._send(Message.CHANNEL_DATA, self.id, >> dumps_internal(item)) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/execnet/gateway_base.py", >> line 1295, in dumps_internal >> INTERNALERROR> return _Serializer().save(obj) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/execnet/gateway_base.py", >> line 1313, in save >> INTERNALERROR> self._save(obj) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/execnet/gateway_base.py", >> line 1331, in _save >> INTERNALERROR> dispatch(self, obj) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/execnet/gateway_base.py", >> line 1412, in save_tuple >> INTERNALERROR> self._save(item) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/execnet/gateway_base.py", >> line 1331, in _save >> INTERNALERROR> dispatch(self, obj) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/execnet/gateway_base.py", >> line 1408, in save_dict >> INTERNALERROR> self._write_setitem(key, value) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/execnet/gateway_base.py", >> line 1402, in _write_setitem >> INTERNALERROR> self._save(value) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/execnet/gateway_base.py", >> line 1331, in _save >> INTERNALERROR> dispatch(self, obj) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/execnet/gateway_base.py", >> line 1408, in save_dict >> INTERNALERROR> self._write_setitem(key, value) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/execnet/gateway_base.py", >> line 1402, in _write_setitem >> INTERNALERROR> self._save(value) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/execnet/gateway_base.py", >> line 1331, in _save >> INTERNALERROR> dispatch(self, obj) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/execnet/gateway_base.py", >> line 1398, in save_list >> INTERNALERROR> self._write_setitem(i, item) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/execnet/gateway_base.py", >> line 1402, in _write_setitem >> INTERNALERROR> self._save(value) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/execnet/gateway_base.py", >> line 1329, in _save >> INTERNALERROR> raise DumpError("can't serialize %s" % (tp,)) >> INTERNALERROR> DumpError: can't serialize <class 'pytest_html.URL'> >> >> INTERNALERROR> Traceback (most recent call last): >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/main.py", >> line 84, in wrap_session >> INTERNALERROR> doit(config, session) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/main.py", >> line 122, in _main >> INTERNALERROR> config.hook.pytest_runtestloop(session=session) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/core.py", >> line 521, in __call__ >> INTERNALERROR> return self._docall(self.methods, kwargs) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/core.py", >> line 528, in _docall >> INTERNALERROR> firstresult=self.firstresult).execute() >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/pytest-2.7.0-py2.7.egg/_pytest/core.py", >> line 394, in execute >> INTERNALERROR> res = method(*args) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/xdist/dsession.py", >> line 504, in pytest_runtestloop >> INTERNALERROR> self.loop_once() >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/xdist/dsession.py", >> line 522, in loop_once >> INTERNALERROR> call(**kwargs) >> INTERNALERROR> File >> "/Users/dhunt/.virtualenvs/tmp-97b1b20a17ffb8d0/lib/python2.7/site-packages/xdist/dsession.py", >> line 560, in slave_slavefinished >> INTERNALERROR> assert not crashitem, (crashitem, node) >> INTERNALERROR> AssertionError: >> ('test_login.py::TestLogin::()::test_invalid_username', <SlaveController >> gw0>) >> >> -- >> Dave Hunt >> Firefox OS Automation Engineer >> Mozilla Corporation >> [email protected] >> >>> On 15 Apr 2015, at 21:16, Bruno Oliveira <[email protected]> wrote: >>> >>> Hi Dave, >>> >>> Congratulations on this initiative to separate this functionality into a >>> separate plugin, it seems very useful! :) >>> >>> One way to allow other plugins to interact with yours is by defining your >>> own hooks. Pytest-xdist does this[1], and as an example, the builtin hook >>> pytest_report_header[2] seems to do something similar to what you want, in >>> the sense that it allows other plugins to add information to the terminal >>> header. >>> >>> Perhaps you can declare a hook `pytest_html_report_environment`, which >>> plugins can implement and return a dict of environment variables to be >>> added to the report? Or perhaps, if it makes sense for the environment >>> details to appear in the terminal output as well, you could in fact just >>> call `pytest_report_header` and add its contents into the HTML; the latter >>> has the benefit that existing plugins which already use >>> `pytest_report_header` will be able to write their information to the HTML >>> report. >>> >>> Cheers, >>> >>> [1] >>> https://bitbucket.org/pytest-dev/pytest-xdist/src/00cfff4834e718fd3c1ccec40811e734d796f631/xdist/newhooks.py >>> >>> <https://bitbucket.org/pytest-dev/pytest-xdist/src/00cfff4834e718fd3c1ccec40811e734d796f631/xdist/newhooks.py> >>> [2] >>> http://pytest.org/latest/example/simple.html?highlight=pytest_report_header#adding-info-to-test-report-header >>> >>> <http://pytest.org/latest/example/simple.html?highlight=pytest_report_header#adding-info-to-test-report-header> >>> >>> On Wed, Apr 15, 2015 at 12:05 PM, Dave Hunt <[email protected] >>> <mailto:[email protected]>> wrote: >>> Hey py.testers! >>> >>> I’ve been working on pulling a feature out of our pytest-mozwebqa plugin >>> into a standalone plugin. I think others may find it useful, and it would >>> simplify maintenance of the former plugin to split this out. Please take a >>> look over the pytest-html plugin, the source code is available here: >>> https://github.com/davehunt/pytest-html >>> <https://github.com/davehunt/pytest-html> >>> >>> Basically this plugin provides a new command line option of —html which >>> allows the user to specify a path for a HTML report to be generated. The >>> report can then be enhanced by adding extra components via the >>> pytest_runtest_makereport hook. You can see an example of this in my >>> in-progress branch of pytest-mozwebqa where I’ve switched to using the new >>> plugin: >>> https://github.com/davehunt/pytest-mozwebqa/blob/1074f0770a146cff3108191a2fe239d15cfd92e4/pytest_mozwebqa/pytest_mozwebqa.py#L126 >>> >>> <https://github.com/davehunt/pytest-mozwebqa/blob/1074f0770a146cff3108191a2fe239d15cfd92e4/pytest_mozwebqa/pytest_mozwebqa.py#L126> >>> >>> What I’d like some help with is providing the HTML report with environment >>> details. This is essentially just a dictionary that will be included in the >>> HTML report, but should be optionally provided by another plugin or >>> conftest.py file. At the moment I accept an environment keyword argument >>> when instantiating the HTMLReport object, but I’m not aware of a way to >>> influence this from another plugin. See: >>> https://github.com/davehunt/pytest-html/blob/752f229b990c80e66195374a4ed4fe22b98017c6/pytest_html.py#L44 >>> >>> <https://github.com/davehunt/pytest-html/blob/752f229b990c80e66195374a4ed4fe22b98017c6/pytest_html.py#L44> >>> and >>> https://github.com/davehunt/pytest-html/blob/752f229b990c80e66195374a4ed4fe22b98017c6/pytest_html.py#L195 >>> >>> <https://github.com/davehunt/pytest-html/blob/752f229b990c80e66195374a4ed4fe22b98017c6/pytest_html.py#L195> >>> >>> If anybody has any advice it would be much appreciated! >>> >>> Thanks in advance, >>> >>> -- >>> Dave Hunt >>> Automation Engineer >>> Mozilla Corporation >>> [email protected] <mailto:[email protected]> >>> >>> _______________________________________________ >>> pytest-dev mailing list >>> [email protected] <mailto:[email protected]> >>> https://mail.python.org/mailman/listinfo/pytest-dev >>> <https://mail.python.org/mailman/listinfo/pytest-dev> >>> >>> >> > >> _______________________________________________ >> pytest-dev mailing list >> [email protected] >> https://mail.python.org/mailman/listinfo/pytest-dev > > > -- > about me: http://holgerkrekel.net/about-me/ > contracting: http://merlinux.eu
_______________________________________________ pytest-dev mailing list [email protected] https://mail.python.org/mailman/listinfo/pytest-dev
