python單元測試unittest

一、單元測試、集成測試、功能測試

  1. 單元測試

    顆粒度最小,開發小組用白盒測試,測試單元是否符合‘設計’,對最小的單元進行檢查和驗證。

  2. 集成測試

    介于測試和系統測試之間,由開發小組用白盒+黑盒方法測試,即驗證‘設計’又驗證‘需求’。

  3. 功能測試顆粒度最大,由獨立的測試小組采用黑盒測試,主要測試系統是否符合‘需求規格說明書’。

  4. 白盒測試與黑盒測試

    • 白盒測試:主要應用于單元測試階段,主要是對代碼級別的測試,針對程序內部的邏輯結構。
    • 黑盒測試:不考慮程序內部結構和邏輯結構,主要是測試系統的功能是否滿足‘需求規格說明書’。一般會有一個輸入值和輸出值,和一個期望值做比較。

二、Unittest重要組成

python中有自帶的單元測試框架是unittest模塊,用它做單元測試,它里面封裝好了一些校驗返回的結果方法(斷言)和一些用了執行的初始化操作。

unittest中最核心的部分是:TestFixture、TestCase、TestSuite、TestRunner

  1. TestFixtrue

    • 作用:用于一個測試環境的準備和銷毀還原。

    • 功能:當測試用例每次執行之前需要準備測試環境,每次測試完成后還原測試環境,每次測試完成后還原測試環境,比如執行前連接數據庫、打開瀏覽器等,執行完成后需要還原數據庫、關閉瀏覽器等操作。這時候就可以啟用testfixure

      1.setUp():準備環境,執行每個測試用例的前置條件;
      2.testDown():環境還原,執行每個測試用例的后置條件;
      3.setUpClass():必須使用@classmethod裝飾器,所有case執行的前置條件,只執行一次;
      4.testDownClass():必須使用@classmethod裝飾器,所有case運行完后只執行一次;
      
  2. TestCase:測試用例

    • 定義:一個類class繼承unittest.TestCase,就是一個測試用例。

    • 什么是測試用例?

      就是一個完整的測試流程,包括測試前準備環境的搭建,執行測試代碼,以及測試后環境的還原。

    • 測試用例命名規則

      繼承自unittest.TestCase的類中,測試方法的名稱要以test開頭。且值會執行以test開頭定義的方法,測試用例執行的順序會按照方法的ASCII值排序。

      如果想跳過某個測試用例,需要添加@unittest.skip

  3. TestSuite

    測試套件,可以將多個測試用例集合在一起,能一起執行選中的測試用例

    suite = unittest.TestSuite()#創建測試套件
    case_list = [“test1”,”test2”….]
    For case in case_list:
        suite.addTest(類名(case))
    
  4. TextRunner

    執行測試用例

    通過TestRunner類提供的run()方法來執行test suite/test cas

    格式

    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)
    

三、斷言

常用:assertEqual(a,b):斷言a和b是否相等,相等則測試用例通過。

  • 實際測試案例-主要測試一個代碼塊

    1. 測試代碼和開發是分開的

    2. Calculate.py代碼

      class Caculate():
          def add(self, a, b):
              c = a + b
              return c
          def reduce(self, a, b):
              c = a - b
              return c
      
    3. testdemotwo.py代碼

      import unittest
      from dev.Caculate import Caculate
      c = Caculate()
      add = c.add(1, 4)
      reduce = c.reduce(4, 1)
      class UnitTestTwo(unittest.TestCase):
          def setUp(self) -> None:
              print("開始")
          def test001(self):
              self.assertEqual(add, 5)
          def test002(self):
              self.assertEqual(reduce, 3)
          def tearDown(self) -> None:
              print("結束")
      if __name__ == '__main__':
          unittest.main
      

四、生成測試報告

html格式的就是HTMLTestRunner啦,HTMLTestRunner是python標準庫的unittest框架的一個擴展,它可以生成一個直觀清晰的HTML測試報告。

  1. 下載HTMLTestRunner.py復制到項目中

  2. 格式

    with open("../report.html","wb") as f:
                HTMLTestRunner(
                    stream=f,
               title="單元測試",
                    description="測試一期",
                    verbosity=2
                ).run(suite)   
    
  3. 創建一個類,testhtml

  4. 生成測試報告

五、操作

1:導入unittest模塊   >>>import unittest
2:編寫一個類繼承unittest.TestCase
3:調用setUp(self), tearDown(self)方法實現測試用例前后階段的操作
4:編寫測試用例方法
    (1)該方法必須以test開頭,否則在unittest.main()中調用測試找不到該方法
    (2)設置斷言進行判斷,輸入數據和輸出數據的預期結果
5:創建套件,將多個測試用例存放套件中,一并執行()
6:生成測試報告(python自帶或者導入HTMLTestRunner生成html格式的測試報告)
7:運行測試用例unittest.main(),調用測試用例中以test開頭的方法

