1. 程式人生 > >unittest最詳細的教程(文末附視訊資料)

unittest最詳細的教程(文末附視訊資料)

一、什麼是unittest

unittest是Python單元測試框架,類似於JUnit框架。

unittest中有4個重要的概念:test fixture, test case, test suite, test runner

Testcase:

一個TestCase的例項就是一個測試用例。什麼是測試用例呢?就是一個完整的測試流程,包括測試前準備環境的搭建(setUp),執行測試程式碼 (run),以及測試後環境的還原(tearDown)。元測試(unit test)的本質也就在這裡,一個測試用例是一個完整的測試單元,通過執行這個測試單元,可以對某一個問題進行驗證。

Test suite:

多個測試用例集合在一起,就是TestSuite,而且TestSuite也可以巢狀TestSuite。

Test runner:

是來執行測試用例的,其中的run(test)會執行TestSuite/TestCase中的run(result)方法。

TestLoader:

是用來載入TestCase到TestSuite中的,其中有幾個loadTestsFrom__()方法,就是從各個地方尋找TestCase,建立它們的例項,然後add到TestSuite中,再返回一個TestSuite例項。

Test fixture:

對一個測試用例環境的搭建和銷燬,是一個fixture,通過覆蓋 TestCase的setUp()和tearDown()方法來實現。這個有什麼用呢?比如說在這個測試用例中需要訪問資料庫,那麼可以在setUp() 中建立資料庫連線以及進行一些初始化,在tearDown()中清除在資料庫中產生的資料,然後關閉連線。注意tearDown的過程很重要,要為以後的 TestCase留下一個乾淨的環境。關於fixture,還有一個專門的庫函式叫做fixtures,功能更加強大。

使用unittest編寫python的單元測試程式碼,包括如下幾個步驟:

1、編寫一個python類,繼承 unittest模組中的TestCase類,這就是一個測試類

2、在上面編寫的測試類中定義測試方法(這個就是指的測試用例),每個方法的方法名要求以 test 打頭,沒有額外的引數。 在該測試方法中 呼叫被測試程式碼,校驗測試結果,TestCase類中提供了很多標準的校驗方法,如 最常見的assertEqual。

3、執行 unittest.main() ,該函式會負責執行測試,它會例項化所有TestCase的子類,並執行其中所有以test打頭的方法。

二、簡單用法

unittest是python自帶的一個單元測試框架,類似於java的junit,基本結構是類似的。基本用法如下:

1.用import unittest匯入unittest模組

2.定義一個繼承自unittest.TestCase的測試用例類,如class xxx(unittest.TestCase):

3.定義setUp和tearDown,這兩個方法與junit相同,即如果定義了則會在每個測試case執行前先執行setUp方法,執行完畢後執行tearDown方法。

4.定義測試用例,名字以test開頭,unittest會自動將test開頭的方法放入測試用例集中。

5.一個測試用例應該只測試一個方面,測試目的和測試內容應很明確。主要是呼叫assertEqual、assertRaises等斷言方法判斷程式執行結果和預期值是否相符。

6.呼叫unittest.main()啟動測試

7.如果測試未通過,則會顯示e,並給出具體的錯誤(此處為程式問題導致)。如果測試失敗則顯示為f,測試通過為.,如有多個testcase,則結果依次顯示。

三、unittest模組的常用方法

assertEqual(a, b) a == b

assertNotEqual(a, b) a != b

assertTrue(x) bool(x) is True

assertFalse(x) bool(x) is False

assertIs(a, b) a is b

assertIsNot(a, b) a is not b

assertIsNone(x) x is None

assertIsNotNone(x) x is not None

assertIn(a, b) a in b

assertNotIn(a, b) a not in b

assertIsInstance(a, b) isinstance(a, b)

assertNotIsInstance(a, b) not isinstance(a, b)

官網案例:

image

類TestSequenceFunctions繼承自unittest.TestCase,在類中定義了3個testcase。

unittest.main()呼叫Testloader載入這3個testcase到Testsuite,再用Testrunner執行testsuite,生成Testresult。

從output中可以看出,執行每個testcase之前都會先setUp()初始化,執行完畢之後tearDown()清理環境。

四、unittest主要常用函式

python的unittest模組提供了一個測試框架,只要我們寫一個繼承unittest.TestCase的類,類中用setUp做初始化,用tearDown做清理。

主要用到的函式有:

failedinfo表示不成立列印資訊failedinfo,為可選引數

self.fail([msg])會無條件的導致測試失敗,不推薦使用。

self.assertEqual(value1, value2, failedinfo) # 斷言value1 == value2

self.assertTrue(表示式, failedinfo) # 斷言value為真

self.assertFalse(表示式, failedinfo) # 斷言value為假

斷言肯定發生異常,如果沒發生異常,則為測試失敗。

引數1為異常,引數二為丟擲異常的呼叫物件,剩餘引數為傳遞給可呼叫物件的引數。

self.assertRaises(ValueError, self.widget.resize, -1, -1)

呼叫時機的加self,如self.assertEqual(self.seq, range(10)),self.assertTrue(value > 100)

五、unittest網易郵箱登入案例

1.開啟網易郵箱,寫一個簡單的登入;

2.判斷title完全等於期望結果;

image

六、參考程式碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : Ailie
# @File    : mailLogin.py
# @Software: PyCharm
import time
import unittest
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
class mailLogin(unittest.TestCase):
    def setUp(self):
        url = 'https://mail.yeah.net/'
        self.browser = webdriver.Firefox()
        self.browser.get(url)
        time.sleep(5)

    def test_login_01(self):
        '''
        使用者名稱、密碼為空
        '''
        self.browser.switch_to.frame("x-URS-iframe")
        self.browser.find_element_by_name('email').send_keys('')
        self.browser.find_element_by_name('password').send_keys('')
        self.browser.find_element_by_id('dologin').click()
        self.browser.switch_to.default_content()
        time.sleep(3)
        name = self.browser.find_element_by_id('spnUid')
        if name == '[email protected]':
            print('登入成功')
        else:
            print('登陸失敗')

    def test_login_02(self):
        '''
        使用者名稱正確、密碼為錯誤
        '''
        self.browser.switch_to.frame("x-URS-iframe")
        self.browser.find_element_by_name('email').send_keys('sanzang520')
        self.browser.find_element_by_name('password').send_keys('xxx')
        self.browser.find_element_by_id('dologin').click()
        self.browser.switch_to.default_content()
        time.sleep(3)
        name = self.browser.find_element_by_id('spnUid')
        if name == '[email protected]':
            print('登入成功')
        else:
            print('登陸失敗')

    def test_login_03(self):
        '''
        使用者名稱、密碼正確
        '''
        self.browser.switch_to.frame("x-URS-iframe")
        self.browser.find_element_by_name('email').send_keys('sanzang520')
        self.browser.find_element_by_name('password').send_keys('xxx')
        self.browser.find_element_by_id('dologin').click()
        self.browser.switch_to.default_content()
        time.sleep(3)
        name = self.browser.find_element_by_id('spnUid')
        if name == '[email protected]':
            print('登入成功')
        else:
            print('登陸失敗')

    def tearDown(self):
        self.browser.quit()

if __name__ == "__main__":
    unittest.main()

對自動化感興趣的同學,歡迎加QQ群:175317069,一起學習,相互討論。

群內已經有小夥伴將知識體系整理好(原始碼,筆記,PPT,學習視訊),歡迎加群免費領取

加QQ群:175317069,免費領取資料

分享給喜歡自動化,有夢想成為大牛的Tester們,希望能夠幫助到你們。