亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

unittest框架怎么在Python中使用

發布時間:2021-03-26 16:18:22 來源:億速云 閱讀:120 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關unittest框架怎么在Python中使用,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

測試模型

(1)線性測試

1、概念:

通過錄制或編寫對應應用程序的操作步驟產生的線性腳本。單純的來模擬用戶完整的操作場景。(操作,重復操作,數據)都混合在一起。

2、優點:每個腳本相對獨立,且不產生其他依賴和調用。任何一個測試用例腳本拿出來都可以單獨執行。

3、缺點:開發成本高,用例之間存在重復的操作。比如重復的用戶登錄和退出。

維護成本高,由于重復的操作,當重復的操作發生改變時,則需要逐一進行腳本的修改。

4.線性測試實例:用戶登錄

(2)模塊化驅動測試

1、概念:

將重復的操作獨立成功共模塊,當用例執行過程中需要用到這一模塊操作時則被調用。
操作+(重復操作,數據)混合在一起。例如,自動化測試的執行需要保持測試用例的獨立性和完整性,所以每一條用例在執行時都需要登錄和退出操作,so可以把登錄和退出的操作封裝為公共函數。

2、優點:由于最大限度消除了重復,從而提高了開發效率和提高測試用例的可維護性。

3、缺點:雖然模塊化的步驟相同,但是測試數據不同。比如說重復的登錄模塊,如果登錄用戶不同,依舊要重復編寫登錄腳本。

4.實例:對公共模塊,例如登陸和退出進行模塊化封裝

(3)數據驅動測試

1、概念:它將測試中的測試數據和操作分離,數據存放在另外一個文件中單獨維護。

通過數據的改變從而驅動自動化測試的執行,最終引起測試結果的改變。

操作+重復操作+數據分開。

2、優點:

通過這種方式,將數據和重復操作分開,可以快速增加相似測試,完成不同數據情況下的測試。

3、實例從excel表格讀取用戶名密碼,登錄郵箱。

二、unittest框架

用Python搭建自動化測試框架,需要組織用例以及測試執行,大部分推薦的是unittest。現在用的也是這個,隨著了解,也有其他的框架,有時間再多去學習,保持持續學習哦~

附上官方文檔地址:鏈接描述https://docs.python.org/2.7/library/unittest.html#

unittest是Python自帶的單元測試框,可以用來作自動化測試框架的用例組織執行框架。優點:提供用例組織與執行方法;提供比較方法;提供豐富的日志、清晰的報告。
大致流程:

  • 寫好TestCase

  • 由TestLoader加載TestCase到TestSuite

  • 然后由TextTestRunner來運行TestSuite,運行的結果保存在TextTestResult中。

通過命令行或者unittest.main()執行時,main會調用TextTestRunner中的run()來執行,或者可以直接通過TextTestRunner來執行用例。

在Runner執行時,默認將執行結果輸出到控制臺,我們可以設置其輸出到文件,在文件中查看結果。

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

1、Test fixture

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

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

  • setUp():準備環境,執行每個測試用例的前置條件;

  • tearDown():環境還原,執行每個測試用例的后置條件;

  • setUpClass():必須使用@classmethod裝飾器,所有case執行的前置條件,只運行一次;

  • tearDownClass():必須使用@classmethod裝飾器,所有case運行完后只運行一次;

例如:

# 重寫TestCase的setUp() tearDown()方法:在每個測試方法執行前以及執行后各執行一次
def setUp(self): # 鉤子方法
 print("do something before test : prepare environment")
def tearDown(self): # 鉤子方法
 print("do something after test : clean up ")

2、TestCase

類,unittest.TestCase

一個類class繼承 unittest.TestCase,就是一個測試用例。一個TestCase的實例就是一個測試用例,就是一個完整的測試流程。

包括測試前環境準備setUp()|setUpClass()、執行代碼run()、測試環境后的還原tearDown()|tearDownClass()。
繼承自unittest.TestCase的類中,測試方法的名稱要以test開頭。且只會執行以test開頭定義的方法(測試用例)。

例如:【先準備待測試的方法function.py】

#!/usr/bin/python3
# -*- coding:utf-8 -*-
def add(a,b):
 return a+b
def minus(a,b):
 return a-b
def multi(a,b):
 return a*b
def divide(a,b):
 return a/b

【測試腳本】:

import unittest
from A_UnitTest_basicDemo_ok.function import *

class TestFunc(unittest.TestCase):
 # 繼承自unittest.TestCase
 # 重寫TestCase的setUp()、tearDown()方法:在每個測試方法執行前以及執行后各執行一次
 def setUp(self):
  print("do something before test : prepare environment")

 def tearDown(self):
  print("do something after test : clean up ")
 
 # 測試方法均已test開頭,否則是不被unittest識別的
 def test_add(self):
  print("add:")
  self.assertEqual(3,add(1,2))

 def test_minus(self):
  print("minus")
  self.assertEqual(3,minus(5,2))

 def test_multi(self):
  print("multi")
  self.assertEqual(6,multi(2 ,3))

 def test_divide(self):
  print("divide")
  self.assertEqual(2,divide(4,2))

