2017-08-29 81 views
1

我有一些測試用例依賴於同一變量foo爲單位不變的變量測試

from unittest import TestCase 

# actually FOO is imported because it is quite big 
FOO = {'key_a': 'aaa', 'key_b': 'bbb'} 

class TestFoo(TestCase): 
    def setUp(self): 
     self.foo = FOO 

    def test_a(self): 
     self.foo['key_a'] = 'ccc' 
     self.assertEqual(self.foo['key_a'], 'ccc') 

    def test_b(self): 
     self.assertEqual(self.foo['key_a'], 'aaa') 

我的問題是,一旦我在test_a值更改爲

 self.foo['key_a'] = 'ccc' 

值對於所有後續測試,「保持」這種方式。在test_b斷言失敗的原因爲self.foo['key_a']值保持在'ccc'

我怎麼有寫測試用例所以self.foo是在所有測試{'key_a': 'aaa', 'key_b': 'bbb'}

+1

我不認爲你的例子演示了你的問題。 'self.foo'在'setUp'方法設置的每次測試之前,所以在'test_a'變化應該不會影響'test_b'。 – Alasdair

+1

測試用例(方法)不是砂箱。 'setUp'中設置的變量是共享的。 – Siegmeyer

+1

@Siegmeyer我沒有說的方法是沙盒,我說,設置方法每個測試之前運行。更改'self.foo'在'test_a'不會對'test_b'任何影響,因爲安裝方法將前'test_b'運行運行,並設置'self.foo'一次。嘗試運行示例 - 兩個測試都通過。 – Alasdair

回答

2

當您在setUp方法中設置self.foo = FOO方法時,您不復制字典,您只是將其分配給self.foo。當您設置self.foo['a'],這是改變原來的字典FOO,所以它影響其他測試。

你可以通過複製在setUp方法字典避免這個問題。

class TestFoo(TestCase): 
    def setUp(self): 
     self.foo = FOO.copy() 

如果字典包含其他可變值,那麼你可能需要使用deepcopy

import copy 

class TestFoo(TestCase): 
    def setUp(self): 
     self.foo = copy.deepcopy(FOO) 
+0

謝謝!也用於'self.foo = copy.deepcopy(FOO)'提示!那就是訣竅! – udo