欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python接口自動(dòng)化淺析unittest單元測試原理

 更新時(shí)間:2021年08月24日 17:06:10   作者:軟件測試自動(dòng)化測試  
這篇文章主要介紹了Python接口自動(dòng)化淺析unittest單元測試原理,文中描述了單元測試,unittest模塊特性、大致流程、源碼及實(shí)戰(zhàn)例子這幾個(gè)模塊,有需要的朋友可以借鑒參考下

在上一篇Python接口自動(dòng)化測試系列文章:Python接口自動(dòng)化淺析requests請求封裝原理,主要通過源碼分析,總結(jié)出一套簡潔的請求類封裝。

以下主要介紹unittest特性、運(yùn)行流程及實(shí)際案例。

一、單元測試三連問

1、什么是單元測試?

按照階段來分,一般就是單元測試,集成測試,系統(tǒng)測試,驗(yàn)收測試。

單元測試是對單個(gè)模塊、單個(gè)類或者單個(gè)函數(shù)進(jìn)行測試。

將訪問接口的過程封裝在函數(shù)里面;

接口測試就變成了單元測試;

單元測試就是通過傳參,對某個(gè)模塊、某個(gè)類、某個(gè)函數(shù)進(jìn)行結(jié)果輸出后驗(yàn)證的測試。

2、為什么要做單元測試?

1.單元測試之后,才是集成測試,單個(gè)的功能模塊測試通過之后,才能把單個(gè)功能模塊集成起來做集成測試,為了從底層發(fā)現(xiàn)bug,減少合成后出現(xiàn)的問題。

2.越早發(fā)現(xiàn)bug越好,否則問題累計(jì)到后期,如果做錯(cuò)了就要推倒重來,對于時(shí)間和人力成本來說非常耗費(fèi)精力。

對于我們測試來說:單元測試是為了執(zhí)行測試用例。

3、怎么做單元測試?

Python里有兩個(gè)單元測試類:

1.Unittest(Python自帶);

2.Pytest(下載安裝);

前者多用于接口自動(dòng)化項(xiàng)目用,后者多用于WEB自動(dòng)化項(xiàng)目、APP自動(dòng)化項(xiàng)目。

二、unittest模塊說明

1、unittest簡介

unittest是Python自帶的單元測試框,具備編寫用例、組織用例、執(zhí)行用例、輸出報(bào)告等自動(dòng)化框架的條件,可以用來作自動(dòng)化測試框架的用例組織執(zhí)行框架。

unittest框架的特性:

  • 提供用例組織與執(zhí)行:當(dāng)測試用例只有幾條的時(shí)候可以不考慮用例的組織,但是當(dāng)測試用例數(shù)量較多時(shí),此時(shí)就需要考慮用例的規(guī)范與組織問題。unittest單元測試框架就是用來解決這個(gè)問題的。
  • 提供豐富的斷言方法:既然是測試,就有一個(gè)預(yù)期結(jié)果和實(shí)際結(jié)果的比較問題。比較就是通過斷言來實(shí)現(xiàn),unittest單元測試框架提供了豐富的斷言方法,通過捕獲返回值,并且與預(yù)期值進(jìn)行比較,從而得出測試通過與否。
  • 提供豐富的日志:每一個(gè)失敗用例我們都希望知道失敗的原因,所有用例執(zhí)行結(jié)束我們有希望知道整體執(zhí)行情況,比如總體執(zhí)行時(shí)間,失敗用例數(shù),成功用例數(shù)。unittest單元測試框架為我們提供了這些數(shù)據(jù)。

2、unittest組成

unittest單元測試中最核心的四個(gè)部分是:

TestCase(測試用例)

TestSuite(測試套件)

TestRunner(測試運(yùn)行器)

TestFixture(測試環(huán)境數(shù)據(jù)準(zhǔn)備和清理)

1.TestCase(測試用例):

一個(gè)TestCase的實(shí)例就是一個(gè)測試用例。什么是測試用例呢?就是一個(gè)完整的測試流程。包括測試前準(zhǔn)備環(huán)境的搭建(setUp)、實(shí)現(xiàn)測試過程的代碼(run),以及測試后環(huán)境的還原(tearDown)。

單元測試(Unittest)的本質(zhì)也就在這里,一個(gè)測試用例就是一個(gè)完整的測試單元,通過運(yùn)行這個(gè)測試單元,可以對某一個(gè)功能進(jìn)行驗(yàn)證。

2.TestSuite(測試套件):

