<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>pytest blog</title><link>/</link><description></description><lastBuildDate>Mon, 27 Nov 2017 18:00:00 +0100</lastBuildDate><item><title>What's new in pytest 3.3</title><link>/2017/whats-new-in-pytest-33/</link><description>&lt;p&gt;This blog post provides a short overview of some of the major features and changes in pytest 3.3. See the &lt;a href="http://doc.pytest.org/en/latest/changelog.html"&gt;CHANGELOG&lt;/a&gt; for the complete list.&lt;/p&gt;
&lt;h1&gt;Python 2.6 and 3.3 support dropped&lt;/h1&gt;
&lt;p&gt;Pytest 3.3 and onwards will no longer support Python 2.6 and 3.3. Those Python versions are EOL for some time now and incur maintenance and compatibility costs on the pytest core team, and following up with the rest of the community we decided that they will no longer be supported starting with this version. Users using those versions and with a modern enough &lt;code&gt;pip&lt;/code&gt; should not be affected, otherwise they should pin pytest to &amp;lt; 3.3.&lt;/p&gt;
&lt;h1&gt;Logging capture&lt;/h1&gt;
&lt;p&gt;Pytest now captures and displays output from the standard logging module. The user can control the logging level to be captured by specifying options in pytest.ini, the command line and also during individual tests using markers. Also, a &lt;code&gt;caplog&lt;/code&gt; fixture is available that enables users to test the captured log during specific tests (similar to &lt;code&gt;capsys&lt;/code&gt; for example). For more information, please see the &lt;a href="https://docs.pytest.org/en/latest/logging.html"&gt;logging docs&lt;/a&gt;. This feature was introduced by merging the popular &lt;a href="https://pypi.org/project/pytest-catchlog/"&gt;pytest-catchlog&lt;/a&gt; plugin, thanks to &lt;a href="https://github.com/thisch"&gt;Thomas Hisch&lt;/a&gt;. Be advised that with this merge the backward compatibility interface with the defunct pytest-capturelog has been dropped. &lt;/p&gt;
&lt;h1&gt;Progress display&lt;/h1&gt;
&lt;p&gt;The pytest output now includes a percentage indicator. Here's the partial output of pytest's own test suite:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;============================= test session starts =============================
platform win32 -- Python 3.6.3, pytest-3.3.0, py-1.5.2, pluggy-0.6.0
rootdir: C:\Users\appveyor\AppData\Local\Temp\1\devpi-test0\targz\pytest-3.3.0, inifile: tox.ini
plugins: hypothesis-3.38.5
collected 1985 items

testing\acceptance_test.py ...............s............................. [  2%]
...x.............                                                        [  3%]
testing\deprecated_test.py ........                                      [  3%]
testing\test_argcomplete.py ss                                           [  3%]
testing\test_assertion.py .............................................. [  5%]
...........................s.......                                      [  7%]
testing\test_assertrewrite.py ......................................s..s [  9%]
sss...........                                                           [ 10%]
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The output can be changed back to its former style by configuring your &lt;code&gt;pytest.ini&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[pytest]&lt;/span&gt;
&lt;span class="na"&gt;console_output_style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;classic&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;New capfdbinary and capsysbinary fixtures&lt;/h1&gt;
&lt;p&gt;Those two new fixtures return their contents as &lt;code&gt;bytes&lt;/code&gt; instead of &lt;code&gt;str&lt;/code&gt;, making them suitable to interact with programs that write binary data
to stdout/stderr.&lt;/p&gt;
&lt;h1&gt;pytest.skip() at module level&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;pytest.skip&lt;/code&gt; in 3.0 was changed so it could not be used at the module level; it was a common mistake to use it as a decorator in a test function,
when the user should have used &lt;code&gt;pytest.mark.skip&lt;/code&gt; instead, which would cause the whole module to be skipped.&lt;/p&gt;
&lt;p&gt;Some users missed this functionality, so &lt;code&gt;allow_module_level&lt;/code&gt; can be passed to &lt;code&gt;pytest.skip&lt;/code&gt; to skip an entire module:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pytest&lt;/span&gt;

