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

Python  unittest單元測(cè)試框架的使用

 更新時(shí)間:2018年09月08日 09:48:21   作者:unpredictable_X  
這篇文章主要介紹了Python unittest單元測(cè)試框架的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

一、測(cè)試模型

下面這部分來自于某書籍資料,拿過來,按需參考一下:

測(cè)試模型

(1)線性測(cè)試

1、概念:

通過錄制或編寫對(duì)應(yīng)應(yīng)用程序的操作步驟產(chǎn)生的線性腳本。單純的來模擬用戶完整的操作場(chǎng)景。(操作,重復(fù)操作,數(shù)據(jù))都混合在一起。

2、優(yōu)點(diǎn):每個(gè)腳本相對(duì)獨(dú)立,且不產(chǎn)生其他依賴和調(diào)用。任何一個(gè)測(cè)試用例腳本拿出來都可以單獨(dú)執(zhí)行。

3、缺點(diǎn):開發(fā)成本高,用例之間存在重復(fù)的操作。比如重復(fù)的用戶登錄和退出。

維護(hù)成本高,由于重復(fù)的操作,當(dāng)重復(fù)的操作發(fā)生改變時(shí),則需要逐一進(jìn)行腳本的修改。

4.線性測(cè)試實(shí)例:用戶登錄

(2)模塊化驅(qū)動(dòng)測(cè)試

1、概念:

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

2、優(yōu)點(diǎn):由于最大限度消除了重復(fù),從而提高了開發(fā)效率和提高測(cè)試用例的可維護(hù)性。

3、缺點(diǎn):雖然模塊化的步驟相同,但是測(cè)試數(shù)據(jù)不同。比如說重復(fù)的登錄模塊,如果登錄用戶不同,依舊要重復(fù)編寫登錄腳本。

4.實(shí)例:對(duì)公共模塊,例如登陸和退出進(jìn)行模塊化封裝

(3)數(shù)據(jù)驅(qū)動(dòng)測(cè)試

1、概念:它將測(cè)試中的測(cè)試數(shù)據(jù)和操作分離,數(shù)據(jù)存放在另外一個(gè)文件中單獨(dú)維護(hù)。

通過數(shù)據(jù)的改變從而驅(qū)動(dòng)自動(dòng)化測(cè)試的執(zhí)行,最終引起測(cè)試結(jié)果的改變。

操作+重復(fù)操作+數(shù)據(jù)分開。

2、優(yōu)點(diǎn):

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

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

二、unittest框架

用Python搭建自動(dòng)化測(cè)試框架,需要組織用例以及測(cè)試執(zhí)行,大部分推薦的是unittest?,F(xiàn)在用的也是這個(gè),隨著了解,也有其他的框架,有時(shí)間再多去學(xué)習(xí),保持持續(xù)學(xué)習(xí)哦~

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

unittest是Python自帶的單元測(cè)試框,可以用來作自動(dòng)化測(cè)試框架的用例組織執(zhí)行框架。優(yōu)點(diǎn):提供用例組織與執(zhí)行方法;提供比較方法;提供豐富的日志、清晰的報(bào)告。
大致流程:

  • 寫好TestCase
  • 由TestLoader加載TestCase到TestSuite
  • 然后由TextTestRunner來運(yùn)行TestSuite,運(yùn)行的結(jié)果保存在TextTestResult中。

通過命令行或者unittest.main()執(zhí)行時(shí),main會(huì)調(diào)用TextTestRunner中的run()來執(zhí)行,或者可以直接通過TextTestRunner來執(zhí)行用例。

在Runner執(zhí)行時(shí),默認(rèn)將執(zhí)行結(jié)果輸出到控制臺(tái),我們可以設(shè)置其輸出到文件,在文件中查看結(jié)果。

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

1、Test fixture

用于一個(gè)測(cè)試環(huán)境的準(zhǔn)備和銷毀還原。

當(dāng)測(cè)試用例每次執(zhí)行之前需要準(zhǔn)備測(cè)試環(huán)境,每次測(cè)試完成后還原測(cè)試環(huán)境,比如執(zhí)行前連接數(shù)據(jù)庫、打開瀏覽器等,執(zhí)行完成后需要還原數(shù)據(jù)庫、關(guān)閉瀏覽器等操作。這時(shí)候就可以啟用testfixture。

  • setUp():準(zhǔn)備環(huán)境,執(zhí)行每個(gè)測(cè)試用例的前置條件;
  • tearDown():環(huán)境還原,執(zhí)行每個(gè)測(cè)試用例的后置條件;
  • setUpClass():必須使用@classmethod裝飾器,所有case執(zhí)行的前置條件,只運(yùn)行一次;
  • tearDownClass():必須使用@classmethod裝飾器,所有case運(yùn)行完后只運(yùn)行一次;

例如:

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

2、TestCase

類,unittest.TestCase

