FAQ
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
dhunt at mozilla.com


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pytest-dev/attachments/20150415/e8ede6f1/attachment.html>

Search Discussions

  • Bruno Oliveira at Apr 15, 2015 at 8:16 pm
    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
    [2]
    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 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

    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

    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
    and
    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
    dhunt at mozilla.com


    _______________________________________________
    pytest-dev mailing list
    pytest-dev at python.org
    https://mail.python.org/mailman/listinfo/pytest-dev
    -------------- next part --------------
    An HTML attachment was scrubbed...
    URL: <http://mail.python.org/pipermail/pytest-dev/attachments/20150415/40d3753c/attachment.html>
  • Dave Hunt at Apr 16, 2015 at 4:46 pm
    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:


    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
    dhunt at mozilla.com

    On 15 Apr 2015, at 21:16, Bruno Oliveira 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 <dhunt at mozilla.com 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
    dhunt at mozilla.com <mailto:dhunt@mozilla.com>

    _______________________________________________
    pytest-dev mailing list
    pytest-dev at python.org <mailto:pytest-dev@python.org>
    https://mail.python.org/mailman/listinfo/pytest-dev <https://mail.python.org/mailman/listinfo/pytest-dev>

    -------------- next part --------------
    An HTML attachment was scrubbed...
    URL: <http://mail.python.org/pipermail/pytest-dev/attachments/20150416/ae52da44/attachment-0001.html>
  • Holger krekel at Apr 19, 2015 at 8:16 am

    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
    dhunt at mozilla.com
    On 15 Apr 2015, at 21:16, Bruno Oliveira 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 <dhunt at mozilla.com 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
    dhunt at mozilla.com <mailto:dhunt@mozilla.com>

    _______________________________________________
    pytest-dev mailing list
    pytest-dev at python.org <mailto:pytest-dev@python.org>
    https://mail.python.org/mailman/listinfo/pytest-dev <https://mail.python.org/mailman/listinfo/pytest-dev>
    _______________________________________________
    pytest-dev mailing list
    pytest-dev at python.org
    https://mail.python.org/mailman/listinfo/pytest-dev



    --
    about me: http://holgerkrekel.net/about-me/
    contracting: http://merlinux.eu
  • Dave Hunt at Apr 20, 2015 at 1:16 pm
    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
    dhunt at mozilla.com

    On 19 Apr 2015, at 09:16, holger krekel 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
    dhunt at mozilla.com
    On 15 Apr 2015, at 21:16, Bruno Oliveira 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 <dhunt at mozilla.com 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
    dhunt at mozilla.com <mailto:dhunt@mozilla.com>

    _______________________________________________
    pytest-dev mailing list
    pytest-dev at python.org <mailto:pytest-dev@python.org>
    https://mail.python.org/mailman/listinfo/pytest-dev <https://mail.python.org/mailman/listinfo/pytest-dev>
    _______________________________________________
    pytest-dev mailing list
    pytest-dev at python.org
    https://mail.python.org/mailman/listinfo/pytest-dev

    --
    about me: http://holgerkrekel.net/about-me/
    contracting: http://merlinux.eu

    -------------- next part --------------
    An HTML attachment was scrubbed...
    URL: <http://mail.python.org/pipermail/pytest-dev/attachments/20150420/8926c257/attachment-0001.html>

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppytest-dev @
categoriespython
postedApr 15, '15 at 3:05p
activeApr 20, '15 at 1:16p
posts5
users3
websitepython.org

People

Translate

site design / logo © 2018 Grokbase