&lt;span class="n"&gt;pytest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;skip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;this whole module is TODO&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;allow_module_level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;New dependencies&lt;/h1&gt;
&lt;p&gt;Pytest now depends on the following modules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/attrs/"&gt;attrs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/six/"&gt;six&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/pluggy/"&gt;pluggy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This change should not affect users.&lt;/p&gt;
&lt;h1&gt;Improvements and bugfixes&lt;/h1&gt;
&lt;p&gt;As usual, this release includes a lot of small improvements and bug fixes. Read the full &lt;a href="http://doc.pytest.org/en/latest/changelog.html"&gt;CHANGELOG&lt;/a&gt; for the complete list.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">nicoddemus</dc:creator><pubDate>Mon, 27 Nov 2017 18:00:00 +0100</pubDate><guid isPermaLink="false">tag:,2017-11-27:2017/whats-new-in-pytest-33/</guid><category>whatsnew</category></item><item><title>What's new in pytest 3.0</title><link>/2016/whats-new-in-pytest-30/</link><description>&lt;p&gt;This blog post provides a short overview of some of the major features and changes in pytest 3.0. See the &lt;a href="http://doc.pytest.org/en/latest/changelog.html"&gt;CHANGELOG&lt;/a&gt; for the complete list.&lt;/p&gt;
&lt;h1&gt;Additional command alias: &lt;code&gt;pytest&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;pytest came into existence as part of the &lt;a href="https://readthedocs.org/projects/pylib/"&gt;py&lt;/a&gt; library, providing a tool called &lt;code&gt;py.test&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Even after pytest was moved to a separate project, the &lt;code&gt;py.test&lt;/code&gt; name for the command-line tool was kept to preserve backward compatibility with existing scripts and tools.&lt;/p&gt;
&lt;p&gt;In pytest-3.0 the command-line tool is now called &lt;code&gt;pytest&lt;/code&gt;, which is easier to type and prevents some common misunderstandings when tools with the same name are installed in the system.&lt;/p&gt;
&lt;p&gt;Note that &lt;code&gt;py.test&lt;/code&gt; still works.&lt;/p&gt;
&lt;h1&gt;&lt;code&gt;approx()&lt;/code&gt;: function for comparing floating-point numbers&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;approx&lt;/code&gt; function makes it easy to perform floating-point comparisons using a syntax that's as intuitive and close to pytest's philosophy:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pytest&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;approx&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_similar&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;approx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;&lt;code&gt;yield&lt;/code&gt; statements in &lt;code&gt;@pytest.fixture&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;Fixtures marked with &lt;code&gt;@pytest.fixture&lt;/code&gt; can now use &lt;code&gt;yield&lt;/code&gt; statements to provide values for test functions exactly like fixtures marked with &lt;code&gt;@pytest.yield_fixture&lt;/code&gt; decorator:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;smtplib&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pytest&lt;/span&gt;

&lt;span class="nd"&gt;@pytest.fixture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;module&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;smtp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;smtplib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SMTP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;smtp.gmail.com&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;smtp&lt;/span&gt;
    &lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This makes it easier to change an existing fixture that uses &lt;code&gt;return&lt;/code&gt; to use &lt;code&gt;yield&lt;/code&gt; syntax if teardown code is needed later. Also, many users consider this style more clearer and natural than the previous method of registering a finalizer function using &lt;code&gt;request.addfinalizer&lt;/code&gt; because the flow of the test is more explicit. Consider:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;@pytest.fixture(scope=&amp;quot;module&amp;quot;)