一個(gè)功能的驗(yàn)證往往需要多個(gè)測試用例,可以把多個(gè)測試用例集合在一起執(zhí)行,這就產(chǎn)生了測試套件TestSuite的概念。TestSuite用來組裝單個(gè)測試用例??梢酝ㄟ^addTest加載TestCase到TestSuite中,從而返回一個(gè)TestSuite實(shí)例。

而且TestSuite也可以嵌套TestSuite。

3.TestLoader(測試用例加載器):

用來加載TestCase到TestSuite中的,其中l(wèi)oadTestsFrom__()方法用于尋找TestCase,并創(chuàng)建它們的實(shí)例,然后添加到TestSuite中,返回TestSuite實(shí)例;

4.TextTestRunner(執(zhí)行測試用例):

用來執(zhí)行測試用例,其中run(test)會(huì)執(zhí)行TestSuite/TestCase中的run(result)方法,并將測試結(jié)果保存到TextTestResult實(shí)例中,包括運(yùn)行了多少測試用例,成功多少,失敗多少等信息;

5.Test Fixture(測試環(huán)境數(shù)據(jù)準(zhǔn)備和清理):

一個(gè)測試用例的初始化準(zhǔn)備及環(huán)境還原,主要是setUp() 和 tearDown()方法;

比如說在測試用例中需要訪問數(shù)據(jù)庫,那么可以在setUp()中建立數(shù)據(jù)庫連接以及進(jìn)行一些初始化,

在tearDown()中清除在數(shù)據(jù)庫中產(chǎn)生的數(shù)據(jù),然后關(guān)閉連接。

注意tearDown的過程很重要,要為以后的TestCase留下一個(gè)干凈的環(huán)境。

3、unittest核心工作原理

unittest的靜態(tài)類圖:

大體流程:編寫TestCase,由TestLoader加載TestCase到TestSuite,然后由TextTestRunner來運(yùn)行TestSuite,最后將運(yùn)行的結(jié)果保存在TextTestResult中。

三、unittest單元測試

1、實(shí)現(xiàn)思路

1.導(dǎo)入unittest模塊、 被測文件或者其中的類;

2.創(chuàng)建一個(gè)測試類,并繼承unittest.TestCase方法;

3.重寫setUp和tearDown方法(如果有初始化條件和結(jié)束條件)。若setup()成功運(yùn)行,無論測試方法是否成功,都會(huì)運(yùn)行tearDown ();

4.定義測試函數(shù),函數(shù)名以test_開頭,以識(shí)別測試用例;

5.調(diào)用unittest.main()方法運(yùn)行測試用例;

6.用例執(zhí)行后,需要判斷用例是Pass還是Fail,可以用unittest.TestCase模塊的:斷言

斷言就是比對預(yù)期結(jié)果。如果不加斷言,沒有結(jié)果對比,需要手動(dòng)去檢查運(yùn)行的結(jié)果是否符合預(yù)期。

2、使用介紹

1.要想使用unittest單元測試框架,必須得先導(dǎo)入:import unittest

2.查看unittest源碼;

import unittest
print(help(unittest))

從打印結(jié)果中提取出unittest簡易的例子:

import unittest
class IntegerArithmeticTestCase(unittest.TestCase):
    def testAdd(self):  # test method names begin with 'test'
        self.assertEqual((1 + 2), 3)
        self.assertEqual(0 + 1, 1)
    def testMultiply(self):
        self.assertEqual((0 * 10), 0)
        self.assertEqual((5 * 8), 40)
if __name__ == '__main__':
    unittest.main()

四、unittest實(shí)例

1、TestCase(測試用例)

看了官方代碼后,我們自己寫個(gè)例子熟悉下,并總結(jié)出規(guī)律:

import unittest
class TestDemo(unittest.TestCase):
    # test_sub用例
    def test_sub(self):
        self.assertEqual(2-1,1)
    # test_add用例
    def test_add(self):
        self.assertEqual(2+1,3)
if __name__ == "__main__":
    # unittest.main()是運(yùn)行主函數(shù)
    unittest.main(verbosity=2)

運(yùn)行結(jié)果為:

test_add (__main__.TestDemo) ... ok
test_sub (__main__.TestDemo) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK

