好久沒寫博客了,最近在給朋友講介面自動化,順便記錄一下,以便后面復習用,目前是打算用兩三個月的時間來寫整個Python介面自動框架從0到1的搭建程序,以及實際作業中介面框架是怎么用的,好了,現在就開始搞吧,
我們在學習任何技術之前都要弄清楚幾個問題,這樣會更方便理解,
1、什么是單元測驗?
按照階段來分,一般就是單元測驗,集成測驗,系統測驗,驗收測驗,單元測驗是對單個模塊、單個類或者單個函式進行測驗,
將訪問介面的程序封裝在函式里面;
介面測驗就變成了單元測驗;
單元測驗就是通過傳參,對某個模塊、某個類、某個函式進行結果輸出后驗證的測驗,
2、為什么要做單元測驗?
1).單元測驗之后,才是集成測驗,單個的功能模塊測驗通過之后,才能把單個功能模塊集成起來做集成測驗,為了從底層發現bug,減少合成后出現的問題,
2).越早發現bug越好,否則問題累計到后期,如果做錯了就要推倒重來,對于時間和人力成本來說非常耗費精力,
對于我們測驗來說:單元測驗是為了執行測驗用例,
3、怎么做單元測驗?
Python里有兩個單元測驗類:
1.Unittest(Python自帶);
2.Pytest(第三方庫,需要下載安裝);
unittest多用于介面自動化專案用,pytest多用于WEB自動化專案、APP自動化專案,
4、unittest簡介
unittest是Python自帶的單元測驗框,具備撰寫用例、組織用例、執行用例、輸出報告等自動化框架的條件,可以用來作自動化測驗框架的用例組織執行框架,
unittest框架的特性:
1)提供用例組織與執行:當測驗用例只有幾條的時候可以不考慮用例的組織,但是當測驗用例數量較多時,此時就需要考慮用例的規范與組織問題,unittest單元測驗框架就是用來解決這個問題的,
2)提供豐富的斷言方法:既然是測驗,就有一個預期結果和實際結果的比較問題,比較就是通過斷言來實作,unittest單元測驗框架提供了豐富的斷言方法,通過捕獲回傳值,并且與預期值進行比較,從而得出測驗通過與否,
3)提供豐富的日志:每一個失敗用例我們都希望知道失敗的原因,所有用例執行結束我們有希望知道整體執行情況,比如總體執行時間,失敗用例數,成功用例數,unittest單元測驗框架為我們提供了這些資料,
4、unittest組成
unittest單元測驗中最核心的四個部分是:TestCase(測驗用例),TestSuite(測驗套件),TestRunner(測驗運行器),TestFixture(測驗環境資料準備和清理),
1)TestCase(測驗用例):一個TestCase的實體就是一個測驗用例,什么是測驗用例呢?就是一個完整的測驗流程,包括測驗前準備環境的搭建(setUp)、實作測驗程序的代碼(run),以及測驗后環境的還原(tearDown),單元測驗(Unittest)的本質也就在這里,一個測驗用例就是一個完整的測驗單元,通過運行這個測驗單元,可以對某一個功能進行驗證,
2)TestSuite(測驗套件):一個功能的驗證往往需要多個測驗用例,可以把多個測驗用例集合在一起執行,這就產生了測驗套件TestSuite的概念,TestSuite用來組裝單個測驗用例,可以通過addTest加載TestCase到TestSuite中,從而回傳一個TestSuite實體,而且TestSuite也可以嵌套TestSuite,
3)TestLoader(測驗用例加載器):用來加載TestCase到TestSuite中的,其中loadTestsFrom__()方法用于尋找TestCase,并創建它們的實體,然后添加到TestSuite中,回傳TestSuite實體;
4)TextTestRunner(執行測驗用例):用來執行測驗用例,其中run(test)會執行TestSuite/TestCase中的run(result)方法,并將測驗結果保存到TextTestResult實體中,包括運行了多少測驗用例,成功多少,失敗多少等資訊;
5)Test Fixture(測驗環境資料準備和清理):一個測驗用例的初始化準備及環境還原,主要是setUp() 和 tearDown()方法;比如說在測驗用例中需要訪問資料庫,那么可以在setUp()中建立資料庫連接以及進行一些初始化,在tearDown()中清除在資料庫中產生的資料,然后關閉連接,注意tearDown的程序很重要,要為以后的TestCase留下一個干凈的環境,
5、實作思路
1)匯入unittest模塊、 被測檔案或者其中的類;
2)創建一個測驗類,并繼承unittest.TestCase方法;
3)重寫setUp和tearDown方法(如果有初始化條件和結束條件),若setup()成功運行,無論測驗方法是否成功,都會運行tearDown ();
4)定義測驗函式,函式名以test_開頭,以識別測驗用例;
5)呼叫unittest.main()方法運行測驗用例;
6)用例執行后,需要判斷用例是Pass還是Fail,可以用unittest.TestCase模塊的:斷言
斷言就是比對預期結果,如果不加斷言,沒有結果對比,需要手動去檢查運行的結果是否符合預期
前面5個模塊百度都有,目的主要就是為了讓那些手懶和不怎么會用百度的小伙伴不用自己百度了,接下來就是要敲代碼來實作了,
6、使用介紹
前面我們提到過,unittest是Python自帶的單元測驗框架,所以無需下載,直接import unittest就可以
import unittest
# 我們先列印一下unittest的原始碼
print(help(unittest))
# 粘貼出原始碼里面提供的例子,然后我們總結一下每行代碼的意思
# Simple
# usage:
# import unittest 1、使用unittest前,需匯入unittest框架
# 2、IntegerArithmeticTestCase這個類必須繼承unittest.TestCase,TestCase類,所有測驗用例類繼承的基類
class IntegerArithmeticTestCase(unittest.TestCase):
# 3、類內的方法必須以test開頭,比如testAdd或者test_Add
def testAdd(self): # test method names begin with 'test'
# 4、斷言:assertEqual用來斷言預期結果和實際結果是否一致,當然unittest還包含很多其他斷言方法,后面統一介紹
self.assertEqual((1 + 2), 3)
self.assertEqual(0 + 1, 1)
# 測驗用例
def testMultiply(self):
self.assertEqual((0 * 10), 0)
self.assertEqual((5 * 8), 40)
# 5、用例執行順序,在代碼中不是寫在前面的方法就先執行,如果把testMultiply放在testAdd方法之前,也是先執行testAdd方法,這是因為unittest執行測驗用例,默認是根據ASCII碼的順序加載測驗用例,數字與字母的順序為:0-9,A-Z,a-z,
if __name__ == '__main__':
# unittest.main()是運行主函式
unittest.main(verbosity=2)
# 6、verbosity是一個選項,表示測驗結果的資訊復雜度,有0、1、2 三個值,verbosity=0 : 你只能獲得測驗用例數總的結果;verbosity=1 (默認模式): 在每個成功的用例前面有個“.”,表示通過, 每個失敗的用例前面有個 “F”,faild表示失敗;verbosity=2 (詳細模式):測驗結果會顯示每個測驗用例的所有相關的資訊,
看一下運行結果

