Python之Unittest記錄
介紹
Unittest是什麼?是Python的一款單元測試框架,就是可以對程式設計師寫的程式碼(類、方法、函式等)進行測試。
官方文件:請點選這裡 本文基於該官方文件編寫,如有錯誤,歡迎指出!
直接上程式碼,檔名:Login.py
import unittest
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
class Login(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('setUpClass執行')
ser = Service('../chromedriver.exe')
cls.driver = webdriver.Chrome(service=ser)
def setUp(self):
print('setup執行')
self.driver.get('https://passport.winxuan.com/signin')
def test_login_success(self):
self.driver.find_element(By.CLASS_NAME, 'logo_bg').click()
pass
@unittest.skip("showing class skipping")
def test_login_error_password(self):
pass
def tearDown(self):
print('tearDown執行')
@classmethod
def tearDownClass(cls):
print('tearDownClass執行')
def suite():
suite = unittest.TestSuite()
suite.addTest(Login( 'test_login_success'))
suite.addTest(Login('test_login_error_password'))
return suite
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(suite())
View Code
執行順序:
setUpClass->
setUp->test_login_success->tearDown->
setUp->test_login_error_password->tearDown->
tearDownClass
注意:
(1)setUpClass和tearDownClass必須加註解@classmethod,表示是一個類的方法,它們在整個過程僅各執行一次,因此可以用來寫初始化的程式碼;
(2)unittest約定,測試用例必須以test開頭;
(3)setUp和tearDown在每個測試用例執行前後都會執行,因此可以用來寫為用例初始化環境和清理環境的程式碼;
執行
1、可以執行這個Python檔案,則是執行main中的程式碼;
另一種簡便寫法:
if __name__ == '__main__':
unittest.main()
2、在Pycharm中可以直接Login這個類,因為它是繼承了unittest;
3、在命令列,python -m unittest Login 或 python -m unittest Login.py 都是可以的,意思和上述一樣;
其他的命令選項:
- -h 可以檢視所有的命令列選項;python -m unittest -h
- -v, --verbose Verbose output 詳細的輸出 例如 python -m unittest -v test_module
- -q, --quiet Quiet output 簡潔的輸出
- -f, --failfast Stop on first fail or error遇到第一個失敗或錯誤則停止
- -k Only run tests which match the given substring 執行與給定子字串匹配的測試;python -m unittest -k password Login 則只執行test_login_error_password,不執行test_login_success。
斷言
Unittest的TestCase基類提供的assert*()方法。如果測試失敗,異常將被丟擲,並帶有解釋資訊,unittest將識別測試用例為失敗。任何其他異常將被視為錯誤。
.
更多的方法移步官方文件;
子測試subTest
當測試用例之間有非常小的差異時,例如一些引數,unittest可以使用subTest()上下文管理器在測試方法體中區分它們。
class NumbersTest(unittest.TestCase):
def test_even(self):
"""Test that numbers between 0 and 5 are all even."""
for i in range(0, 6):
with self.subTest(i=i):
self.assertEqual(i % 2, 0)
View Code
測試套件
測試套件可以用於指定執行哪些用例,比直接執行的方法更靈活一些。程式碼在介紹中。
註解
@unittest.skip(reason) 無條件跳過該測試用例,reason為原因;
@unittest.skipIf(condition, reason)若condition為真,則跳過該測試用例;
Skip the decorated test if condition is true.
@unittest.skipUnless(condition, reason)跳過該用例除非condition為真,意思是condition為真則執行該用例。(這裡有點繞)
@unittest.expectedFailure 這個用例希望它失敗。如果它本身成功了,則被視為失敗;
跳過的測試case將不會執行setUp()和tearDown()。被跳過的類將不會執行setUpClass()和tearDownClass()