[英]Is there a way to automatically create test cases in Python's unittest framework?
假設我們想為(當前)僅實現兩個例程sqrt
和ln
的(簡單)數學庫編寫測試用例。 除其他外,如果兩個例程的輸入為負,則預計兩個例程都會引發ValueError
。 因此,測試用例將如下所示:
import unittest
from my_math_lib import sqrt, ln
class TestSqrt(unittest.TestCase):
def test_negatives(self):
self.assertRaises(ValueError, sqrt, -5)
# ... any many other cases
class TestLn(unittest.TestCase):
def test_negatives(self):
self.assertRaises(ValueError, ln, -5)
# ... any many other cases
顯然,除了正在測試的 function 之外,兩個測試用例TestSqrt.test_negatives
和TestLn.test_negatives
是相同的,並且重復完全相同的代碼是一個壞主意。
有沒有自動生成這樣的測試用例? 例如,在 C/C++ 中,可以實現一個宏,該宏使用適當的 function 名稱定義測試代碼。 Python中是否有類似的解決方案?
有可能按照@jonrsharpe 的建議進行子類化,盡管有一個警告。 你不能從unittest.TestCase
派生你的基礎 class 並在那里寫一個testXXX
,因為它也會被找到並執行,並且會失敗。 你需要一個混合:
class BaseTest:
def setUp(self):
self.tested = None
def test_negatives(self):
self.assertRaises(ValueError, self.tested, -5)
class TestSqrt(unittest.TestCase, BaseTest):
def setUp(self):
self.tested = sqrt
class TestLn(unittest.TestCase, BaseTest):
def setUp(self):
self.tested = log
這可行,但不是很好,因為基礎 class 從TestCase
( assertRaises
) 調用了一個並非派生自它的方法,因此每個 linter 或 IDE 檢查都會警告您這一點。
要解決這個問題,您可以只使用其中一個實際實現作為基礎 class:
class TestSqrt(unittest.TestCase):
def setUp(self):
self.tested = sqrt
def test_negatives(self):
self.assertRaises(ValueError, self.tested, -5)
class TestLn(TestSqrt):
def setUp(self):
self.tested = log
class TestSomethingElse(TestSqrt):
def setUp(self):
self.tested = something_else
如果您可以使用 pytest,我將使用夾具參數化:
import pytest
@pytest.fixture(params=[sqrt, log])
def tested_function(request):
return request.param
def test_negatives(tested_function):
with pytest.raises(ValueError):
tested_function(-5)
def test_something_else(tested_function):
...
當然,您也可以將其放入 class 中。
警告:這不適用於unittest
,或者至少我不知道一種干凈的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.