if __name__ == "__main__":
 # 在main()中加verbosity參數,可以控制輸出的錯誤報告的詳細程度
 # verbosity=*:默認是1;設為0,則不輸出每一個用例的執行結果;2-輸出詳細的執行結果
 unittest.main(verbosity=2)

或者也可以使用setUpClass() & tearDownClass()方法:

# 如果想在所有case執行之前準備一次測試環境,并在所有case執行結束后再清理環境
@classmethod
def setUpClass(cls):
 print("this setupclass() method only called once")
@classmethod
def tearDownClass(cls):
 print("this teardownclass() method only called once too")

【verbosity】

在測試用例文件的末尾加上如下代碼:

if __name__ == "__main__":
 unittest.main(verbosity=2) # 輸出詳細的錯誤報告

在unittest.main()中加參數verbosity可以控制錯誤報告的詳細程度:默認為1。0,表示不輸出每一個用例的執行結果;2表示詳細的執行報告結果。

【執行結果】:輸出到控制臺

this setupclass() method only called once
test_add (__main__.TestFunc) ... ok
add:
test_divide (__main__.TestFunc) ... ok
divide
test_minus (__main__.TestFunc) ... ok
minus
test_multi (__main__.TestFunc) ... ok
multi

this teardownclass() method only called once too
----------------------------------------------------------------------
Ran 4 tests in 0.000s

OK

3、TestSuite

上述簡單的測試會產生兩個問題,可不可以控制test測試用例的執行順序?若不想執行某個測試用例,有沒有辦法可以跳過?
對于執行順序,默認按照test的 A-Z、a-z的方法執行。若要按自己編寫的用例的先后關系執行,需要用到testSuite。
把多個測試用例集合起來,一起執行,就是testSuite。testsuite還可以包含testsuite。

一般通過addTest()或者addTests()向suite中添加。case的執行順序與添加到Suite中的順序是一致的。

例如:run_main.py

if __name__ == "__main__":
 suite = unittest.TestSuite()
# 定義list,按照list里的順序執行測試用例
tests=[TestFunc("test_add"),TestFunc("test_minus"),TestFunc("test_multi"),TestFunc("test_divide")]
suite.addTests(tests)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)

TestSuite可以再包含testsuite,示例如下:

suite1 = module.TheTestSuite()
suite2=module.TheTestSuite()
alltests=unittest.TestSuite([suite1],[suite2])

跳過某個case:skip裝飾器

若想讓某個測試用例不執行,有沒有辦法呢?當然是有的,可以使用skip裝飾器。

例如:

@unittest.skip("i don't want to run this case -> test_minus() ... ")
def test_minus(self):
 print("minus")
 self.assertEqual(3,minus(5,2))

加上“@unittest.skip()”后,執行看看,對比控制臺的輸出結果就可以明顯看出區別了。

Skip裝飾器有如下幾種情況:

(1)skip():無條件跳過

@unittest.skip("i don't want to run this case. ")

(2)skipIf(condition,reason):如果condition為true,則 skip

@unittest.skipIf(condition,reason)

(3)skipUnless(condition,reason):如果condition為False,則skip

@unittest.skipUnless(condition,reason)

(4)還可以使用TestCase.skipTest(reason)。例如:

def test_divide(self):
 self.skipTest('do not run test_divide()')
 print("divide")
 self.assertEqual(2,divide(4,2))

控制臺輸出(部分):test_divide (__main__.TestFunc) ... skipped 'do not run test_divide()'

4、TestLoader

TestLoadder用來加載TestCase到TestSuite中。

loadTestsFrom*()方法從各個地方尋找testcase,創建實例,然后addTestSuite,再返回一個TestSuite實例。

該類提供以下方法:

unittest.TestLoader().loadTestsFromTestCase(testCaseClass)
unittest.TestLoader().loadTestsFromModule(module)
unittest.TestLoader().loadTestsFromName(name,module=None)
unittest.TestLoader().loadTestsFromNames(names,module=None)
unittest.TestLoader().getTestCaseNames(testCaseclass)
unittest.TestLoader().discover()

TestLoader 之discover:

用discover()來加載測試多個測試用例,再用TextRunner類的run()方法去一次執行多個腳本的用例,達到批量執行的效果。

discover方法里面有三個參數:

  • -case_dir:這個是待執行用例的目錄。

  • -pattern:這個是匹配腳本名稱的規則,test*.py意思是匹配test開頭的所有腳本。

  • -top_level_dir:這個是頂層目錄的名稱,一般默認等于None就行了。

TextTestRunner():執行測試用例。runner.run(test)會執行TestSuite、TestCase中的run(result)方法。

如下:run_main.py示例

import unittest
import os
# 用例的路徑
case_path = os.path.join(os.getcwd(),"case")
# 報告存放的路徑
report_path = os.path.join(os.getcwd(),"report")
def all_cases():
 discover= unittest.defaultTestLoader.discover(case_path,pattern="test*.py",top_level_dir=None)
 print(discover)
 return discover
