1. 程式人生 > 實用技巧 >selenium之unitest庫

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__':下面去執行