7、測驗用例里面的setUp函式與tearDown函式的使用:
import unittest
# 我們先列印一下unittest的原始碼
#print(help(unittest))
# 粘貼出原始碼里面提供的例子,然后我們總結一下每行代碼的意思
# Simple
# usage:
# import unittest 1、使用unittest前,需匯入unittest框架
# 2、IntegerArithmeticTestCase這個類必須繼承unittest.TestCase,TestCase類,所有測驗用例類繼承的基類
class IntegerArithmeticTestCase(unittest.TestCase):
# setUp函式:初始化環境(執行每條用例之前,都要執行setUp函式下面的代碼,每次都要執行)
# 前置條件,測驗方法之前自動運行setup里面的代碼,比如在介面自動化中需要先登錄的介面就需要頻繁獲取cookie,這樣很不方便,所以就可以把獲取cookie的方法寫在setup里面
def setUp(self):
print("用例執行前置條件")
# tearDown函式:清洗環境(執行每條用例之后,都要執行tearDown函式下面的代碼,每次都要執行)
# 后置條件,測驗方法之后自動運行teardown里面的代碼,比如在介面自動化中清理跑完一條case在資料庫里產生的垃圾資料就可以寫在teardown里面
def tearDown(self):
print("用例執行后置條件")
# 3、類內的方法必須以test開頭,比如testAdd或者test_Add
def testAdd(self): # test method names begin with 'test'
# 4、斷言:assertEqual用來斷言預期結果和實際結果是否一致,當然unittest還包含很多其他斷言方法,后面統一介紹
self.assertEqual((1 + 2), 3)
self.assertEqual(0 + 1, 1)
print("我是第一個方法")
# 測驗用例
def testMultiply(self):
self.assertEqual((0 * 10), 0)
self.assertEqual((5 * 8), 40)
print("我是第二個方法")
# 5、用例執行順序,在代碼中不是寫在前面的方法就先執行,如果把testMultiply放在testAdd方法之前,也是先執行testAdd方法,這是因為unittest執行測驗用例,默認是根據ASCII碼的順序加載測驗用例,數字與字母的順序為:0-9,A-Z,a-z,
if __name__ == '__main__':
# unittest.main()是運行主函式
unittest.main(verbosity=2)
# verbosity是一個選項,表示測驗結果的資訊復雜度,有0、1、2 三個值,verbosity=0 : 你只能獲得測驗用例數總的結果;verbosity=1 (默認模式): 在每個成功的用例前面有個“.”,表示通過, 每個失敗的用例前面有個 “F”,faild表示失敗;verbosity=2 (詳細模式):測驗結果會顯示每個測驗用例的所有相關的資訊,

