unittest最詳細的解說

轉自:http://www.imooc.com/article/257230java

1、什麼是unittestpython

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

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

Testcase:框架

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

Test suite:單元測試

多個測試用例集合在一塊兒,就是TestSuite,並且TestSuite也能夠嵌套TestSuite。測試

Test runner:ui

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

TestLoader:

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

Test fixture:

對一個測試用例環境的搭建和銷燬,是一個fixture,經過覆蓋 TestCase的setUp()和tearDown()方法來實現。這個有什麼用呢?好比說在這個測試用例中須要訪問數據庫,那麼能夠在setUp() 中創建數據庫鏈接以及進行一些初始化,在tearDown()中清除在數據庫中產生的數據,而後關閉鏈接。注意tearDown的過程很重要,要爲之後的 TestCase留下一個乾淨的環境。關於fixture,還有一個專門的庫函數叫作fixtures,功能更增強大。

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

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

二、在上面編寫的測試類中定義測試方法(這個就是指的測試用例),每一個方法的方法名要求以 test 打頭,沒有額外的參數。 在該測試方法中 調用被測試代碼,校驗測試結果,TestCase類中提供了不少標準的校驗方法,如 最多見的assertEqual。

三、執行 unittest.main() ,該函數會負責運行測試,它會實例化全部TestCase的子類,並運行其中全部以test打頭的方法。

2、簡單用法

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,則結果依次顯示。

3、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()清理環境。

4、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)

5、unittest網易郵箱登陸案例

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

2.判斷title徹底等於指望結果;

image

 

6、參考代碼

#!/usr/bin/env python# -*- coding: utf-8 -*-# @Author  : Ailie# @File    : mailLogin.py# @Software: PyCharmimport timeimport unittestfrom selenium import webdriverfrom selenium.webdriver.support import expected_conditions as ECclass 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 == 'sanzang520@yeah.net':
            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 == 'sanzang520@yeah.net':
            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 == 'sanzang520@yeah.net':
            print('登陸成功')        else:
            print('登錄失敗')    def tearDown(self):
        self.browser.quit()if __name__ == "__main__":
    unittest.main()
相關文章
相關標籤/搜索