接下來,我們來總結(jié)一些規(guī)律:

  • 使用unittest前,需導(dǎo)入unittest框架。
  • TestDemo這個(gè)類必須繼承unittest.TestCase,TestCase類,所有測試用例類繼承的基類。
  • 類內(nèi)的方法必須以test開頭,比如test_add。
  • 斷言:assertEqual用來斷言預(yù)期結(jié)果和實(shí)際結(jié)果是否一致。當(dāng)然unittest還包含很多其他斷言方法,后面統(tǒng)一介紹。
  • 用例執(zhí)行順序。在代碼中test_sub方法寫在test_add前,但實(shí)際,test_add比test_sub先運(yùn)行。為什么呢?unittest執(zhí)行測試用例,默認(rèn)是根據(jù)ASCII碼的順序加載測試用例,數(shù)字與字母的順序?yàn)椋?-9,A-Z,a-z。
  • verbosity是一個(gè)選項(xiàng),表示測試結(jié)果的信息復(fù)雜度,有0、1、2 三個(gè)值。verbosity=0 : 你只能獲得測試用例數(shù)總的結(jié)果;verbosity=1 (默認(rèn)模式): 在每個(gè)成功的用例前面有個(gè)“.” 每個(gè)失敗的用例前面有個(gè) “F”;verbosity=2 (詳細(xì)模式):測試結(jié)果會(huì)顯示每個(gè)測試用例的所有相關(guān)的信息。

如下,在測試用例中寫入斷言:

import unittest
#測試MathMethod類
class TestMathMethod(unittest.TestCase):
    #編寫測試用例
    def test_add_two_positive(self): #測試兩個(gè)正數(shù)相加
        res=MathMethod(1,1).add()
        print("1+1的結(jié)果是:",res)
        self.assertEqual(2,res,"兩個(gè)正數(shù)相加出錯(cuò)!") #斷言
    def test_add_two_zero(self): #測試兩個(gè)0相加
        res = MathMethod(0, 0).add()
        print("0+0的結(jié)果是:", res)
        self.assertEqual(0, res, "兩個(gè)0相加出錯(cuò)!") #斷言
    def test_add_two_negative(self): #測試兩個(gè)負(fù)數(shù)相加
        res = MathMethod(-1, -1).add()
        print("-1+(-1)的結(jié)果是:", res)
        self.assertEqual(-2, res, "兩個(gè)負(fù)數(shù)相加出錯(cuò)!") #斷言
if __name__ == '__main__':
    unittest.main()

測試用例里面的setUp函數(shù)與tearDown函數(shù)的使用:

class TestMathMethod(unittest.TestCase):
def setUp(self):
    print("開始準(zhǔn)備執(zhí)行測試用例!")
    
def tearDown(self):
    print("結(jié)束!")
    
#編寫測試用例
def test_add_two_positive(self): #測試兩個(gè)正數(shù)相加
    res=MathMethod(1,1).add()
    print("1+1的結(jié)果是:",res)

setUp函數(shù):初始化環(huán)境(執(zhí)行每條用例之前,都要執(zhí)行setUp函數(shù)下面的代碼,每次都要執(zhí)行);

tearDown函數(shù):清洗環(huán)境(執(zhí)行每條用例之后,都要執(zhí)行tearDown函數(shù)下面的代碼,每次都要執(zhí)行);

setUp()、tearDown()是TestCase里的方法,寫在測試類中,就是方法的重寫。

執(zhí)行順序是:setUp->testA->tearDown->setUp->testB>tearDown

2、TestSuit(測試集)

當(dāng)測試用例全部寫完,但是只想執(zhí)行其中部分,可以使用TestSuit()來收集測試用例。

import unittest
from xxx import xxx      #測試用例的類
suite=unittest.TestSuit()
suite.addTest(測試用例的類("用例名稱1"))    #用例名稱用字符串的形式傳入
suite.addTest(測試用例的類("用例名稱2"))
suite.addTest(測試用例的類("用例名稱3"))
.....

3、TestLoader(加載測試用例)

方式一:通過測試類來加載用例(loadTestsFromTestCase)

一次性加載測試用例類名1下的所有用例。

import unittest
    from xxx import xxx      #測試用例的類
    suite=unittest.TestSuit()
    loader=unittest.TestLoader()
    suite.addTest(loader.loadTestsFromTestCase(測試用例類名1))  
    #測試用例類名直接傳入
 

方式二:通過測試類所在的模塊加載用例(loadTestsFromModule)

一次性加載測試用例模塊名下的所有用例。

import unittest
from xxx import xxx      #測試用例模塊
suite=unittest.TestSuit()
loader=unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(測試用例模塊名))   #測試用例模塊名直接傳入

4、生成測試報(bào)告

方式一:使用unittest自帶的TextTestRunner生成測試報(bào)告(文本格式,不推薦使用)。

 

