2014-08-27 18 views
1

我使用Python 3.4.1和unittest模塊來驗證另一個軟件。Python 3 unittest:可以追加新的test_ *方法嗎?

另一部分軟件需要運行,其輸出必須由python腳本進行解析以進行驗證。輸出文件是包含未知數量元素的XML文件。

現在,我一直在使用subTest()爲每個XML元素生成一個子測試。這不完全是我想要的。

我想爲XML文件中的每個元素創建一個test_ *方法。問題是我不知道會有多少元素,所以我需要一種自動將新的test_ *方法添加到unittest的方法。我雖然有一個setUpClass()方法,它會調用外部軟件來生成XML並構建要運行的test *方法的更新列表。

但是我覺得方法添加到方法的單元測試的名單執行之前任何運行,所以,一旦我得到的地方,我添加新的方法(使用setattr()從內setUpClass()爲例)來看,列表已經建立,新的方法從來沒有運行...

是否有可能動態更改要在unittest中運行的方法列表?

謝謝!

+0

您可以用'py.test'做到這一點。但是,究竟是什麼讓'subTest'成爲問題呢?它似乎是做你想做的? – 2014-08-27 21:02:25

+0

'subTest'接近,但不完全;每個元素實際上是軟件的單元測試結果。我想匹配兩邊的測試,沒有一堆測試從軟件匹配到python中的單個測試... – 2014-08-27 21:04:34

回答

1

這裏是什麼,我想出了一個變化:

import unittest 

class MyClass: 
    def setup(self): 
     # run external software 
    def parse_xml(self): 
     # parse the xml file 
    def generator(self, test_class, a, b): 
     def test(self): 
      self.assertEqual(a, b) 
     return test 

    def add_test_methods(self, test_class): 
     for i in range(len(self.all_status)): 
      test = self.generator(test_class, self.all_status[i], STATUS_SUCCESS) 
      setattr(test_class, "test_uid_%d" % i, test) 


class TestIO(unittest.TestCase): 
    pass 

mb = MyClass() 
mb.setup() 
mb.parse_xml() 
mb.add_test_methods(TestIO) 

if __name__ == '__main__': 
    unittest.main() 

訣竅是不要生成和解析XML文件中的任何類外,所得的方法添加到使用setatt()類。這種方法的問題在於,它運行我希望不能做的測試套件之外的代碼。因此,一個失敗會打破整個套件(因爲unittest將無法​​捕捉到錯誤...)

也許我可以將XML生成移動到它自己的測試類?

有什麼更好的建議?

0

我想出了這個。嘗試了@big_gie提交的代碼。這樣,setUp和tearDown也將按照單元測試規則運行。

import unittest

def generator(test_class, a, b): def test(self): self.assertEqual(a, b) return test

def add_test_methods(test_class): test_list = [[2,3, 'one'], [5,5, 'two'], [0,0, 'three']] for case in test_list: test = generator(test_class, case[0], case[1]) setattr(test_class, "test_%s" % case[2], test)

class TestIO(unittest.TestCase): def setUp(self): print 'Setup' pass

def tearDown(self): print 'TearDown' pass

add_test_methods(TestIO)

if __name__ == '__main__': unittest.main(verbosity=1)

結果:

>>> 
Setup 
FTearDown 
Setup 
TearDown 
.Setup 
TearDown 
. 
====================================================================== 
FAIL: test_one (__main__.TestIO) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "D:/inchowar/Desktop/PyTrash/test_auto_3.py", line 5, in test 
    self.assertEqual(a, b) 
AssertionError: 2 != 3 

---------------------------------------------------------------------- 
Ran 3 tests in 0.019s 

FAILED (failures=1)