1. 程式人生 > 其它 >Python之Unittest記錄

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()