之前,我曾轉過一個單元測試框架系列的文章,里面介紹了 unittest、nose/nose2 與 pytest 這三個最受人歡迎的 Python 測試框架。
本文想針對測試中一種很常見的測試場景,即參數化測試,繼續聊聊關于測試的話題,并嘗試將這幾個測試框架串聯起來,做一個橫向的比對,加深理解。
1、什么是參數化測試?
對于普通測試來說,一個測試方法只需要運行一遍,而參數化測試對于一個測試方法,可能需要傳入一系列參數,然后進行多次測試。
比如,我們要測試某個系統的登錄功能,就可能要分別傳入不同的用戶名與密碼,進行測試:使用包含非法字符的用戶名、使用未注冊的用戶名、使用超長的用戶名、使用錯誤的密碼、使用合理的數據等等。
參數化測試是一種“數據驅動測試”(Data-Driven Test),在同一個方法上測試不同的參數,以覆蓋所有可能的預期分支的結果。它的測試數據可以與測試行為分離,被放入文件、數據庫或者外部介質中,再由測試程序讀取。
2、參數化測試的實現思路?
通常而言,一個測試方法就是一個最小的測試單元,其功能應該盡量地原子化和單一化。
先來看看兩種實現參數化測試的思路:一種是寫一個測試方法,在其內部對所有測試參數進行遍歷;另一種是在測試方法之外寫遍歷參數的邏輯,然后依次調用該測試方法。
這兩種思路都能達到測試目的,在簡單業務中,沒有毛病。然而,實際上它們都只有一個測試單元,在統計測試用例數情況,或者生成測試報告的時候,并不樂觀。可擴展性也是個問題。
那么,現有的測試框架是如何解決這個問題的呢?
它們都借助了裝飾器,主要的思路是:利用原測試方法(例如 test()),來生成多個新的測試方法(例如 test1()、test2()……),并將參數依次賦值給它們。
由于測試框架們通常把一個測試單元統計為一個“test”,所以這種“由一生多”的思路相比前面的兩種思路,在統計測試結果時,就具有很大的優勢。
3、參數化測試的使用方法?
Python 標準庫中的unittest 自身不支持參數化測試,為了解決這個問題,有人專門開發了兩個庫:一個是ddt ,一個是parameterized 。
ddt 正好是“Data-Driven Tests”(數據驅動測試)的縮寫。典型用法:
import unittestfrom ddt import ddt,data,unpack@ddtclass MyTest(unittest.TestCase): @data((3, 1), (-1, 0), (1.2, 1.0)) @unpack def test_values(self, first, second): self.assertTrue(first > second)unittest.main(verbosity=2)
運行的結果如下:
test_values_1__3__1_ (__main__.MyTest) ... ok
test_values_2___1__0_ (__main__.MyTest) ... FAIL
test_values_3__1_2__1_0_ (__main__.MyTest) ... ok==================================================
FAIL: test_values_2___1__0_ (__main__.MyTest)
--------------------------------------------------
Traceback (most recent call last):
File "C:/Python36/lib/site-packages/ddt.py", line 145, in wrapper
return func(self, *args, **kwargs)
File "C:/Users/pythoncat/PycharmProjects/study/testparam.py", line 9, in test_values
self.assertTrue(first > second)
AssertionError: False is not true----------------------------------------------
Ran 3 tests in 0.001sFAILED (failures=1)
新聞熱點
疑難解答