我有以下測試類定義。它使用我通常不喜歡的exec。代碼自編寫測試方法的pythonic方法
class FubarTest(unittest.TestCase):
lst = [(True, True),
(False, False)]
for t in lst:
function = """def test_{}_is_{}(self):
self.assertTrue({} is {})
""".format(t[0], t[1], t[0], t[1])
exec function
當我運行它(通過py.test但這不應該的問題),我得到這個:
============================= test session starts ==============================
platform linux2 -- Python 2.7.3 -- pytest-2.3.4 -- /usr/bin/python
plugins: capturelog, cov, twisted, xdist
model/test/test_hframe5.py <- <string>:1: HFrame5Test.test_False_is_False PASSED
model/test/test_hframe5.py <- <string>:1: HFrame5Test.test_True_is_True PASSED
=========================== 2 passed in 0.49 seconds ===========================
使得測試自動創建和有理智的名稱,以便如果事情失敗了,你知道通過方法的名稱失敗了。
顯然這是一個簡單的例子,我想要做什麼。我有很多測試,看起來像「做X,檢查Y是真的,Z是假的」,這可以很容易地用上面的方法編碼。我可以寫出三十種複製粘貼的方法,但這只是感覺不對 - 打破DRY。
是否有更符合pythonic的方式來編寫此代碼?
有趣的是,這是基於[py.test的參數測試](http://pytest.org/latest/example/parametrize.html),因爲我已經使用了py.test,所以它很適合我。 – Sardathrion
好啊,我也會給出一個最好的例子。我認爲這是一個很棒的測試框架。 – ecatmur