一個(gè)類class繼承 unittest.TestCase,就是一個(gè)測(cè)試用例。一個(gè)TestCase的實(shí)例就是一個(gè)測(cè)試用例,就是一個(gè)完整的測(cè)試流程。

包括測(cè)試前環(huán)境準(zhǔn)備setUp()|setUpClass()、執(zhí)行代碼run()、測(cè)試環(huán)境后的還原tearDown()|tearDownClass()。
繼承自u(píng)nittest.TestCase的類中,測(cè)試方法的名稱要以test開頭。且只會(huì)執(zhí)行以test開頭定義的方法(測(cè)試用例)。

例如:【先準(zhǔn)備待測(cè)試的方法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

【測(cè)試腳本】:

import unittest
from A_UnitTest_basicDemo_ok.function import *

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

 def tearDown(self):
  print("do something after test : clean up ")
 
 # 測(cè)試方法均已test開頭,否則是不被unittest識(shí)別的
 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參數(shù),可以控制輸出的錯(cuò)誤報(bào)告的詳細(xì)程度
 # verbosity=*:默認(rèn)是1;設(shè)為0,則不輸出每一個(gè)用例的執(zhí)行結(jié)果;2-輸出詳細(xì)的執(zhí)行結(jié)果
 unittest.main(verbosity=2)

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

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

【verbosity】

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

if __name__ == "__main__":
 unittest.main(verbosity=2) # 輸出詳細(xì)的錯(cuò)誤報(bào)告

在unittest.main()中加參數(shù)verbosity可以控制錯(cuò)誤報(bào)告的詳細(xì)程度:默認(rèn)為1。0,表示不輸出每一個(gè)用例的執(zhí)行結(jié)果;2表示詳細(xì)的執(zhí)行報(bào)告結(jié)果。

【執(zhí)行結(jié)果】:輸出到控制臺(tái)

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

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

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

例如:run_main.py

if __name__ == "__main__":
 suite = unittest.TestSuite()
# 定義list,按照list里的順序執(zhí)行測(cè)試用例
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])

跳過某個(gè)case:skip裝飾器

若想讓某個(gè)測(cè)試用例不執(zhí)行,有沒有辦法呢?當(dāng)然是有的,可以使用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()”后,執(zhí)行看看,對(duì)比控制臺(tái)的輸出結(jié)果就可以明顯看出區(qū)別了。

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

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

4、TestLoader

TestLoadder用來加載TestCase到TestSuite中。

loadTestsFrom*()方法從各個(gè)地方尋找testcase,創(chuàng)建實(shí)例,然后addTestSuite,再返回一個(gè)TestSuite實(shí)例。

該類提供以下方法:

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()來加載測(cè)試多個(gè)測(cè)試用例,再用TextRunner類的run()方法去一次執(zhí)行多個(gè)腳本的用例,達(dá)到批量執(zhí)行的效果。

discover方法里面有三個(gè)參數(shù):

  • -case_dir:這個(gè)是待執(zhí)行用例的目錄。
  • -pattern:這個(gè)是匹配腳本名稱的規(guī)則,test*.py意思是匹配test開頭的所有腳本。
  • -top_level_dir:這個(gè)是頂層目錄的名稱,一般默認(rèn)等于None就行了。

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

如下:run_main.py示例

import unittest
import os
# 用例的路徑
case_path = os.path.join(os.getcwd(),"case")
# 報(bào)告存放的路徑
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、生成測(cè)試報(bào)告

生成TXT測(cè)試報(bào)告

代碼示例:

if __name__ == "__main__":
 suite = unittest.TestSuite()
 # 生成.txt的測(cè)試報(bào)告(控制臺(tái)的輸出寫入到文件中)
 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格式的文件太過于簡(jiǎn)陋。我們可以借助與第三方提供的庫來輸出更加形象的html報(bào)告,也可以自定義輸出自己想要格式的html格式的報(bào)告。

  1. 生成HTML測(cè)試報(bào)告
  2. 先下載HTMLTestRunner.py(注意Python的版本),http://tungwaiyip.info/software/HTMLTestRunner.html。然后放在Python的Lib目錄下;
  3. 在run_main.py文件中加入:from HTMLTestRunner import HTMLTestRunner

HTMLTestRunner()方法有三個(gè)參數(shù):

  • --stream:測(cè)試報(bào)告寫入文件的存儲(chǔ)區(qū)域
  • --title:測(cè)試報(bào)告的主題
  • --description:測(cè)試報(bào)告的描述

代碼示例:

