天天看點

使用unittest做類似print這樣無return傳回值的函數的單元測試

在看Python裡自帶的一個單元測試庫unittest,有個有意思的應用是可以對類似于print()這樣無return傳回值的函數做驗證。見下面代碼。

#!/usr/bin/env python3

from unittest import TestCase
from unittest.mock import patch
from unittest import main

class Person(object):
    def __init__(self, name):
        self.name = name

    def print_name(self):
        print('My name is ' + self.name)

class FuncTest(TestCase):
    def test_print_name01(self):
        john = Person('John')

        with patch('builtins.print') as mocked_print:
            john.print_name()
            mocked_print.assert_called_with('My name is John')

    def test_print_name02(self):
        john = Person('Donald')

        with patch('builtins.print') as mocked_print:
            john.print_name()
            mocked_print.assert_called_with('My name is Donald')

if __name__ == '__main__':
    main()
           

執行結果

reedx:garrulous_py_practice reed$ python3 py_unittest_01.py

..

Ran 2 tests in 0.001s

OK

其中的

with patch('builtins.print') as mocked_print:

語句是在with的block裡,将内置函數print替換為mocked_print函數,再去block裡執行print,實際也就是在執行mocked_print函數,然後去檢查mocked_print函數是否收到同樣的傳入參數,也即檢查了print語句的輸出(print語句自然是傳入什麼樣的字元串,就輸出列印出什麼樣的字元串)。

顯而易見,這就是去驗證目标函數或者方法的傳入參數,單元測試裡可以應用的範圍很廣。