def smtp(request):
    smtp = smtplib.SMTP(&amp;quot;smtp.gmail.com&amp;quot;)
    request.addfinalizer(smtp.close)
    return smtp
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This change renders &lt;code&gt;@pytest.yield_fixture&lt;/code&gt; deprecated and makes &lt;code&gt;@pytest.fixture&lt;/code&gt; with &lt;code&gt;yield&lt;/code&gt; statements the recommended way to write fixtures which require teardown code.&lt;/p&gt;
&lt;p&gt;Note that registering finalizers in &lt;code&gt;request&lt;/code&gt; is still supported and there's no intention of removing it in future pytest versions.&lt;/p&gt;
&lt;h1&gt;&lt;code&gt;doctest_namespace&lt;/code&gt; fixture&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;doctest_namespace&lt;/code&gt; fixture can be used to inject items into the
namespace in which doctests run. It is intended to be used by
auto-use fixtures to provide names to doctests.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;doctest_namespace&lt;/code&gt; is a standard &lt;code&gt;dict&lt;/code&gt; object:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# content of conftest.py&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt;
&lt;span class="nd"&gt;@pytest.fixture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;autouse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_np&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doctest_namespace&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;doctest_namespace&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;np&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Doctests below the &lt;code&gt;conftest.py&lt;/code&gt; file in the directory hierarchy can now use the &lt;code&gt;numpy&lt;/code&gt; module directly:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# content of numpy.py&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;gt;&amp;gt;&amp;gt; a = np.arange(10)&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;gt;&amp;gt;&amp;gt; len(a)&lt;/span&gt;
&lt;span class="sd"&gt;    10&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;Fixture &lt;code&gt;name&lt;/code&gt; parameter&lt;/h1&gt;
&lt;p&gt;Fixtures now support a &lt;code&gt;name&lt;/code&gt; parameter which allow them to be accessed by a different name than the function which defines it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@pytest.fixture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fixture_value&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This solves the problem where the function argument shadows the argument name, which annoys pylint and might cause bugs if one forgets to pull a fixture into a test function.&lt;/p&gt;
&lt;h1&gt;Disable capture within a test&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;capsys&lt;/code&gt; and &lt;code&gt;capfd&lt;/code&gt; fixtures now support a &lt;code&gt;disabled&lt;/code&gt; context-manager method which can be used to disable output capture temporarily within a test or fixture:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_disabling_capturing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;capsys&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;this output is captured&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;capsys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;output not captured, going directly to sys.stdout&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;this output is also captured&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;&lt;code&gt;pytest.raises&lt;/code&gt;: regular expressions and custom messages&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;ExceptionInfo.match&lt;/code&gt; method can be used to check exception messages using regular expressions, similar to &lt;code&gt;TestCase.assertRaisesRegexp&lt;/code&gt; method
from &lt;code&gt;unittest&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pytest&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;myfunc&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Exception 123 raised&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_match&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raises&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;excinfo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;myfunc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;excinfo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.* 123 .*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The regexp parameter is matched with the &lt;code&gt;re.search&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;Also, the context manager form accepts a &lt;code&gt;message&lt;/code&gt; keyword parameter to raise a custom message when the expected exception does not occur:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;KeyError&lt;/span&gt;