if __name__ == "__main__":
 runner = unittest.TextTestRunner(verbosity=2)
 runner.run(all_cases())

5、生成測試報告

生成TXT測試報告

代碼示例:

if __name__ == "__main__":
 suite = unittest.TestSuite()
 # 生成.txt的測試報告(控制臺的輸出寫入到文件中)
 suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestFunc))
 with open('UnittestTextReport.txt','a') as f:
  runner = unittest.TextTestRunner(stream=f,verbosity=2)
  runner.run(suite)

可以看到在目錄下,生成了UnittestTextReport.txt文件。

但是txt格式的文件太過于簡陋。我們可以借助與第三方提供的庫來輸出更加形象的html報告,也可以自定義輸出自己想要格式的html格式的報告。

  1. 生成HTML測試報告

  2. 先下載HTMLTestRunner.py(注意Python的版本),http://tungwaiyip.info/software/HTMLTestRunner.html。然后放在Python的Lib目錄下;

  3. 在run_main.py文件中加入:from HTMLTestRunner import HTMLTestRunner

HTMLTestRunner()方法有三個參數:

  • --stream:測試報告寫入文件的存儲區域

  • --title:測試報告的主題

  • --description:測試報告的描述

代碼示例:

if __name__ == "__main__":
 suite = unittest.TestSuite()
 # 生成HTML格式的具體測試報告
 with open('HtmlReport.html','wb') as f: # 在python3,要寫成'wb' or 'wr'
  runner = HTMLTestRunner(stream=f,title='function test 
report',description='generated by HTMLTestRunner',verbosity=2)
  runner.run(suite)

三、代碼示例

function.py

#!/usr/bin/python3
# -*- coding:utf-8 -*-
def add(a,b):
 return a+b
def minus(a,b):
 return a-b
def multi(a,b):
 return a*b
def divide(a,b):
 return a/b

Test_function.py

#!/usr/bin/python3
# -*- coding:utf-8 -*-
import unittest
from UnitTest_1.function import * # from..import ... :要指定文件的路徑

class TestFunc(unittest.TestCase): # unittest.TestCase
# 如果想在所有case執行之前準備一次測試環境,并在所有case執行結束后再清理環境
 @classmethod
 def setUpClass(cls):
  print("this setupclass() method only called once")
 @classmethod
 def tearDownClass(cls):
  print("this teardownclass() method only called once too")

 # 測試方法均已test開頭,否則是不被unittest識別的
 def test_add(self):
  print("add:")
  self.assertEqual(3,add(1,2))
 def test_minus(self):
  print("minus")
  self.assertEqual(3,minus(5,2))
 # 如果想臨時跳過某個case:skip裝飾器
 @unittest.skip("i don't want to run this case. ")
 def test_multi(self):
  print("multi")
  self.assertEqual(6,multi(2,3))
 def test_divide(self):
  print("divide")
  self.assertEqual(2,divide(5,2))

if __name__ == "__main__":
 # 在main()中加verbosity參數,可以控制輸出的錯誤報告的詳細程度
 # verbosity=*:默認是1;設為0,則不輸出每一個用例的執行結果;2-輸出詳細的執行結果
 unittest.main(verbosity=2)

Test_suite.py

#!/usr/bin/python3
# -*- coding:utf-8 -*-

import unittest
from UnitTest_1.test_function import TestFunc
from HTMLTestRunner import HTMLTestRunner
# 在Python3中已經沒有 StringIO,所以引用的時候要注意
from io import StringIO

if __name__ == "__main__":
 suite = unittest.TestSuite()
 # 定義list,按照list里的順序執行測試用例
 tests = [TestFunc("test_add"),TestFunc("test_minus"),TestFunc("test_multi"),TestFunc("test_divide")]
 suite.addTests(tests)
 '''
 runner = unittest.TextTestRunner(verbosity=2)
 runner.run(suite)
 '''
 
 # 生成.txt的測試報告(控制臺的輸出寫入到文件中)
 '''
 suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestFunc))
 with open('UnittestTextReport.txt','a') as f:
  runner = unittest.TextTestRunner(stream=f,verbosity=2)
  runner.run(suite)
 '''

 # 生成HTML格式的具體測試報告
 with open('HtmlReport.html','wb') as f: # 在python3,要寫成'wb' or 'wr'
  runner = HTMLTestRunner(stream=f,title='function test report',description='generated by 
     HTMLTestRunner',verbosity=2)
  runner.run(suite)

上述就是小編為大家分享的unittest框架怎么在Python中使用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

保德县| 阿克苏市| 常德市| 东莞市| 德兴市| 年辖:市辖区| 合肥市| 澎湖县| 夏津县| 宝鸡市| 大安市| 江油市| 巴青县| 乐平市| 蒙城县| 衡山县| 双柏县| 湾仔区| 剑河县| 祥云县| 固始县| 郑州市| 全椒县| 垣曲县| 闵行区| 富锦市| 霍城县| 江口县| 浙江省| 宜州市| 屏南县| 收藏| 巴中市| 徐州市| 庆城县| 开江县| 大宁县| 孟津县| 西盟| 高阳县| 双牌县|