<div dir="ltr"><div class="gmail_extra"><div>I thought for a while that this was what <font face="monospace, monospace">monkeypatch.setattr</font> was intended for, but its effects to not seem to persist between test-functions:</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace">import pytest</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace"># test_pytest_class_attributes_monkeypatch.py</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">&quot;&quot;&quot;Test the setting of class attributes with monkeypatch.&quot;&quot;&quot;</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">class TestExample():<br></font><font face="monospace, monospace">    def setup(self):<br></font><font face="monospace, monospace">        self.attribute = 1</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">    def test_changing_attr(self, monkeypatch):<br></font><font face="monospace, monospace">        &quot;&quot;&quot;Change attribute on object.&quot;&quot;&quot;<br></font><font face="monospace, monospace">        monkeypatch.setattr(self, &#39;attribute&#39;, 2)<br></font><font face="monospace, monospace">        assert self.attribute == 2</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">    def test_attr_is_changed(self):<br></font><font face="monospace, monospace">        &quot;&quot;&quot;Assume attribute is changed.&quot;&quot;&quot;<br></font><font face="monospace, monospace">        assert self.attribute == 2</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">    def test_attr_is_unchanged(self):<br></font><font face="monospace, monospace">        &quot;&quot;&quot;Assume attribute is unchanged.&quot;&quot;&quot;<br></font><font face="monospace, monospace">        assert self.attribute == 1</font></blockquote><div><br></div><div>Output:</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace">$ py.test test_pytest_class_attributes_monkeypatch.py -v<br></font><font face="monospace, monospace">============================= test session starts ==============================<br></font><font face="monospace, monospace">platform darwin -- Python 3.4.1 -- py-1.4.25 -- pytest-2.6.3 -- /Users/dpb/py34/bin/python3.4<br></font><font face="monospace, monospace">collected 3 items</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">test_pytest_class_attributes_monkeypatch.py::TestExample::test_changing_attr PASSED<br></font><font face="monospace, monospace">test_pytest_class_attributes_monkeypatch.py::TestExample::test_attr_is_changed <font color="#ff0000">FAILED</font><br></font><font face="monospace, monospace">test_pytest_class_attributes_monkeypatch.py::TestExample::test_attr_is_unchanged PASSED</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">=================================== FAILURES ===================================<br></font><font face="monospace, monospace">_______________________ TestExample.test_attr_is_changed _______________________</font><font face="monospace, monospace"><br></font><font face="monospace, monospace">self = &lt;test_pytest_class_attributes_monkeypatch.TestExample object at 0x10846acc0&gt;</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">    def test_attr_is_changed(self):<br></font><font face="monospace, monospace">        &quot;&quot;&quot;Assume attribute is changed.&quot;&quot;&quot;<br></font><font face="monospace, monospace">&gt;       assert self.attribute == 2<br></font><font color="#ff0000"><font face="monospace, monospace">E       assert 1 == 2<br></font><font face="monospace, monospace">E        +  where 1 = &lt;test_pytest_class_attributes_monkeypatch.TestExample object at 0x10846acc0&gt;.attribute</font></font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font color="#ff0000"><font face="monospace, monospace"><br></font></font><font face="monospace, monospace">test_pytest_class_attributes_monkeypatch.py:18: AssertionError<br></font><font face="monospace, monospace" color="#ff0000">====================== 1 failed, 2 passed in 0.02 seconds ======================<br></font><font face="monospace, monospace">$ </font></blockquote><div><br></div><div>- dpb</div><div><br></div><div class="gmail_quote">On Sun, Mar 29, 2015 at 4:59 AM, dpb dpb <span dir="ltr">&lt;<a href="mailto:dpb.mediamath@gmail.com" target="_blank">dpb.mediamath@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">Sorry, I hit send too soon. Though it&#39;s not essential to the question, the second program should read:<div><br></div><div><span class=""><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">#<font face="monospace, monospace"> display_class_attributes.py</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">&quot;&quot;&quot;Test the setting of class attributes.&quot;&quot;&quot;</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">class TestExample():<br></font><font face="monospace, monospace">    def __init__(self):<br></font><font face="monospace, monospace">        self.attribute = 1</font> </blockquote></span><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class=""><font face="monospace, monospace"><br></font><font face="monospace, monospace">    def test_changing_attr(self):<br></font><font face="monospace, monospace">        &quot;&quot;&quot;Change attribute on object.&quot;&quot;&quot;<br></font><font face="monospace, monospace">        self.attribute = 2<br></font></span><font face="monospace, monospace">        print(&#39;self.attribute == 2:&#39;, self.attribute == 2)</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class=""><font face="monospace, monospace"><br></font><font face="monospace, monospace">    def test_attr_is_changed(self):<br></font><font face="monospace, monospace">        &quot;&quot;&quot;Assume attribute is changed.&quot;&quot;&quot;<br></font></span><font face="monospace, monospace">        print(&#39;self.attribute == 2:&#39;, self.attribute == 2)</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class=""><font face="monospace, monospace"><br></font><font face="monospace, monospace">    def test_attr_is_unchanged(self):<br></font><font face="monospace, monospace">        &quot;&quot;&quot;Assume attribute is unchanged.&quot;&quot;&quot;<br></font></span><font face="monospace, monospace">        print(&#39;self.attribute == 1:&#39;, self.attribute == 1)</font> </blockquote><span class=""><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">t = TestExample()<br></font><font face="monospace, monospace">t.test_changing_attr()<br></font><font face="monospace, monospace">t.test_attr_is_changed()<br></font><font face="monospace, monospace">t.test_attr_is_unchanged()</font></blockquote></span></div><span class=""><div><br></div><div><div>Output:</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace">$ python display_class_attributes.py<br></font><font face="monospace, monospace">self.attribute == 2: True<br></font><font face="monospace, monospace">self.attribute == 2: True<br></font><font face="monospace, monospace">self.attribute == 1: False<br></font><font face="monospace, monospace">$</font></blockquote></div><div><br></div></span><span class=""><font color="#888888"><div>- dpb</div></font></span></div><div class=""><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Mar 29, 2015 at 4:57 AM, dpb dpb <span dir="ltr">&lt;<a href="mailto:dpb.mediamath@gmail.com" target="_blank">dpb.mediamath@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div><font face="arial, helvetica, sans-serif">Something I do not see addressed explicitly in the Pytest docs is this behavior: Unlike normal class writing in Python 3, changing the value of a class attribute in one function does not leave it changed in test functions that are called subsequently: </font></div><div><font face="monospace, monospace"><br></font></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"># test_pytest_class_attributes.py</font><font face="monospace, monospace"><br></font><font face="monospace, monospace">&quot;&quot;&quot;Test the setting of class attributes.&quot;&quot;&quot;</font><font face="monospace, monospace"><br></font><font face="monospace, monospace">class TestExample():<br></font><font face="monospace, monospace">    def setup(self):<br></font><font face="monospace, monospace">        self.attribute = 1</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">    def test_changing_attr(self):<br></font><font face="monospace, monospace">        &quot;&quot;&quot;Change attribute on object.&quot;&quot;&quot;<br></font><font face="monospace, monospace">        self.attribute = 2<br></font><font face="monospace, monospace">        assert self.attribute == 2</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">    def test_attr_is_changed(self):<br></font><font face="monospace, monospace">        &quot;&quot;&quot;Assume attribute is changed.&quot;&quot;&quot;<br></font><font face="monospace, monospace">        assert self.attribute == 2</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">    def test_attr_is_unchanged(self):<br></font><font face="monospace, monospace">        &quot;&quot;&quot;</font><span style="font-family:monospace,monospace">Assume</span><font face="monospace, monospace"> attribute is unchanged.&quot;&quot;&quot;<br></font><font face="monospace, monospace">        assert self.attribute == 1</font></blockquote><div><font face="monospace, monospace"><br></font></div><div><font face="arial, helvetica, sans-serif">Output:</font></div><div><font face="monospace, monospace"><br></font></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace">$ py.test test_pytest_class_attributes.py -v<br></font><font face="monospace, monospace">============================= test session starts ==============================<br></font><font face="monospace, monospace">platform darwin -- Python 3.4.1 -- py-1.4.25 -- pytest-2.6.3 -- /Users/dpb/py34/bin/python3.4<br></font><font face="monospace, monospace">collected 3 items </font><font face="monospace, monospace"><br></font><font face="monospace, monospace">test_pytest_class_attributes.py::TestExample::test_changing_attr PASSED<br></font><font face="monospace, monospace">test_pytest_class_attributes.py::TestExample::test_attr_is_changed <font color="#ff0000">FAILED</font><br></font><font face="monospace, monospace">test_pytest_class_attributes.py::TestExample::test_attr_is_unchanged PASSED</font><font face="monospace, monospace"><br></font><font face="monospace, monospace">=================================== FAILURES ===================================<br></font><font face="monospace, monospace">_______________________ TestExample.test_attr_is_changed _______________________</font><font face="monospace, monospace"><br></font><font face="monospace, monospace">self = &lt;test_pytest_class_attributes.TestExample object at 0x10dd98ef0&gt;</font><font face="monospace, monospace"><br></font><font face="monospace, monospace">    def test_attr_is_changed(self):<br></font><font face="monospace, monospace">        &quot;&quot;&quot;Test whether attribute is changed.&quot;&quot;&quot;<br></font><font face="monospace, monospace">&gt;       assert self.attribute == 2<br></font><font color="#ff0000"><font face="monospace, monospace">E       assert 1 == 2<br></font><font face="monospace, monospace">E        +  where 1 = &lt;test_pytest_class_attributes.TestExample object at 0x10dd98ef0&gt;.attribute</font></font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace" color="#000000">test_pytest_class_attributes.py:14: AssertionError<br></font><font face="monospace, monospace" color="#ff0000">====================== 1 failed, 2 passed in 0.02 seconds ======================<br></font><font face="monospace, monospace">$</font></blockquote><div><font face="monospace, monospace"><br></font></div><div><font face="arial, helvetica, sans-serif">Is there special syntax or some special structure to make class attributes behave In Pytest as they do in an ordinary Python class? Example:</font></div><div><font face="monospace, monospace"><br></font></div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"># display_class_attributes.py</font><font face="monospace, monospace"><br></font><font face="monospace, monospace">&quot;&quot;&quot;Test the setting of class attributes.&quot;&quot;&quot;</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">class TestExample():<br></font><font face="monospace, monospace">    def __init__(self):<br></font><font face="monospace, monospace">        self.attribute = 1</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">    def test_changing_attr(self):<br></font><font face="monospace, monospace">        &quot;&quot;&quot;Change attribute on object.&quot;&quot;&quot;<br></font><font face="monospace, monospace">        self.attribute = 2<br></font><font face="monospace, monospace">        assert self.attribute == 2<br></font><font face="monospace, monospace">        print(&#39;Finished test_changing_attr.\n&#39;)</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">    def test_attr_is_changed(self):<br></font><font face="monospace, monospace">        &quot;&quot;&quot;Test whether attribute is changed.&quot;&quot;&quot;<br></font><font face="monospace, monospace">        assert self.attribute == 2<br></font><font face="monospace, monospace">        print(&#39;Finished test_attr_is_changed.\n&#39;)</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">    def test_attr_is_unchanged(self):<br></font><font face="monospace, monospace">        &quot;&quot;&quot;Test whether attribute is unchanged.&quot;&quot;&quot;<br></font><font face="monospace, monospace">        assert self.attribute == 1<br></font><font face="monospace, monospace">        print(&#39;Finiahed test_attr_is_unchanged.\n&#39;)</font> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="monospace, monospace"><br></font><font face="monospace, monospace">t = TestExample()<br></font><font face="monospace, monospace">t.test_changing_attr()<br></font><font face="monospace, monospace">t.test_attr_is_changed()<br></font><font face="monospace, monospace">t.test_attr_is_unchanged()</font></blockquote><div><font face="monospace, monospace"><br></font></div><div><font face="arial, helvetica, sans-serif">Output:</font></div><div><font face="monospace, monospace"><br></font></div>&gt; $ python display_class_attributes.py<br>&gt;<br>&gt; self.attribute == 2: True <br>&gt;<br>&gt; self.attribute == 2: True<br>&gt;<br>&gt; self.attribute == 1: False<br>&gt;<br>&gt; $<div><br></div><div>Thanks. </div></div><span><font color="#888888"><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">- dpb</font></div></font></span></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div></div>