&lt;span class="nd"&gt;@pytest.mark.parametrize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;val&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;c&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_inputs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raises&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ne"&gt;KeyError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Key error not raised for {}&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="n"&gt;check_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;New hooks&lt;/h1&gt;
&lt;p&gt;pytest-3.0 adds new hooks, useful both for plugin authors and local &lt;code&gt;conftest.py&lt;/code&gt; plugins:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pytest_fixture_setup(fixturedef, request)&lt;/code&gt;: executes the fixture setup; &lt;/li&gt;
&lt;li&gt;&lt;code&gt;pytest_fixture_post_finalizer(fixturedef)&lt;/code&gt;: called after the fixture's finalizer and has access to the fixture's result cache;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pytest_make_parametrize_id(config, val)&lt;/code&gt;: allow plugins to provide user-friendly strings for custom types to be used by &lt;code&gt;@pytest.mark.parametrize&lt;/code&gt; calls;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Complete documentation for all pytest hooks can be found in the &lt;a href="doc.pytest.org/en/latest/writing_plugins.html"&gt;hooks documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Parametrize changes&lt;/h1&gt;
&lt;p&gt;Parametrize ids can now be set to &lt;code&gt;None&lt;/code&gt;, in which case the automatically generated id will be used:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pytest&lt;/span&gt;
&lt;span class="nd"&gt;@pytest.mark.parametrize&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;a,b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
                         &lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;basic&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;advanced&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This will result in the following tests:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;test_function[basic]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;test_function[1-1]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;test_function[advanced]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;New command line options&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;--fixtures-per-test&lt;/code&gt;: 
    Shows which fixtures are being used for each selected test item. Features doc strings of fixtures by default. Can also show where fixtures are defined if combined with &lt;code&gt;-v&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;--setup-show&lt;/code&gt;: 
    Performs normal test execution and additionally shows the setup and teardown of fixtures.    &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;--setup-plan&lt;/code&gt;:
    Performs normal collection and reports the potential setups and teardowns, but does not execute fixtures and tests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;--setup-only&lt;/code&gt;: 
    Performs normal collection, executes setup and teardown of fixtures and reports them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;--override-ini&lt;/code&gt;/&lt;code&gt;-o&lt;/code&gt;:
    Overrides values from the configuration file (&lt;code&gt;pytest.ini&lt;/code&gt;). For example, &lt;code&gt;"-o xfail_strict=True"&lt;/code&gt; will make all &lt;code&gt;xfail&lt;/code&gt; markers act as &lt;code&gt;strict&lt;/code&gt;, failing the test suite if they exit with &lt;code&gt;XPASS&lt;/code&gt; status.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;--pdbcls&lt;/code&gt;:
    Allow passing a custom debugger class that should be used together with the &lt;code&gt;--pdb&lt;/code&gt; option. Syntax is in the form &lt;code&gt;&amp;lt;module&amp;gt;:&amp;lt;class:&lt;/code&gt;, for example &lt;code&gt;--pdbcls=IPython.core.debugger:Pdb&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;--doctest-report&lt;/code&gt;:
    Changes the diff output format for doctests, can be one of: &lt;code&gt;none&lt;/code&gt;, &lt;code&gt;udiff&lt;/code&gt;, &lt;code&gt;cdiff&lt;/code&gt;, &lt;code&gt;ndiff&lt;/code&gt; or &lt;code&gt;only_first_failure&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Assert reinterpretation is gone&lt;/h1&gt;