看列印結果我們很容易就能看出來setup和teardown在什么時候執行
注意:若 setUp() 成功運行,無論測驗方法是否成功,都會運行 tearDown()
setUp()、tearDown()是TestCase里的方法,寫在測驗類中,就是方法的重寫
8、setUpClass函式與tearDownClass函式的使用:
import unittest
# 2、IntegerArithmeticTestCase這個類必須繼承unittest.TestCase,TestCase類,所有測驗用例類繼承的基類
class IntegerArithmeticTestCase(unittest.TestCase):
# @classmethod 裝飾器,根據名字就知道是類方法,在類運行之前運行,先知道這種用法就行,后面會單獨講一下裝飾器的用法
@classmethod
# 當類中的測驗方法被執行前會被呼叫的一個類方法,該方法只會在類方法前呼叫,也就是帶有calssmethod裝飾器并且沒有其他引數的方法,
def setUpClass(cls):
print("測驗類之前運行")
@classmethod
# 當類測驗方法被執行完后會被呼叫的一個類方法,該方法只會在一個類的所有方法執行完成后呼叫,該方法被呼叫時,必須有calssmethod裝飾器并且除了類以外沒有其他引數的方法
def tearDownClass(cls):
print("測驗類之后運行")
# setUp函式:初始化環境(執行每條用例之前,都要執行setUp函式下面的代碼,每次都要執行)
# 前置條件,測驗方法之前自動運行setup里面的代碼,比如在介面自動化中需要先登錄的介面就需要頻繁獲取cookie,這樣很不方便,所以就可以把獲取cookie的方法寫在setup里面
def setUp(self):
print("用例執行前置條件")
# tearDown函式:清洗環境(執行每條用例之后,都要執行tearDown函式下面的代碼,每次都要執行)
# 后置條件,測驗方法之后自動運行teardown里面的代碼,比如在介面自動化中清理跑完一條case在資料庫里產生的垃圾資料就可以寫在teardown里面
def tearDown(self):
print("用例執行后置條件")
# 3、類內的方法必須以test開頭,比如testAdd或者test_Add
def testAdd(self): # test method names begin with 'test'
# 4、斷言:assertEqual用來斷言預期結果和實際結果是否一致,當然unittest還包含很多其他斷言方法,后面統一介紹
self.assertEqual((1 + 2), 3)
self.assertEqual(0 + 1, 1)
print("我是第一個方法")
# 測驗用例
def testMultiply(self):
self.assertEqual((0 * 10), 0)
self.assertEqual((5 * 8), 40)
print("我是第二個方法")
if __name__ == '__main__':
# unittest.main()是運行主函式
unittest.main(verbosity=2)
看一下運行結果,一目了然,哈哈

9、運行方式
1)第一種直接右鍵運行

2)第二種命令列運行
unittest 模塊可以通過命令列運行模塊、類和獨立測驗方法的測驗:
python -m unittest test_unittest
python -m unittest test_unittest.TestClass
python -m unittest test_unittest.TestClass.testAdd
同樣的,測驗模塊可以通過檔案路徑指定,這也是我常用的一種方式,我們下面就以這種方式執行
我的目錄:
在pycharm下面的Terminal使用命令列python -m unittest test_unittest/t1.py

在運行測驗時,你可以通過添加 -v 引數獲取更詳細(更多的冗余)的資訊:
python -m unittest -v test_module
當運行時不包含引數,開始 探索性測驗:
python -m unittest
用于獲取命令列選項串列:
python -m unittest -h
10、測驗套件TestSuit(也叫測驗集):
1)第一種往測驗套件添加測驗用例的方式
import unittest
# 匯入t1模塊的類
from test_unittest.t1 import IntegerArithmeticTestCase
# TestSuite這個類代表一個測驗用例或測驗套件的集合,該類描述了一個可以被test runner執行的介面,通過它可以執行任何測驗,運行一個TestSuite就相當于將測驗套件迭代,然后執行每一個測驗
suite = unittest.TestSuite()
# IntegerArithmeticTestCase下的測驗用例
cases= [IntegerArithmeticTestCase('testAdd'),
IntegerArithmeticTestCase('testMultiply')]
# 往套件里添加測驗用例 注意:是addTests,不是addTest,addTest是添加一條測驗用例
suite.addTests(cases)
# 運行,生成測驗報告,我們先生成txt格式的,使用unittest自帶的TextTestRunner生成測驗報告(文本格式,不推薦使用)
with open('demo.txt','w',encoding='utf-8') as f:
# 初始化runner runner可以理解為運行器
runner = unittest.TextTestRunner(f)
# run()方法是TextTestRunner主要的公共介面,需要一個TestSuite或者TestCase實體作為引數
runner.run(suite)
運行,會在當前目錄下(也就是和t2同一目錄)自動生成demo.txt檔案,如果存在,不會重新生成,會覆寫之前的內容

看到生成demo.txt檔案,兩個…就代表兩條測驗用例通過
我們在故意改錯一個看看結果,把40改為4

在運行看一下結果

可以看到果然是覆寫,沒有忽悠你們,哈哈,F代表失敗,失敗的原因會在下面顯示出來
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/256389.html
標籤:python
上一篇:機器學習 聚類篇——DBSCAN的引數選擇及其應用于離群值檢測
下一篇:藍橋杯 擴散python實作
