測試目錄
項目的整體結構可以參考“軟件目錄開發規范”,這里單說測試目錄。一般都是在項目里單獨創建一個測試目錄,目錄名就是“tests”。
關于目錄的位置,一種建議是,在項目名(假設項目名是Foo)的一級子目錄下創建二級子目錄 “Foo/foo/tests” 。但是這樣可能是因為用起來不方便,有很多是按下面的做法。不過下面的示例我還是用這個方法來創建測試目錄。
還可以把測試目錄向上移一層,作為一級子目錄,直接創建在項目之下 “Foo/tests”。參考django、scrapy、flask都是這樣的做法。
測試函數
標題的意思是對函數(def)進行測試,相對于測試類(class)。
學習測試,得有要測試的代碼。下面是一個簡單的函數,接收城市名和國家名,返回一個格式為“City, Country“這樣的字符串:
# UnitTest/unit_test/utils/city_functions.pydef get_city_info(city, country): city_info = "%s, %s" % (city, country) return city_info.title()
接下來就對上面的這個函數進行測試。
手動測試
現在來寫一個使用這個函數的程序:
# UnitTest/unit_test/test/cities.pytry: from unit_test.utils.city_functions import get_city_infoexcept ModuleNotFoundError: import sys sys.path.append('../..') from unit_test.utils.city_functions import get_city_infoprint("Enter 'q' at any time to quit.")while True: city = input("city name: ") if city == 'q': break country = input("country name: ") if country == 'q': break fullname = get_city_info(city, country) print("/tcity info:", fullname)
然后運行的結果:
Enter 'q' at any time to quit.
city name: shanghai
country name: china
city info: Shanghai, China
city name: qProcess finished with exit code 0
上面這樣是手動測試,還是得有一種自動測試函數輸出的高效方式。如果能夠對get_fullname()進行自動測試,就能始終確信,給這個函數提供測試過的姓名后,它能返回正確的結果。尤其是在對函數進行修改的前后。
模塊導入路徑的問題
PyCharm會自動把項目目錄加到環境變量里去,在PyCharm里執行都沒問題。但是如果不用PyCharm而是單獨運行,這個目錄結構應該會有點問題,會找不到需要測試的函數。簡單點就是把測試用例和被測試的函數放到同一個目錄里,然后改一下 from import 就可以正常運行了?;蛘咦约菏謩犹砑迎h境變量,就像例子里那樣。
單元測試-unittest
Python標準庫中的模塊unittest提供了代碼測試工具。
創建測試用例
為函數編寫測試用例,可先導入模塊unittest以及要測試的函數,再創建一個繼承unittest.TestCase的類,并編寫一系列方法對函數行為的不同方面進行測試。
新聞熱點
疑難解答