python3+unittest+ddt+excel+jenkins接口自動化測試講解(一)

Hello,好久沒更新了,今天跟大家一起來學習下基於unittest的接口自動化測試,先給大家看下最終的unittest框架目錄結構:

這裏大家需要下載的第三方庫分別是:

pip3 install requests/pip3 install ddt/pip3 install openpyxl/pip3 install mysql-connector/pip3 install unittest

可能會有些許的遺漏,具體大家在寫的時候,如果發現第三方沒有,自己再安裝下。

(一:)接下來,我們先來學習下這個第三方庫:requests,這個庫可以通過接口的請求方式來做接口的觸發,主要是協助完成http請求,這裏主要介紹我們常見的兩種請求方式:get/post,直接上代碼(下面這段代碼小夥伴們可以拿來直接練手):

import requests,json
url='http://web.juhe.cn:8080/constellation/getAll'
body={
    "key":"921d7e156beff25d4d61c407ea345fdb",
    "consName":"雙魚座",
    "type":"today"
}
response_get=requests.get(url,params=body)
print('響應狀態碼:',response_get.status_code)
print('響應文本:',response_get.text)
print('響應頭:',response_get.headers)
print('----------------------------------------')
response_post=requests.post(url,data=body)
print('響應狀態碼:',response_post.status_code)
print('響應文本:',response_post.text)
print('響應頭:',response_post.headers)

輸出的結果:
響應頭: {'Server': 'nginx', 'Date': 'Tue, 28 Apr 2020 02:52:42 GMT', 'Content-Type': 'text/html;charset=UTF-8', 'Content-Length': '490', 'Connection': 'keep-alive', 'Set-Cookie': 'JSESSIONID=B85EFCBD82811C355C48DCCD84F87013; Path=/constellation; HttpOnly'}
響應狀態碼: 200
響應正文: {"date":20200428,"name":"雙魚座","QFriend":"雙子座","color":"橘色","datetime":"2020年04月28日","health":"60","love":"70","work":"60","money":"60","number":9,"summary":"今天自己會很想組織一個聚會,反正會想各種懶散。不過今天要注意下人際交往,今天自己的想法不太容易被他人重視,不過自己也不是那麼計較。今天在人際或是活動中也容易遇到豬隊友影響心情。","all":"80","resultcode":"200","error_code":0}
----------------------------------------
響應頭: {'Server': 'nginx', 'Date': 'Tue, 28 Apr 2020 02:52:42 GMT', 'Content-Type': 'text/html;charset=UTF-8', 'Content-Length': '490', 'Connection': 'keep-alive', 'Set-Cookie': 'JSESSIONID=48C75CAE9ECFF8B55505A72ABB8EDCDD; Path=/constellation; HttpOnly'}
響應狀態碼: 200
響應正文: {"date":20200428,"name":"雙魚座","QFriend":"雙子座","color":"橘色","datetime":"2020年04月28日","health":"60","love":"70","work":"60","money":"60","number":9,"summary":"今天自己會很想組織一個聚會,反正會想各種懶散。不過今天要注意下人際交往,今天自己的想法不太容易被他人重視,不過自己也不是那麼計較。今天在人際或是活動中也容易遇到豬隊友影響心情。","all":"80","resultcode":"200","error_code":0}

這裏需要跟大家說明的是:我這裏沒有上送請求頭,有些接口是需要上送請求頭headers的,所以如果有請求頭,需要注意的是請求頭裏是否有如下的頭信息:

header={
    "Content-Type": "application/json"
}

如果請求頭裏已經表明json,那麼我們在發接口的時候,請求體body裏面需要轉換下類型,主要是把dict轉成json,可以使用json.dumps(),另外把json轉成dict,可以使用json.loads()

(二:)接下來,我們來學習下unittest框架,這個框架我個人覺得,如果公司的接口與接口之間依賴性不是很高的,那用這個框架還是可以的,如果依賴性很高,那用起來會有些許的不方便,反而用其他一些工具效率來的更高,比如:jmeter、postman,這裏的依賴性很高,指得是上一個接口應答報文的某個值是下一個請求報文的入參,所以我們需要對接口做相應的關聯。

先來學習下unittest框架的基本結構:

import unittest
class TestDemo(unittest.TestCase):
    @classmethod
    def setUpClass(cls)->None:
        print('1')
    def setUp(self)->None:
        print('2')
    def tearDown(self)->None:
        print('3')
    @classmethod
    def tearDownClass(cls)->None:
        print('4')
    def test_01(self):
        print('第一個測試案例')
    def test_02(self):
        print('第二個測試案例')

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

輸出的結果:
    1
    2
    第一個測試案例
    3
    2
    第二個測試案例
    3
    4
    

這裏需要說明下:首先測試案例必須以test開頭來命名,另外setUp()和tearDown是對於每條測試案例執行前每次都要執行一邊,簡單說就是你有多少條測試案例,就要在每條案例執行前先執行下setUp,案例結束之後每次都要執行一次tearDown,所以從結果可以看出案例執行之前會先輸出2,結束會輸出3

對於被裝飾器修飾的類方法,這個是針對所有的案例開始前setUpClass要執行一次,這裏不像setUp,只要執行測試案例它都要執行,同時tearDownClass是所有案例執行結束後執行一次,結合上面的輸出結果就很明顯了。

(三:)學完unittest,我們來看下測試報告的生成

unittest會自動生成測試報告,但是需要藉助第三方的一個報告模板HTMLTestRunner,需要把這個模板存放在python的安裝目錄的Lib目錄下,這個模板可以去官網下載。

下面介紹兩種加載測試用例的方法,一種是指向封裝測試用例的類,一種是指向封裝測試的模塊

#1:這是指向模塊的加載方法
import unittest
import HTMLTestRunner

suit=unittest.TestSuite()
loader=unittest.TestLoader()
suit.addTest(loader.loadTestsFromModule(test_case))#這裏的test_case是之前寫的unittest框架中的測試用例的文件名,需要先導入這個模塊

with open('test.html','wb',encoding='utf-8') as f:
    runner=HTMLTestRunner.HTMLTestRunner(
                                        stream=f,
                                        verbosity=2,
                                        title='測試報告',
                                        description='接口測試用例報告'
                                        )
    runner.run(suit)


#2:這是指向類的加載方法

suit=unittest.TestSuite()
loader=unittest.TestLoader()
suit.addTest(loader.loadTestsFromModule(test_case))#這裏的test_case是之前寫的unittest框架中的測試用例的文件名,需要先導入這個模塊
with open('test.html','wb',encoding='utf-8') as f:
    runner=HTMLTestRunner.HTMLTestRunner(
                                        stream=f,
                                        verbosity=2,
                                        title='測試報告',
                                        description='接口測試用例報告'
                                        )
    runner.run(suit)

#3:另外這裏介紹加載單個測試用例的方法
suit=unittest.TestSuite()
suit.addTest(Test_Mathmethod('test_01'))#這裏是某個類中的某個方法,所以之前需要導入這個類
with open('','wb',encoding='utf-8') as f:
    runner=HTMLTestRunner.HTMLTestRunner(
                                        stream=f,
                                        verbosity=2,
                                        title='測試報告',
                                        description='接口測試用例報告'
                                        )
    runner.run(suit)

下期介紹如何從excel中讀取數據,以及如何鏈接數據庫,管理我們的配置文件之類的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章