python+requests接口自動化測試實戰

環境說明:

1.WIN 7, 64位
2.Python3.4.3 (pip-8.1.2)
3.Requests —>pip install requests
4.Unittest —>unittest 框架是python自帶的單元測試框架,python2.1及其之後的版本已將unittest做爲一個標準塊放入python開發包中,因此unittest不用單獨安裝。
5.測試報告利用HTMLTestRunner生成。html

測試思路:

一、先把每一個http接口一個一個寫腳本測試。(提交的json串直接放在data字典中,這裏沒有用到excel等寫測試用例,測試用例直接用腳本實現。)
二、寫完全部接口的測試腳本後,因爲一個接口有好幾個測試用例,全部要把同一個接口的py腳本封裝成方法,每個接口封裝成一個接口類。
三、用testsuite直接調用這些接口類,構造測試集;或利用unittest自動識別測試用例,TestLoader類中提供的discover()方法。
(命名規則:接口名稱要以test_XXX開頭)
就好把全部的接口測試用例連起來構建自動化測試了。
四、最後利用HTMLTestRunner生成測試報告。python

PUT:上傳指定的URL,通常是修改,能夠理解爲數據庫中的update。
DELETE:刪除指定資源。
在接口測試中,通常來講,post建立數據,get獲取建立成功後的全部數據和指定的數據,put能夠對建立成功後的數據
進行修改,delete是指定的資源。

 

目錄結構:mysql

 

 

單個接口測試例子:
post(修改)web

import requests
import json


def get_token():
    url1 = "https://**********/Token/get"
    content = {'appId':'***','appSecret':'******'}
    web = requests.get(url=url1,params=content)
    print(web.url)
    print(web.text)
    ty = web.text
    a = json.loads(ty)
    b = a.get('Data')
    apptoken = b.get('Token')
    return apptoken


if __name__ == '__main__':
    get_token()

 

get(查詢)面試

import requests  
import json  

def test_qualification_add():  
    url = "http://xxx.xxx.xxx/audit/api/xxx/get"    #測試的接口url  
    headers = {"Content-Type":"application/json"}     
    data = {                                        #接口傳送的參數  
        "token": "abcdefg",  
        "id": 1,  
        "param": {  
            "QuId":1    
        }  
    }  
    r = requests.post(url = url,json = data,headers = headers)    #發送請求  
    #return r.json  
    print (r.text)                                                #獲取響應報文  
    print (r.status_code)  

if __name__=="__main__":  
    test_qualification_add()  

 

requests.post和requests.request兩種寫法,均可以實現請求。sql

在進行接口測試的過程當中對傳入的參數進行邊界值測試、錯誤推導測試、等價類測試等測試方法進行測試。那麼一個接口就要設不少測試用例。數據庫

下面是封裝爲接口類的例子:
(一個接口地址一個類,每個方法是一條測試用例)
(setUp()、tearDown()方法會分別做用於每一個測試用例的開始和結束,若是每一個類中的setUp()、tearDown(),所作的事情同樣,那麼能夠封裝一個本身的測試類,如代碼:)json

 

import requests
import json
import unittest
class MyTest(unittest.TestCase):     #封裝測試環境的初始化和還原的類
    def setUp(self):                 #放對數據可操做的代碼,如對mysql、momgodb的初始化等,這裏不對數據庫進行操做!
        print("start test")
        pass
    def tearDown(self):             #與setUp()相對
        print("end test")
        pass
class test_xxx_get(MyTest):         #把這個接口封裝一個類,下面的方法是具體的測試用例
    '''接口名稱:獲取資質'''    #這個描述接口名稱
    def test_xxx_get(self):
        '''測試用例1:哈哈'''   #這個描述接口用例名稱
        self.url = "http://xxx.xxx.xxx/audit/api/xxx/get"  #請求url
        self.headers = {"Content-Type":"application/json"}
        self.data = {                            #請求參數
            "token": "abcdefg",
            "id": 1,
            "param": {
                "QuId": 14 
            }
        }    #self.用在方法屬性中,表示是該方法的屬性,不會影響其餘方法的屬性。                                     
        r = requests.post(url = self.url,json = self.data,headers = self.headers)
        #return r.json()
        print (self.r.text)
        print (self.r.status_code)
        self.assertIn("true",self.r.text)     #斷言判斷接口返回是否符合要求,能夠寫多個斷言!  

if __name__=="__main__":
    unittest.main()

 

unittest提供了全局的main()方法,使用它能夠方便的將一個單元測試木塊變成能夠直接運行的測試腳本;
main()方法使用TestLoader類來搜索全部包含在該木塊中以「test」命名開頭的測試方法,並自動執行它;api

執行方法的默認順序是:根據ASCII碼的順序加載測試用例,數字與字母的順序爲:0-9,A-Z,a-z。因此以A開頭的測試用例方法會優先執行,以a開頭會後執行。
因此每個接口類、測試用例要以test*命名,以下圖:
(測試用例放在同一個文件夾:)app

 

 

 

 

 

 runtest.py寫法:

import unittest
import json
import requests
from HTMLTestRunner import HTMLTestRunner
import time

#加載測試文件 (有幾多個接口就加載幾多個,一個一個加進來)
import test_creative_add
import test_creative_get
import test_qualification_add
import test_qualification_get
import test_qualification_reflesh

#構造測試集
suite = unittest.TestSuite() #實例化

#TestSuite類的addTest()方法把不一樣測試類中的測試方法組裝到測試套件中。
#增長測試用例==》接口文件名.接口類(方法也就是這個接口的其餘用例),要把每個測試用例都增長進來!!!

suite.addTest(test_creative_add.test_creative_add("test_creative_add")) #增長創意
suite.addTest(test_creative_get.test_creative_get("test_creative_get")) #獲取創意
suite.addTest(test_qualification_add.test_qualification_add("test_qualification_add"))#增長資質
suite.addTest(test_qualification_get.test_qualification_get("test_qualification_get"))#獲取資質
suite.addTest(test_qualification_reflesh.test_qualification_reflesh("test_qualification_reflesh"))#更新資質
if __name__=="__main__": 
           testunit = unittest.TestSuite() 
           testunit.addTest(suite) 

           #按照必定的格式獲取當前的時間 
           now = time.strftime("%Y-%m-%d %H_%M_%S")

           #定義報告存放路徑   
           filename = './' + now + 'test_result.html'
           fp = open(filename,"wb") 

           #定義測試報告
           runner = HTMLTestRunner(stream = fp, 
                                   title = "xxx接口測試報告",
                                   description = "測試用例執行狀況:") 

           #運行測試 
           runner.run(testunit)
           fp.close()              #關閉文件對象把數據寫進磁盤

 

若是有幾百條測試用例,在runtest腳本中一個個增長測試用例,那麼就很麻煩啦,其實用discover()一步就搞掂了。
discover函數介紹:
discover(start_dir,pattern=’test.py’,top_level_dir=None)
找到指定目錄下全部測試模塊,並可遞歸查到子目錄下的測試木塊,只有匹配到的文件名纔會被加載。若是啓動的不是頂層目錄,那麼頂層目錄必然單獨指定。
start_dir:要測試的木塊名或測試用例的目錄。
pattent=‘test
.py’:表示用例文件名的匹配原則。此處匹配文件名一test開頭的全部.py類型文件,表示任意多個字符。
top_level_dir=None :測試木塊的頂層目錄,若是沒有頂層目錄,默認爲None。
這裏測試用例都放在同一個目錄,都以test
.py的形式!!(如上圖)

runtest2.py寫法:

import unittest
import json
import requests
from HTMLTestRunner import HTMLTestRunner
import time

#定義測試用例的目錄爲當前目錄
test_dir = './'
discover = unittest.defaultTestLoader.discover(test_dir,pattern = 'test*.py')

if __name__=="__main__":


    #按照必定的格式獲取當前的時間
    now = time.strftime("%Y-%m-%d %H-%M-%S")

    #定義報告存放路徑
    filename = './' + now + 'test_result.html'

    fp = open(filename,"wb")
    #定義測試報告
    runner = HTMLTestRunner(stream =  fp,
                            title = "xxx接口測試報告",
                            description = "測試用例執行狀況:")
    #運行測試
    runner.run(discover)
    fp.close() #關閉報告文件

 

 

 

 

 

 

 


整合自動化測試發送測試報告:
runtest_mail.py

import unittest
import requests
from HTMLTestRunner import HTMLTestRunner
import time
import os
import smtplib
from email.mime.text import MIMEText
from email.header import Header

#======定義發送郵件========
def send_mail(file_new):
    f = open(file_new,'rb')
    mail_body = f.read()
    f.close()

    msg = MIMEText(mail_body,'html','utf-8')
    msg['Subject'] = Header('xxx接口自動化測試報告','utf-8')

    smtp = smtplib.SMTP()
    smtp.connect('smtp.sina.com')
    smtp.login('xxx@sina.com','xxx336..')
    smtp.sendmail('xxx@sina.com','10xxx6@qq.com',msg.as_string())
    smtp.quit()
    print('郵件已發出!注意查收。')

#======查找測試目錄,找到最新生成的測試報告======
def new_report(test_report):
    lists = os.listdir(test_report)
    lists.sort(key=lambda fn:os.path.getmtime(test_report + '\\' + fn))
    file_new = os.path.join(test_report,lists[-1])
    print(file_new)
    return file_new

if __name__ == "__main__":
    test_dir = "D:\\dsp_testpro\\test_case"
    test_report = "D:\\dsp_testpro\\test_report"

    discover = unittest.defaultTestLoader.discover(test_dir,
                                                   pattern = 'test*.py')
    #按照必定的格式獲取當前的時間
    now = time.strftime("%Y-%m-%d_%H-%M-%S-")

    #定義報告存放路徑
    filename = test_report + "\\" + now + 'result.html'
    fp = open(filename,'wb')
    #定義測試報告
    runner = HTMLTestRunner(stream =  fp,
                            title = "xxx接口測試報告",
                            description = "測試用例執行狀況:")
    #運行測試
    runner.run(discover)
    fp.close() #關閉報告文件

    new_report = new_report(test_report)
    send_mail(new_report)

 

郵件以下:  

 

 

 

 

 

  瞭解更多,入咱們,642830685,免費領取最新軟件測試大廠面試資料和Python自動化、接口、框架搭建學習資料!技術大牛解惑答疑,同行一塊兒交流。

相關文章
相關標籤/搜索