簡體   English   中英

有沒有辦法在 Python 的 unittest 框架中自動創建測試用例?

[英]Is there a way to automatically create test cases in Python's unittest framework?

假設我們想為(當前)僅實現兩個例程sqrtln的(簡單)數學庫編寫測試用例。 除其他外,如果兩個例程的輸入為負,則預計兩個例程都會引發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_negativesTestLn.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM