fix: mark.* objects are now immutable as long as they are not an attribute on a function, enables usage like this::
xfail = pytest.mark.xfail
    @xfail
    def test_func1():
        pass
    @xfail(reason="123")
    def test_func2():
        pass
where previously test_func1 and test_func2 would wrongly share the same reason
because the xfail object was modified in place.
			
			
This commit is contained in:
		
							parent
							
								
									9a21a81740
								
							
						
					
					
						commit
						bd5a9ba392
					
				|  | @ -38,7 +38,7 @@ Changes between 1.3.4 and 2.0.0dev0 | |||
| - fix bug: unittest collected functions now also can have "pytestmark" | ||||
|   applied at class/module level | ||||
| - add ability to use "class" level for cached_setup helper | ||||
| 
 | ||||
| - fix strangeness: mark.* objects are now immutable, create new instances | ||||
| 
 | ||||
| Changes between 1.3.3 and 1.3.4 | ||||
| ---------------------------------------------- | ||||
|  |  | |||
|  | @ -101,10 +101,10 @@ class MarkDecorator: | |||
|         def test_function(): | ||||
|             pass | ||||
|     """ | ||||
|     def __init__(self, name): | ||||
|     def __init__(self, name, args=None, kwargs=None): | ||||
|         self.markname = name | ||||
|         self.kwargs = {} | ||||
|         self.args = [] | ||||
|         self.args = args or () | ||||
|         self.kwargs = kwargs or {} | ||||
| 
 | ||||
|     def __repr__(self): | ||||
|         d = self.__dict__.copy() | ||||
|  | @ -134,12 +134,12 @@ class MarkDecorator: | |||
|                         setattr(func, self.markname, holder) | ||||
|                     else: | ||||
|                         holder.kwargs.update(self.kwargs) | ||||
|                         holder.args.extend(self.args) | ||||
|                         holder.args += self.args | ||||
|                 return func | ||||
|             else: | ||||
|                 self.args.extend(args) | ||||
|         self.kwargs.update(kwargs) | ||||
|         return self | ||||
|         kw = self.kwargs.copy() | ||||
|         kw.update(kwargs) | ||||
|         args = self.args + args | ||||
|         return self.__class__(self.markname, args=args, kwargs=kw) | ||||
| 
 | ||||
| class MarkInfo: | ||||
|     """ Marking object created by :class:`MarkDecorator` instances. """ | ||||
|  |  | |||
|  | @ -48,6 +48,21 @@ class TestMark: | |||
|         assert f.world.args[0] == "hello" | ||||
|         mark.world("world")(f) | ||||
| 
 | ||||
|     def test_pytest_mark_reuse(self): | ||||
|         mark = Mark() | ||||
|         def f(): | ||||
|             pass | ||||
|         w = mark.some | ||||
|         w("hello", reason="123")(f) | ||||
|         assert f.some.args[0] == "hello" | ||||
|         assert f.some.kwargs['reason'] == "123" | ||||
|         def g(): | ||||
|             pass | ||||
|         w("world", reason2="456")(g) | ||||
|         assert g.some.args[0] == "world" | ||||
|         assert 'reason' not in g.some.kwargs | ||||
|         assert g.some.kwargs['reason2'] == "456" | ||||
| 
 | ||||
| class TestFunctional: | ||||
|     def test_mark_per_function(self, testdir): | ||||
|         p = testdir.makepyfile(""" | ||||
|  | @ -136,7 +151,7 @@ class TestFunctional: | |||
|         item, = items | ||||
|         keywords = item.keywords | ||||
|         marker = keywords['hello'] | ||||
|         assert marker.args == ["pos0", "pos1"] | ||||
|         assert marker.args == ("pos0", "pos1") | ||||
|         assert marker.kwargs == {'x': 3, 'y': 2, 'z': 4} | ||||
| 
 | ||||
|     def test_mark_other(self, testdir): | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue