若有任何學習問題,能夠添加做者微信:lockingfreehtml
Python接口測試實戰1(上)- 接口測試理論 Python接口測試實戰1(下)- 接口測試工具的使用 Python接口測試實戰2 - 使用Python發送請求 Python接口測試實戰3(上)- Python操做數據庫 Python接口測試實戰3(下)- unittest測試框架 Python接口測試實戰4(上) - 接口測試框架實戰 Python接口測試實戰4(下) - 框架完善:用例基類,用例標籤,從新運行上次失敗用例 Python接口測試實戰5(上) - Git及Jenkins持續集成 Python接口測試實戰5(下) - RESTful、Web Service及Mock Serverpython
更多學習資料請加QQ羣: 822601020獲取git
參考:unittest官方文檔github
爲何要使用unittest? 在編寫接口自動化用例時,咱們通常針對一個接口創建一個.py文件,一條測試用例封裝爲一個函數(方法),可是在批量執行的過程當中,若是其中一條出錯,後面的用例就沒法執行。使用測試框架能夠互不影響的用例執行及更靈活的執行控制數據庫
unittest特色json
unittest幾大組成部分api
test_user_login.py
test_user_login.py
# 文件必須test_開頭瀏覽器
import unittest # 導入unittest import requests class TestUserLogin(unittest.TestCase): # 類必須Test開頭,繼承TestCase才能識別爲用例類 url = 'http://115.28.108.130:5000/api/user/login/' def test_user_login_normal(self): # 一條測試用例,必須test_開頭 data = {"name": "張三", "password": "123456"} res = requests.post(url=self.url, data=data) self.assertIn('登陸成功', res.text) # 斷言 def test_user_login_password_wrong(self): data = {"name": "張三", "password": "1234567"} res = requests.post(url=self.url, data=data) self.assertIn('登陸失敗', res.text) # 斷言 if __name__ == '__main__': # 若是是直接從當前模塊執行(非別的模塊調用本模塊) unittest.main(verbosity=2) # 運行本測試類全部用例,verbosity爲結果顯示級別
用例執行順序:並不是按書寫順序執行,而是按用例名ascii碼前後順序執行微信
用例斷言 unittest提供了豐富的斷言方法,經常使用爲如下幾種:網絡
示例:
import unittest case = unittest.TestCase() case.assertEqual(1,2.0/2) # 經過1=2.0/2 case.assertEqual(1, True) # 經過 case.assertIs(1.0, 2.0/2) # 失敗,不是同一對象 case.assertListEqual([1,2],[1,2]) # 經過(順序要一致) case.assertDictEqual({"a":1,"b":2},{"b":2,"a":1}) # 經過,字典本無序 case.assertIsNone({}) # 失敗 case.assertFalse({}) # 經過,空字典爲False case.assertIn("h","hello") # 經過 case.assertGreater(3,2) # 經過,3>2 case.assertIsInstance({"a":1}, dict) # 經過
斷言是unittest.TestCase的一種方法,經過斷言判斷用例是否經過(Pass/Fail)
Test Fixtures(用例包裹方法) Test Fixtures即setUp(用例準備)及tearDown(測試清理)方法,用於分別在測試前及測試後執行
按照不一樣的做用範圍分爲:
import unittest def setUpModule(): # 當前模塊執行前只執行一次 print('=== setUpModule ===') def tearDownModule(): # 當前模塊執行後只執行一次 print('=== tearDownModule ===') class TestClass1(unittest.TestCase): @classmethod # 聲明爲類方法(必須) def setUpClass(cls): # 類方法,注意後面是cls,整個類只執行一次 print('--- setUpClass ---') @classmethod def tearDownClass(cls): print('--- tearDownClass ---') def setUp(self): # 該類中每一個測試用例執行一次 print('... setUp ...') def tearDown(self): print('... tearDown ...') def test_a(self): # 測試用例 print("a") def test_B(self): # 大寫B的ascii比小寫a靠前,會比test_a先執行 print("B") class TestClass2(unittest.TestCase): # 該模塊另外一個測試類 def test_A(self): print("A") if __name__ == '__main__': unittest.main()
執行結果:
=== setUpModule === --- setUpClass --- ... setUp ... B ... tearDown ... ... setUp ... a ... tearDown ... --- tearDownClass --- A === tearDownModule === ... ---------------------------------------------------------------------- Ran 3 tests in 0.001s OK
完整的接口測試用例 一條完整的測試接口用例須要包含:
test_user_reg.py
import unittest import requests from db import * # 導入db.py文件,源碼見上篇 # 數據準備 NOT_EXIST_USER = '范冰冰' EXIST_USER = '張三' class TestUserReg(unittest.TestCase): url = 'http://115.28.108.130:5000/api/user/reg/' def test_user_reg_normal(self): # 環境檢查 if check_user(NOT_EXIST_USER): del_user(NOT_EXIST_USER) # 發送請求 data = {'name': NOT_EXIST_USER, 'password': '123456'} res = requests.post(url=self.url, json=data) # 指望響應結果,注意字典格式和json格式的區別(若是有true/false/null要轉化爲字典格式) except_res = { "code": "100000", "msg": "成功", "data": { "name": NOT_EXIST_USER, "password": "e10adc3949ba59abbe56e057f20f883e" } } # 響應斷言(總體斷言) self.assertDictEqual(res.json(), except_res) # 數據庫斷言 self.assertTrue(check_user(NOT_EXIST_USER)) # 環境清理(因爲註冊接口向數據庫寫入了用戶信息) del_user(NOT_EXIST_USER) def test_user_reg_exist(self): # 環境檢查 if not check_user(EXIST_USER): add_user(EXIST_USER) # 發送請求 data = {'name': EXIST_USER, 'password': '123456'} res = requests.post(url=self.url, json=data) # 指望響應結果,注意字典格式和json格式的區別(若是有true/false/null要轉化爲字典格式) except_res = { "code": "100001", "msg": "失敗,用戶已存在", "data": { "name": EXIST_USER, "password": "e10adc3949ba59abbe56e057f20f883e" } } # 響應斷言(總體斷言) self.assertDictEqual(res.json(), except_res) # 數據庫斷言(沒有註冊成功,數據庫沒有添加新用戶) # 環境清理(無需清理) if __name__ == '__main__': unittest.main(verbosity=2) # 運行全部用例
除了使用unittest.main()運行整個測試類以外,咱們還能夠經過TestSuite來靈活的組織要運行的測試集
import unittest from test_user_login import TestUserLogin from test_user_reg import TestUserReg # 從上面兩個例子裏導入測試類 suite = unittest.TestSuite() suite.addTest(TestUserLogin('test_user_login_normal')) # 添加單個用例 suite.addTests([TestUserReg('test_user_reg_normal'),TestUserReg('test_user_reg_exist')]) # 添加多個用例 # 運行測試集 unittest.TextTestRunner(verbosity=2).run(suite) # verbosity顯示級別,運行順序爲添加到suite中的順序
import unittest from test_user_login import TestUserLogin suite1 = unittest.makeSuite(TestUserLogin, 'test_user_login_normal') # 使用測試類的單條用例製做測試集 suite2 = unittest.makeSuite(TestUserLogin) # 使用整個測試類製做測試集合(包含該測試類全部用例) unittest.TextTestRunner(verbosity=2).run(suite1)
improt unittest from test_user_login import TestUserLogin suite = unittest.TestLoader().loadTestsFromTestCase(TestUserLogin) # 加載該測試類全部用例並生成測試集 unittest.TextTestRunner(verbosity=2).run(suite)
import unittest suite = unittest.defaultTestLoader.discover("./") # 遍歷當前目錄及子包中全部test_*.py中全部unittest用例 unittest.TextTestRunner(verbosity=2).run(suite)
注意:
__init__.py
文件,及應爲的Python包import unittest from test_user_login import TestUserLogin suite1 = unittest.TestSuite() suite1.addTest(TestUserLogin('test_user_login_normal')) suite2 = makeSuite(TestUserLogin, 'test_user_login_password_wrong') suite = unittest.TestSuite([suite1, suite2]) # 將兩個測試集組合爲一個 unittest.TextTestRunner(verbosity=2).run(suite)
生成文本報告
import unittest suite = unittest.defaultTestLoader.discover("./") # 輸出測試結果到文本文件 with open("result.txt","w") as f: unittest.TextTestRunner(stream=f,verbosity=2).run(suite) # 將輸出流stream輸出到文件
生成HTML報告
run_all.py
import unittest from HTMLTestReportCN import HTMLTestRunner suite = unittest.defaultTestLoader.discover("./") f = open("report.html", 'wb') # 二進制寫格式打開要生成的報告文件 HTMLTestRunner(stream=f,title="Api Test",description="測試描述",runner="卡卡").run(suite) f.close()
源碼下載連接:https://pan.baidu.com/s/1gXwYOCL6BfRW4XVgxkCpIA 密碼:jdgo
此爲北京龍騰育才 Python高級自動化(接口測試部分)授課筆記 課程介紹 想要參加現場(北京)/網絡課程的能夠聯繫做者微信:lockingfree
- 高效學習,快速掌握Python自動化全部領域技能
- 同步快速解決各類問題
- 配套實戰項目練習