if __name__ == "__main__":
 suite = unittest.TestSuite()
 # 生成HTML格式的具體測(cè)試報(bào)告
 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執(zhí)行之前準(zhǔn)備一次測(cè)試環(huán)境,并在所有case執(zhí)行結(jié)束后再清理環(huán)境
 @classmethod
 def setUpClass(cls):
  print("this setupclass() method only called once")
 @classmethod
 def tearDownClass(cls):
  print("this teardownclass() method only called once too")

 # 測(cè)試方法均已test開頭,否則是不被unittest識(shí)別的
 def test_add(self):
  print("add:")
  self.assertEqual(3,add(1,2))
 def test_minus(self):
  print("minus")
  self.assertEqual(3,minus(5,2))
 # 如果想臨時(shí)跳過某個(gè)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參數(shù),可以控制輸出的錯(cuò)誤報(bào)告的詳細(xì)程度
 # verbosity=*:默認(rèn)是1;設(shè)為0,則不輸出每一個(gè)用例的執(zhí)行結(jié)果;2-輸出詳細(xì)的執(zhí)行結(jié)果
 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中已經(jīng)沒有 StringIO,所以引用的時(shí)候要注意
from io import StringIO

if __name__ == "__main__":
 suite = unittest.TestSuite()
 # 定義list,按照list里的順序執(zhí)行測(cè)試用例
 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的測(cè)試報(bào)告(控制臺(tái)的輸出寫入到文件中)
 '''
 suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestFunc))
 with open('UnittestTextReport.txt','a') as f:
  runner = unittest.TextTestRunner(stream=f,verbosity=2)
  runner.run(suite)
 '''

 # 生成HTML格式的具體測(cè)試報(bào)告
 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)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python之維度dim的定義及其理解使用方式

    Python之維度dim的定義及其理解使用方式

    這篇文章主要介紹了Python之維度dim的定義及其理解使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Python替換字符串replace()函數(shù)使用方法詳解

    Python替換字符串replace()函數(shù)使用方法詳解

    Python中的replace()方法是把字符串中的old(舊字符串)替換成new(新字符串),如果指定第三個(gè)參數(shù)max,則替換次數(shù)不超過max次(將舊的字符串用心的字符串替換不超過max次,本文就給大家講講Python replace()函數(shù)的使用方法,需要的朋友可以參考下
    2023-07-07
  • Python實(shí)現(xiàn)合并字典的方法

    Python實(shí)現(xiàn)合并字典的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)合并字典的方法,涉及Python針對(duì)字典的遍歷與合并的相關(guān)技巧,需要的朋友可以參考下
    2015-07-07
  • 使用Python的urllib和urllib2模塊制作爬蟲的實(shí)例教程

    使用Python的urllib和urllib2模塊制作爬蟲的實(shí)例教程

    這篇文章主要介紹了使用Python的urllib和urllib2模塊制作爬蟲的實(shí)例教程,展現(xiàn)了這兩個(gè)常用爬蟲制作模塊的基本用法,極度推薦!需要的朋友可以參考下
    2016-01-01
  • Python實(shí)現(xiàn)二叉樹的常見遍歷操作總結(jié)【7種方法】

    Python實(shí)現(xiàn)二叉樹的常見遍歷操作總結(jié)【7種方法】

    這篇文章主要介紹了Python實(shí)現(xiàn)二叉樹的常見遍歷操作,結(jié)合實(shí)例形式總結(jié)分析了二叉樹的前序、中序、后序、層次遍歷中的迭代與遞歸等7種操作方法,需要的朋友可以參考下
    2019-03-03
  • Python使用oslo.vmware管理ESXI虛擬機(jī)的示例參考

    Python使用oslo.vmware管理ESXI虛擬機(jī)的示例參考

    oslo.vmware是OpenStack通用框架中的一部分,主要用于實(shí)現(xiàn)對(duì)虛擬機(jī)的管理任務(wù),借助oslo.vmware模塊我們可以管理Vmware ESXI集群環(huán)境。
    2021-06-06
  • Python標(biāo)準(zhǔn)庫json模塊和pickle模塊使用詳解

    Python標(biāo)準(zhǔn)庫json模塊和pickle模塊使用詳解

    這篇文章主要介紹了Python標(biāo)準(zhǔn)庫json模塊和pickle模塊使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Python 對(duì)象序列化與反序列化之pickle json詳細(xì)解析

    Python 對(duì)象序列化與反序列化之pickle json詳細(xì)解析

    我們知道在Python中,一切皆為對(duì)象,實(shí)例是對(duì)象,類是對(duì)象,元類也是對(duì)象。本文正是要聊聊如何將這些對(duì)象有效地保存起來,以供后續(xù)使用
    2021-09-09
  • Python?內(nèi)置函數(shù)sorted()的用法

    Python?內(nèi)置函數(shù)sorted()的用法

    這篇文章主要介紹了Python?內(nèi)置函數(shù)sorted()的用法,文章內(nèi)容介紹詳細(xì)具有一的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-03-03
  • python3 拼接字符串的7種方法

    python3 拼接字符串的7種方法

    本文給大家羅列了python3拼接字符串的七種方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-09-09

最新評(píng)論