TextTestRunner是一個(gè)以文本形式展示測試結(jié)果的測試運(yùn)行程序類

stream 輸出報(bào)告的路徑,默認(rèn)輸出控制臺(tái);

verbosity 控制輸出報(bào)告的詳細(xì)程度,從0-2,越來越詳細(xì);

方式二:使用第三方模塊HTMLTestRunnerNew(生成HTML格式的測試報(bào)告,推薦使用)。

file:文件

verbosity:詳細(xì)程度

title:標(biāo)題

description:描述

tester:作者

with open("接口測試報(bào)告.html","wb") as file:
    runner = HTMLTestRunnerNew.HTMLTestRunner(stream=file,  
                                              verbosity=2,
                                              title="接口自動(dòng)化測試報(bào)告",
                                              description="接口測試V1",
                                              tester="ITester軟件測試小棧")
    runner.run(suite)

方式三:使用unittest.defaultTestLoader.discover() 模糊匹配。

import unittest
import HTMLTestRunnerNew
all_testcases=unittest.defaultTestLoader.discover(contants.testcases_dir, pattern='test_*.py',top_level_dir=None) 
#利用上下文管理器自動(dòng)關(guān)閉資源
with open(contants.reports_html,"wb+") as file:    #選擇絕對路徑,把文件打開,寫進(jìn)內(nèi)容 (報(bào)告的文件名直接寫在路徑里面)
    runner=HTMLTestRunnerNew.HTMLTestRunner(stream=file,
                                            title="接口自動(dòng)化測試報(bào)告",
                                            description="接口測試V1",
                                            tester="ITester軟件測試小棧")
    runner.run(all_testcases)
 

到此這篇關(guān)于Python接口自動(dòng)化淺析unittest單元測試原理的文章就介紹到這了,更多相關(guān)Python接口自動(dòng)化unittest單元測試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python函數(shù)聲明和調(diào)用定義及原理詳解

    python函數(shù)聲明和調(diào)用定義及原理詳解

    這篇文章主要介紹了python函數(shù)聲明和調(diào)用定義及原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python?ConfigParser庫輕松讀寫INI文件實(shí)例探究

    Python?ConfigParser庫輕松讀寫INI文件實(shí)例探究

    這篇文章主要為大家介紹了Python?ConfigParser庫輕松讀寫INI文件實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • python 按不同維度求和,最值,均值的實(shí)例

    python 按不同維度求和,最值,均值的實(shí)例

    今天小編就為大家分享一篇python 按不同維度求和,最值,均值的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • tensorflow 20:搭網(wǎng)絡(luò),導(dǎo)出模型,運(yùn)行模型的實(shí)例

    tensorflow 20:搭網(wǎng)絡(luò),導(dǎo)出模型,運(yùn)行模型的實(shí)例

    這篇文章主要介紹了tensorflow 20:搭網(wǎng)絡(luò),導(dǎo)出模型,運(yùn)行模型的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • tensorflow之如何使用GPU而不是CPU問題

    tensorflow之如何使用GPU而不是CPU問題

    這篇文章主要介紹了tensorflow之如何使用GPU而不是CPU問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • python中pathlib模塊的基本用法與總結(jié)

    python中pathlib模塊的基本用法與總結(jié)

    這篇文章主要給大家介紹了關(guān)于python中pathlib模塊的基本用法與總結(jié)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 用Python實(shí)現(xiàn)職工信息管理系統(tǒng)

    用Python實(shí)現(xiàn)職工信息管理系統(tǒng)

    這篇文章主要介紹了用Python實(shí)現(xiàn)職工信息管理系統(tǒng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • OpenCV圖像處理之自定義濾波

    OpenCV圖像處理之自定義濾波

    濾波處理分為兩大類:線性濾波和非線性濾波,OpenCV里有這些濾波的函數(shù),使用起來非常方便,這篇文章主要給大家介紹了關(guān)于OpenCV圖像處理之自定義濾波的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • Python Web框架之Django框架Model基礎(chǔ)詳解

    Python Web框架之Django框架Model基礎(chǔ)詳解

    這篇文章主要介紹了Python Web框架之Django框架Model基礎(chǔ),結(jié)合實(shí)例形式分析了Django框架Model模型相關(guān)使用技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2019-08-08
  • python切片作為占位符使用實(shí)例講解

    python切片作為占位符使用實(shí)例講解

    在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于python切片作為占位符使用實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-02-02

最新評(píng)論