&lt;p&gt;Assertion reinterpretation was the preferred method to display better assertion messages before assertion rewriting was implemented. Assertion rewriting is safer because there is no risk of introducing subtle errors because of assertions with side-effects. The &lt;code&gt;--assert=reinterp&lt;/code&gt; option has also been removed.&lt;/p&gt;
&lt;p&gt;See this &lt;a href="http://pybites.blogspot.com.br/2011/07/behind-scenes-of-pytests-new-assertion.html"&gt;excellent blog post&lt;/a&gt; by Benjamin Peterson for a great overview of the assertion-rewriting mechanism.&lt;/p&gt;
&lt;p&gt;In addition to this change, assertion rewriting is now also applied automatically in &lt;code&gt;conftest.py&lt;/code&gt; files and plugins installed using &lt;code&gt;setuptools&lt;/code&gt;.&lt;/p&gt;
&lt;h1&gt;Feature Deprecation&lt;/h1&gt;
&lt;p&gt;The pytest team took the opportunity to discuss how to handle feature deprecation during the &lt;a href="/2016/pytest-development-sprint/"&gt;pytest 2016 sprint&lt;/a&gt;, intending to minimize impact on the users as well as slowly fade-out some outdated features. It was decided:&lt;/p&gt;
&lt;h2&gt;Internal pytest-warnings now are displayed by default&lt;/h2&gt;
&lt;p&gt;Not showing them by default is confusing to users, as most people don't know how to display them in the first place. Also, it will help wider adoption of new ways of using pytest's features.&lt;/p&gt;
&lt;h2&gt;Deadline for deprecated features: new major version&lt;/h2&gt;
&lt;p&gt;Following &lt;a href="http://semver.org/"&gt;semantic versioning&lt;/a&gt;, the pytest team will add deprecation warnings to features which are considered obsolete because there are better alternatives or usage is low while maintenance burden on the team is high. Deprecated features will only be removed on the next &lt;strong&gt;major&lt;/strong&gt; release, for example pytest-4.0, giving users and plugin authors ample time to update. &lt;/p&gt;
&lt;h2&gt;Deprecated features&lt;/h2&gt;
&lt;p&gt;The following features have been considered officially deprecated in pytest-3.0, emitting pytest-warnings when used and scheduled for removal in 4.0:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;yield-based&lt;/code&gt; tests; use &lt;code&gt;@pytest.mark.parametrize&lt;/code&gt; instead;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pytest_funcarg__&lt;/code&gt; prefix to declare fixtures; use &lt;code&gt;@pytest.fixture&lt;/code&gt; decorator instead;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--resultlog&lt;/code&gt;: this option was rarely used and there are more modern alternatives;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Small improvements and bug-fixes&lt;/h1&gt;
&lt;p&gt;As usual, this release includes a lot of small improvements and bug fixes. Make sure to checkout the full &lt;a href="http://doc.pytest.org/en/latest/changelog.html"&gt;CHANGELOG&lt;/a&gt; for the complete list.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">nicoddemus</dc:creator><pubDate>Tue, 12 Jul 2016 12:00:00 +0200</pubDate><guid isPermaLink="false">tag:,2016-07-12:2016/whats-new-in-pytest-30/</guid><category>whatsnew</category></item><item><title>pytest development sprint</title><link>/2016/pytest-development-sprint/</link><description>&lt;p&gt;We have just wrapped up the pytest development sprint, which was held 20-25 June 2016 in Freiburg, Germany. Other sprints have taken place at Python conferences, but this was the first dedicated standalone event. We had 27 participants from five continents!&lt;/p&gt;
&lt;p&gt;It was funded by &lt;a href="https://www.indiegogo.com/projects/python-testing-sprint-mid-2016#/"&gt;an indiegogo campaign&lt;/a&gt; which raised over US$12,000 with nearly 100 backers. Several companies generously donated $300 or more:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.dropbox.com/home"&gt;Dropbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dolby.com/"&gt;Dolby Laboratories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.optiver.com/sydney/"&gt;Optiver APAC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.splunk.com/"&gt;Splunk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cobe.io/"&gt;Cobe.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://personalkollen.se/"&gt;Personalkollen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fanduel.com/"&gt;FanDuel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://brightspec.com/"&gt;BrightSpec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Participants travelled from around Europe and the UK, the US, Brazil, Australia and China.&lt;/p&gt;
&lt;p&gt;Work started or finished included the following.&lt;/p&gt;
&lt;p&gt;Discussions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;what to include in pytest 3.0&lt;/li&gt;
&lt;li&gt;advanced intro sessions on plugin mechanics (pluggy) and the fixture system implementation&lt;/li&gt;
&lt;li&gt;tox roadmap&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bitbucket.org/hpk42/tox/issues/338/generalize-package-builds-and-virtualenv"&gt;Started to conceptualize generalized package builds and virtualenv creation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;process for removing deprecated features&lt;/li&gt;
&lt;li&gt;proposal for &lt;a href="https://github.com/pytest-dev/pytest/pull/1660"&gt;combining parametrize with fixtures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;new 'fromcontext'/'invocation' scope for fixtures and some initial prototyping  &lt;/li&gt;
&lt;li&gt;lightning talks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Post it notes for planning" class="img-rounded" src="/2016/pytest-development-sprint/images/sprint_postits.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Major features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dropping pytest assert reinterpret code&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest/issues/1629"&gt;rename binary from 'py.test' to 'pytest'&lt;/a&gt; (but don't worry, &lt;code&gt;py.test&lt;/code&gt; will still work)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest/wiki/Docs-refactor"&gt;documentation restructuring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest/pull/1647"&gt;&lt;code&gt;--setup-only&lt;/code&gt; and &lt;code&gt;--setup-plan&lt;/code&gt; flags which show how fixtures are initialised without actually running the tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Adding &lt;code&gt;-o&lt;/code&gt; commandline option to override .ini config values&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pytest-qt features - improvements towards a &lt;a href="https://github.com/pytest-dev/pytest-qt/blob/master/CHANGELOG.rst"&gt;2.0 release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;pytest-bdd enhancements&lt;/li&gt;
&lt;li&gt;pytest-django: triaged issues in general and made some progress especially with regard to better handle DB access/setup.&lt;/li&gt;
&lt;li&gt;pytest-html enhancements&lt;/li&gt;
&lt;li&gt;pytest-factoryboy enhancements&lt;/li&gt;
&lt;li&gt;pytest-selenium enhancements&lt;/li&gt;
&lt;li&gt;pytest-repeat enhancements&lt;/li&gt;
&lt;li&gt;pytest-environment research&lt;/li&gt;
&lt;li&gt;cookiecutter-pytest-plugin improvements&lt;/li&gt;
&lt;li&gt;4 projects &lt;a href="http://pytest.org/latest/contributing.html#submitting-plugins-to-pytest-dev"&gt;submitted&lt;/a&gt; to pytest-dev organisation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bugs fixed/in progress:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest/issues/1421"&gt;exit pytest on collection error&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest/issues/568"&gt;markers stain on all related classes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest/issues/1657"&gt;removed deprecated command line options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest/issues/925"&gt;incorrectly dropping brackets on display of assertions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest/issues/1625"&gt;rename getfuncargvalue to getfixturevalue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest/issues/460"&gt;warning if you use getfuncargvalue with parametrized fixtures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest/issues/1553"&gt;terminal newlines in failed test output&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bitbucket.org/hpk42/tox/issues/212"&gt;escaping curly braces in a tox command doesn't work&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bitbucket.org/hpk42/tox/issues/66"&gt;Tox shouldn't call pip directly to avoid shebang limitations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest/issues/1503"&gt;missing evaluated value in report when asserting a boolean attribute&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest/pull/1621"&gt;improved determination of rootdir&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In total &lt;a href="https://github.com/pytest-dev/pytest/pulls?utf8=%E2%9C%93&amp;amp;q=is%3Apr%20is%3Amerged%20updated%3A2016-06-20..2016-06-27%20"&gt;35 pull requests were merged&lt;/a&gt; to pytest, and &lt;a href="https://bitbucket.org/hpk42/tox/pull-requests/?state=MERGED"&gt;at least 12&lt;/a&gt; to tox, not to mention many others to plugins.&lt;/p&gt;
&lt;p&gt;(It is worth noting that this is not an exhaustive list of all features that will go into pytest 3.0; a separate post will the full release notes will be made once the release is done.)&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img alt="Learning outside" class="img-rounded" src="/2016/pytest-development-sprint/images/sprint_workingoutside.jpg" /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img alt="Stickers 2.0" class="img-rounded" src="/2016/pytest-development-sprint/images/sprint_stickers.jpg" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img alt="Meeting a Black Forest local" class="img-rounded" src="/2016/pytest-development-sprint/images/sprint_horse.jpg" /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img alt="Hiking in the sunny Black Forest" class="img-rounded" src="/2016/pytest-development-sprint/images/sprint_hiking.jpg" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img alt="Sampling the local delicacies" class="img-rounded" src="/2016/pytest-development-sprint/images/sprint_cake.jpg" /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img alt="Enjoying the beergarden" class="img-rounded" src="/2016/pytest-development-sprint/images/sprint_beergarden.jpg" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;We also spent some time designing the &lt;a href="https://twitter.com/pytestdotorg/status/745528947736092672"&gt;stickers&lt;/a&gt; and &lt;a href="https://github.com/kvas-it/pytest-design/blob/master/tshirt_example.png"&gt;t-shirts&lt;/a&gt;. Surveys went out to those who backed the fundraising campaign last week and the goods will be shipped very soon.&lt;/p&gt;
&lt;p&gt;Thank you so much to everyone who supported the sprint. We have greatly improved our knowledge of pytest internals, expanded the pytest contributor community, and we're looking forward to bringing you pytest 3.0 very soon (aiming for before &lt;a href="https://ep2016.europython.eu/conference/talks/pytest-30"&gt;EuroPython&lt;/a&gt;)!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Group photo" class="img-rounded" src="/2016/pytest-development-sprint/images/sprint_group.jpg" /&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pfctdayelise</dc:creator><pubDate>Thu, 07 Jul 2016 09:00:00 +0200</pubDate><guid isPermaLink="false">tag:,2016-07-07:2016/pytest-development-sprint/</guid><category>sprint2016</category></item><item><title>Blog 1.0</title><link>/2016/welcome-to-the-official-pytest-blog/</link><description>&lt;p&gt;Welcome to the launch of the official pytest blog!&lt;/p&gt;
&lt;p&gt;Pytest has grown from strength to strength over the past few years, and it's overdue that we have an official blog for releases and other project announcements.&lt;/p&gt;
&lt;p&gt;There is now a &lt;a href="http://planet.pytest.org/"&gt;pytest planet&lt;/a&gt;, which is a blog aggregator. If you have your own blog and can tag some entries as 'pytest', we invite you to &lt;a href="https://github.com/fschulze/planet.pytest.org/blob/master/feeds.cfg"&gt;add your RSS feed there&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There is also the &lt;a href="http://hackebrot.github.io/pytest-tricks/"&gt;pytest tricks&lt;/a&gt; blog, so if you have a small demonstration of how to use a cool pytest feature, that might be the place for it. If you don't have your own blog, you can submit a guest post to either pytest-tricks or the main pytest blog.&lt;/p&gt;
&lt;p&gt;It might be obvious that we're not the most gifted web designers, so we definitely welcome improvements at &lt;a href="https://github.com/pytest-dev/blog.pytest.org"&gt;the Github repository&lt;/a&gt;. This blog was first talked about at EuroPython 2015, so 11 months later, we thought it was more important to get it out there than to perfect the theme. Thanks to Javier Gonel and Andreas Pelme for their work to get it started.&lt;/p&gt;
&lt;p&gt;In upcoming months there are lots of things happening, with wrapping up the pytest development sprint and preparing for pytest 3.0. Stay tuned!&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pfctdayelise</dc:creator><pubDate>Fri, 24 Jun 2016 12:00:00 +0200</pubDate><guid isPermaLink="false">tag:,2016-06-24:2016/welcome-to-the-official-pytest-blog/</guid><category>meta</category><category>sprint2016</category></item><item><title>We have a blog</title><link>/2015/we-have-a-blog/</link><description>&lt;p&gt;And we have a blog.&lt;/p&gt;
&lt;p&gt;This was a nice hacking day! A photo from the EuroPython 2015 sprints in Bilbao.&lt;/p&gt;
&lt;p&gt;&lt;img alt="We're legion" class="img-rounded" src="/2015/we-have-a-blog/images/legion.jpg" /&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pelme</dc:creator><pubDate>Sat, 25 Jul 2015 22:00:00 +0200</pubDate><guid isPermaLink="false">tag:,2015-07-25:2015/we-have-a-blog/</guid><category>meta</category><category>europython</category></item></channel></rss>