selenium之unitest庫
一、unitest庫
1、unitest庫的介紹:unittest原名為PyUnit,是由java的JUnit衍生而來。unittest是xUnit系列框架中的一員;
1.1、概念:
testfixture:代表了用例執行前的準備工作和用例執行之後的清理工作。比如在用例執行前建立臨時檔案和資料夾,又或者啟動1個server程序等;一個測試用例的初始化準備及環境還原,主要是setUp()和 tearDown()方法;
test case: 測試用例,一般檢查一組輸入的響應(輸出)是否符合預期。unittest模組提供了TestCase類來幫助我們建立測試用例;此時執行用例的前置條件和執行用例之後的清理工作就可以交給setUp()和tearDown()來執行;
testsuite:測試用例或測試套件的集合,一般先建立一個套件,然後把需要一起執行的用例新增到套件中,然後執行測試套件,即執行所有組合的用例;
test runner: 用來執行測試用例並輸出測試結果的元件。可以是圖形介面或命令列介面(可以簡單執行,也可以生成簡單的測試結果;或者可以下載HTMLTestRuneer檔案,生成網頁版的測試報告)
1.2、unitest的斷言
unitest中斷言主要由三種:
1.基本的布林斷言,即:要麼正確,要麼錯誤的驗證
2.比較斷言,如,比較兩個變數的值(跟布林斷言區別不大,主要通過比較兩個變數的值得出布林值)
3.複雜斷言,用的比較少,像斷言兩個列表、元組等
斷言方法 | 意味著 |
---|---|
assertEqual(a,b) | a == b |
assertNotEqual(a,b) | a!= b |
assertTrue(x) | bool(x)是True |
assertFalse(x) | bool(x)為False |
assertIs(a,b) | a是b |
assertIsNot(a,b) | a不是b |
assertIsNone(x) | x為無 |
assertIsNotNone(x) | x不是None |
assertIn(a,b) | a in b |
assertNotIn(a,b) | a不在b中 |
assertIsInstance(a,b) | isinstance(a,b) |
assertNotIsInstance(a,b) | 不是isinstance(a,b) |
assertRaises(exc,fun,args,*kwds) | fun(args,*kwds)引發ex |
assertRaisesRegexp(exc,r,fun,args,*kwds) | fun(args,*kwds)引發ex並且訊息匹配egex r |
assertAlmostEqual(a,b) | 回合(ab,7)== 0 |
assertNotAlmostEqual(a,b) | round(ab,7)!= 0 |
assertGreater(a,b) | a> b 2.7 |
assertGreaterEqual(a,b) | a> = b |
assertLess(a,b) | a <b |
assertLessEqual(a,b) | a <= b |
assertRegexpMatches(s,r) | r.search |
assertNotRegexpMatches(s,r) | 不是r.search |
assertItemsEqual(a,b) | sorted(a)== sorted(b)也支援unhashable物件 |
assertDictContainsSubset(a,b) | a裡面所有的鍵值對都在b中存在 |
2、unitest基本用法
# 匯入unitest庫 import unittest # 建立一個測試用例類,繼承與unitest.TestCase class Test_case(unittest.TestCase): def setUp(self): print('執行用例前需要完成的事情') def tearDown(self): print('執行用例後要做的事情') # 用例 def test_1(self): print('第1個測試用例') def test_2(self): print('第2個測試用例') def test_3(self): print('第3個測試用例') # 非測試用例方法 def fff(self): print('我不是測試用例') # 簡單執行測試用例 if __name__ == '__main__': unittest.main()
# 或這樣執行
# 建立一個測試套件,向其中新增測試用例
suit = unittest.TestLoader().loadTestsFromTestCase(Test_case)
# 顯式執行測試用例,並通過verbosity=2設定生成測試結果,執行套件
unittest.TextTestRunner(verbosity=2).run(suit)
關注點:
1、編寫測試用例時一般先建立一個測試用例類,繼承於unitest.TestCase,一個測試用例類下面可以有多個測試點
2、測試用例中方法名以test開頭的方法才是測試方法,如上面的test_1等,非test開頭 的不是測試方法,執行時不會執行,如上面的fff
3、setUp和tearDown這兩個方法,這兩個方法在測試方法執行前後都會被自動呼叫,主要用作預處理和清理。這兩個方法就是前面說的test fixture、
4、呼叫uniitest.main()的時候,框架自動的呼叫了Test類,因為Test繼承自unittest.TesetCase類,所以會被框架識別為測試用例
5、unitest.main()是最簡單的執行用例的方式,另外的方式是新增測試元件執行,或者生成測試結果或報告
3、編寫用例(以登入為例)
編寫用例時需要先定義一個測試用例類,在測試用例類裡的方法就是我們的測試用例,用例名稱必須要以 test 開頭,否則unitest.TestCase不會識別為測試用例,非test開頭的測試用例類裡的方法為普通方法,非 測試用例;我們需要在測試用例裡新增指令碼執行後是否成功的斷言,靠斷言判斷用例是否通過
# 匯入unitest框架 import unittest # 匯入封裝好的登入類模組 from My_case_fuxi.My_Login import Login_1 # 建立一個登入物件 lo = Login_1('Firefox') # 定義一個測試用例類(必須繼承於unitest.TestCase) class Test_my(unittest.TestCase): def setUp(self) -> None: pass def tearDown(self) -> None: pass # 輸入賬號無密碼登入 def test_1(self): lo.login('18826473908','') # 獲取元素文字內容 a = lo.text_element('id','pwd_err') # 新增斷言 self.assertEqual(a,'請輸入密碼') # 輸入密碼無賬號登入 def test_2(self): lo.login('','8888888') # 獲取元素文字內容 a = lo.text_element('id', 'username_err') # 新增斷言 self.assertEqual(a, '請輸入51Job帳號') # 賬號密碼為空 def test_3(self): lo.login('','') # 獲取元素文字內容 a = lo.text_element('id', 'username_err') b = lo.text_element('id', 'pwd_err') # 新增斷言 self.assertEqual(a, '請輸入51Job帳號') self.assertEqual(b, '請輸入密碼') if __name__ == '__main__': # unittest.main() # 建立一個測試套件,並向其中載入測試用例 suit = unittest.TestLoader().loadTestsFromTestCase(Test_my) # 顯式執行測試沒並且通過設定verbosity設定對每一個測試方法產生測試結果 unittest.TextTestRunner(verbosity=2).run(suit)
4、測試用例的執行
4.1、簡單的執行:unitest.main(),執行本.py檔案裡的所有程式碼,若有多個用例類,全部執行
如上面 3 的程式碼,執行結果只顯示運行了多少條用例,多少條通過多少條不通過(只有文字顯示和總結果,若有不通過的會報錯)
4.2、建立測試套件,顯式執行用例,並通過verbosity設定每個測試方法產生測試結果,是否OK,如圖
此方法只執行測試套件裡的用例類
4.3、生成網頁版測試報告
如下程式碼:
# 匯入unitest import unittest # 匯入我們需要測試的用例模組 from My_case_fuxi.My_login_case.My_login_case import Test_my # 匯入生成網頁版測試報告的依賴檔案HTMLTestRunner from My_case_fuxi.HTMLTestRunner.HTMLTestRunner import HTMLTestRunner # 建立一個測試套件類 class Test_suite(unittest.TestCase): # 定義一個測試套件類 def test_My_suite(self): # 建立一個測試套件 my_suite = unittest.TestSuite() # 測試用例列表 my_case = ['test_1','test_2','test_3'] # 遍歷列表,套件裡新增用例 for case in my_case: my_suite.addTest(Test_my(case)) with open('My_login_case.html','wb') as f: HTMLTestRunner( # 這裡相當於f.write寫入檔案 stream=f, # 測試報告標題 title='登入用例測試報告', # 測試報告詳情 description='登入測試用例的報告', # 生成測試報告 verbosity=2 ).run(my_suite) if __name__ == '__main__': unittest.main()
這裡是專門建立一個套件的用例類,可以把這些程式碼放到要執行的檔案下面的if __name__ == '__main__':下面去執行