六、讀取文件

  1. 讀取xml文件

  2. 創建xml文件

    <note></note>開頭結束

    可自定義標簽

  3. 讀取xml文件

    from xml.dom import minidom
    class Readxml():
        def read_xml(self,filename,onename,twoname):
            root =minidom.parse(filename)
            firstnode =root.getElementsByTagName(onename)[0]
            secondnode=firstnode.getElementsByTagName(twoname)[0].firstChild.data
            return secondnode
    
    1. 獲取xml固定簡單數據

      firstnode = root.getElementsByTagName('add')[0]
              secondnode = firstnode.getElementsByTagName('add2')[0].firstChild.data
      
    2. 抽取方法

      from xml.dom import minidom
      class Readxml():
          def readXml(self,filename,onename,twoname):
              root = minidom.parse(filename)
      
              firstnode = root.getElementsByTagName(onename)[0]
              secondnode = firstnode.getElementsByTagName(twoname)[0].firstChild.data
              return secondnode
      
    3. 具體使用

      import unittest
      from unittest1.dev.Caculate import Caculate
      from unittest1.testdate.xmltest import Readxml
      from unittest1.testdate.testcsv import ReadCsv
      
      c = Caculate()
      r = Readxml()
      
      a1 = r.readXml('../testdate/xmldata.xml','add','add1')
      a2 = r.readXml('../testdate/xmldata.xml','add','add2')
      a3 = r.readXml('../testdate/xmldata.xml','add','add3')
      
      r1 = r.readXml('../testdate/xmldata.xml','reduce','reduce1')
      r2 = r.readXml('../testdate/xmldata.xml','reduce','reduce2')
      r3 = r.readXml('../testdate/xmldata.xml','reduce','reduce3')
      
      class UnitTest(unittest.TestCase):
          def setUp(self) -> None:
              print('開始測試環境')
      
          def testAdd(self):
              # sum = c.add(int(a1),int(a2))
              # self.assertEqual(sum,int(a3))
              
          def testReduce(self):
              # dif = c.reduce(int(r1),int(r2))
              # self.assertEqual(dif,int(r3))
      
          def tearDown(self) -> None:
              print('還原測試環境')
      if __name__ == '__main__':
           suite = unittest.TestSuite()
           caseList = ['testAdd','testReduce']
           for case in caseList:
               suite.addTest(UnitTest(case))
      
           runner = unittest.TextTestRunner(verbosity=2)
           runner.run(suite)
      
      
  4. 讀取csv文件

    1. 在data下創建CSV文件a.csv

    2. 創建讀文件的文件:testcsv.py

      import csv
      
      class ReadCsv():
          def Read_csv(self,*kwaegs):
              itme = []
              c = csv.reader(open('../testdate/caculate.csv','r'))
              for csv_i in c:
                  a = []
                  for i in csv_i:
                      i = int(i)
                      a.append(i)
                  itme.append(a)
              return itme
      
      #
      # r = ReadCsv()
      # print(r.Read_csv())
      
    3. 在測試用例的類中

完整代碼

import unittest
from unittest1.dev.Caculate import Caculate
from unittest1.testdate.xmltest import Readxml
from unittest1.testdate.testcsv import ReadCsv

c = Caculate()
r = ReadCsv()
aa = r.Read_csv()
print(aa)


# r = Readxml()
#
# a1 = r.readXml('../testdate/xmldata.xml','add','add1')
# a2 = r.readXml('../testdate/xmldata.xml','add','add2')
# a3 = r.readXml('../testdate/xmldata.xml','add','add3')
#
# r1 = r.readXml('../testdate/xmldata.xml','reduce','reduce1')
# r2 = r.readXml('../testdate/xmldata.xml','reduce','reduce2')
# r3 = r.readXml('../testdate/xmldata.xml','reduce','reduce3')

class UnitTest(unittest.TestCase):
    def setUp(self) -> None:
        print('開始測試環境')

    def testAdd(self):
        # sum = c.add(int(a1),int(a2))
        # self.assertEqual(sum,int(a3))
        add = c.add(aa[0][0],aa[0][1])
        self.assertEqual(add,aa[0][2])

    def testReduce(self):

        reduce = c.reduce(aa[1][0],aa[1][1])
        self.assertEqual(reduce,aa[1][2])
        # dif = c.reduce(int(r1),int(r2))
        # self.assertEqual(dif,int(r3))

    def tearDown(self) -> None:
        print('還原測試環境')


# if __name__ == '__main__':
#
#     suite = unittest.TestSuite()
#     caseList = ['testAdd','testReduce']
#     for case in caseList:
#         suite.addTest(UnitTest(case))
#
#     runner = unittest.TextTestRunner(verbosity=2)
#     runner.run(suite)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,016評論 2 375

推薦閱讀更多精彩內容

  • @(python) 單元測試是對程序中的單個子程序、函數、過程進行的測試,面向白盒測試。單元測試測試覆蓋常用子程序...
    orientlu閱讀 1,987評論 1 0
  • unittest是python內置的用于測試代碼的模塊,無需安裝, 使用簡單方便。 unittest 簡介 uni...
    tafanfly閱讀 42,350評論 0 7
  • 什么是單元測試 單元測試是用來對最小可測試單元(如一個函數、一個類或者一個模塊)進行檢查和驗證。尤其是在對代碼進行...
    cuckoo5閱讀 5,446評論 0 5
  • Python中有一個自帶的單元測試框架是unittest模塊,用它來做單元測試,它里面封裝好了一些校驗返回的結果方...
    MiracleJQ閱讀 379評論 0 0
  • unittest作為一個python中的基本模塊,是其他框架和工具的基礎,官方文檔神馬的最實用了:https://...
    cheneydc閱讀 8,147評論 0 3