在實(shí)際工作中栖博,我們利用單元測(cè)試框架就可以完全搞定接口測(cè)試。單元測(cè)試(unittesting),是指對(duì)軟件中的最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證穷躁,這里的最小可測(cè)試單元通常是指函數(shù)或者類(lèi)。單元測(cè)試是即所謂的白盒測(cè)試因妇,一般由開(kāi)發(fā)人員負(fù)責(zé)測(cè)試问潭,因?yàn)殚_(kāi)發(fā)人員知道被測(cè)試的軟件如何完成功能和完成什么樣的功能。在python中unittest婚被、pytest模塊就是單元測(cè)試的一種具體表現(xiàn)形式狡忙。
單元測(cè)試的范圍
???????接口功能測(cè)試
???????邊界條件測(cè)試
???????所有獨(dú)立執(zhí)行通路測(cè)試
???????各條錯(cuò)誤處理通路測(cè)試
???????靜態(tài)代碼分析
其中,前兩項(xiàng)接口功能測(cè)試和邊界條件測(cè)試就是我們熟知的接口測(cè)試址芯!而對(duì)于后三項(xiàng)通常都是開(kāi)發(fā)人員通過(guò)工具輔助自測(cè)完成的灾茁,常用的工具括:Sonar、PMD谷炸、FindBugs北专、Checkstyle、Jacoco等等(好多工具都集成到IDE中淑廊,開(kāi)發(fā)人員使用非常方便)逗余。
單元測(cè)試引入的原因
單元測(cè)試提供快速反饋,把bug消滅在開(kāi)發(fā)階段季惩,減少問(wèn)題流到集成測(cè)試录粱、驗(yàn)收測(cè)試和用戶(hù)腻格,降低了軟件質(zhì)量控制的成本。
不同的開(kāi)發(fā)語(yǔ)言都有對(duì)應(yīng)的單元測(cè)試框架
Java?????????Junit3\Junit4\Junit5\TestNG
Python????????unittest\pytest
C++??????????CppUnit
.net??????? ? Nunit
JavaScript?? ??? Qunit
接口測(cè)試在單元測(cè)試中的應(yīng)用
我們以u(píng)nittest為例講解啥繁,unittest是Python單元測(cè)試框架菜职,類(lèi)似于JUnit框架∑烀觯基本用法如下:
1)import unittest
2)定義一個(gè)繼承自u(píng)nittest.TestCase的測(cè)試用例類(lèi)
3)定義setUp和tearDown酬核,在每個(gè)測(cè)試用例前后做一些輔助工作。
4)定義測(cè)試用例适室,名字以test開(kāi)頭
5)一個(gè)測(cè)試用例應(yīng)該只測(cè)試一個(gè)方面嫡意,測(cè)試目的和測(cè)試內(nèi)容應(yīng)很明確。主要是調(diào)用assertEqual捣辆、assertRaises等斷言方法判斷程序執(zhí)行結(jié)果和預(yù)期值是否相符蔬螟。
6)調(diào)用unittest.main()啟動(dòng)測(cè)試
下面舉個(gè)實(shí)例,來(lái)看看unittest如何測(cè)試一個(gè)簡(jiǎn)單的函數(shù)
測(cè)一個(gè)簡(jiǎn)單的加法接口
def add(a, b):
?????? return a + b
import unittest
class TestAddFunc (unittest.TestCase):
?????? def test_add1(self):
????????????? self.assertEqual (3, add (1, 2))
?????? def test_add2(self):
?????????????? self.assertEqual (4, add (1, 1))
if __name__ == '__main__':
??? unittest.main ()
在pycharm中運(yùn)行汽畴,結(jié)果如下:
把校驗(yàn)get請(qǐng)求的接口測(cè)試代碼移植到unittest中
源碼:
import requests
import json
req="http://rap2api.taobao.org/app/mock/85630/getinfo"
response=requests.get(req)
print(response.text)
code=json.loads(response.text).get('code')
print(code)
if code <=10:
????? print ("reponse ok")
else:
????? print("reponse fail")
移植后的代碼
import requests
import json
import unittest
class TestGetFunc (unittest.TestCase):
???? def test_1(self):
??????? req ="http://rap2api.taobao.org/app/mock/85630/getinfo"
??????? response = requests.get(req)
???????? print(response.text)
??????? code = json.loads(response.text).get('code')
??????? self.assertLessEqual(code, 10)
if __name__ == '__main__':
??? unittest.main()
通過(guò)代碼實(shí)現(xiàn)接口測(cè)試非常的簡(jiǎn)單旧巾,他幫我們定義了用例的規(guī)則(test開(kāi)頭的方法就是測(cè)試用例),給我們提供了斷言assertLessEqual(用來(lái)判斷用例的通過(guò)與否)忍些,代碼執(zhí)行后提供了測(cè)試執(zhí)行的結(jié)果鲁猩!
斷言
在測(cè)試框架中都是通過(guò)斷言來(lái)判定用例通過(guò)與否的(比if...else..方便很多),unittest中提供很多方法進(jìn)行斷言相關(guān)操作罢坝,具體如下:
基礎(chǔ)斷言
exceptions, warnings, 日志信息斷言
特殊斷言
集合斷言
當(dāng)然這只是最簡(jiǎn)單的demo實(shí)例廓握,目的是教大家入門(mén)!unittest中還有很多強(qiáng)大的功能來(lái)支持我們做單元測(cè)試工作炸客,由于本文是針對(duì)小白疾棵,所以這里就不再詳細(xì)介紹了戈钢!如果你想了解更多關(guān)于python單元測(cè)試的知識(shí)可以閱讀下面兩篇文章:
原創(chuàng)不易痹仙,如果文章幫到了你,歡迎轉(zhuǎn)發(fā)殉了,讓更多的朋友受益开仰!