1)寫用例 TestCase 2)執行用例 1:TestSuite存儲用例,2:TestLoader找用例,存儲用例,存放指定的TestSuite 3)對比實際結果/期望結果,判定用例是否通過#斷言Assert 4)出局測試報告TextTestRunner 1.測試類 import requests ...
1)寫用例 TestCase
2)執行用例 1:TestSuite存儲用例,2:TestLoader找用例,存儲用例,存放指定的TestSuite
3)對比實際結果/期望結果,判定用例是否通過#斷言Assert
4)出局測試報告TextTestRunner
1.測試類
import requests class HttpRequest(): def __init__(self, method, url, param=None, headers=None, cookie=None): self.method=method#method:請求方式 self.url=url#url:請求的url self.param=param#param:請求參數 self.headers=headers#headers:請求頭 self.cookie=cookie#cookie:請求的cookie值 def http_request(self): if self.method.lower()=="post": return requests.post(self.url,self.param) elif self.method.lower()=="get": return requests.get(self.url,self.param,headers=self.headers,cookies=self.cookie) else: print("請求方式錯誤:{0}".format(self.method))
2.TestCase/斷言/異常處理
import unittest#引入unittest框架 from test01.qabujiaban_class import HttpRequest#引入測試類 #編寫一個存儲測試用例的類 class TestHttp(unittest.TestCase):#用例類繼承unittest.TestCase用於編寫測試用例 #正確登陸測試用例 def test_login_yes(self):#測試用例函數必須test_開頭,否則框架無法識別當前是用例 login_url = "http://www.qabujiaban.com/user/login" data = {"username": "uuuu222都44", "password": "WJHasb124*1"} res = HttpRequest("Post", login_url, data).http_request() print("登陸響應文本:", res.json()) # try: self.assertEqual("0000", res.json()["code"]) # 斷言,期望值==實際值 except AssertionError as e: print("斷言錯誤異常拋出:{0}".format(e)) raise e#拋出異常 #錯誤登陸測試用例 def test_login_no(self): login_url = "http://www.qabujiaban.com/user/login" data = {"username": "uuuu222都44", "password": "123456"}#密碼錯誤 res = HttpRequest("Post", login_url, data).http_request() print("登陸響應文本:", res.json()) # try: self.assertEqual("0000", res.json()["code"]) # 斷言,期望值==實際值 except AssertionError as e: print("斷言錯誤異常拋出:{0}".format(e)) raise e#拋出異常 if __name__ == '__main__': unittest.main()#執行全部測試用例
執行結果: ============================= test session starts ============================= platform win32 -- Python 3.7.3, pytest-7.2.0, pluggy-1.0.0 rootdir: C:\Users\Administrator\PycharmProjects\demo\test01 plugins: html-3.2.0, metadata-2.0.4collected 2 items testdemo01.py [100%] ============================== 2 passed in 0.35s ============================== Process finished with exit code 0 .登陸響應文本: {'code': '0002', 'message': '登陸失敗,密碼錯誤'} .登陸響應文本: {'code': '0000', 'message': '登陸成功', 'login_time': '2022-59-19 11:12:04', 'create_time': '2021-23-28 04:12:19'}
註意:
執行結果中,E表示錯誤,F表示失敗, . 點表示成功
3.unittest.addTest()
import unittest from test01.demo_case import TestHttp#引入測試用例類 suite = unittest.TestSuite()#存儲器,存儲用例 #第一個用例 suite.addTest(TestHttp("test_login_yes"))#添加要執行的用例 #第二個用例 suite.addTest(TestHttp("test_login_no")) runner = unittest.TextTestRunner() runner.run(suite)#執行
執行結果: .登陸響應文本: {'code': '0000', 'message': '登陸成功', 'login_time': '2022-12-20 12:12:33', 'create_time': '2021-23-28 04:12:19'} 登陸響應文本: {'code': '0002', 'message': '登陸失敗,密碼錯誤'} . ---------------------------------------------------------------------- Ran 2 tests in 0.275s OK Process finished with exit code 0
4.loader.loadTestsFromTestCase()
import unittest from test01.demo_case import TestHttp#引入測試用例類 suite = unittest.TestSuite()#存儲器,存儲用例 # #第一個用例 # suite.addTest(TestHttp("test_login_yes"))#添加要執行的用例 # #第二個用例 # suite.addTest(TestHttp("test_login_no")) loader = unittest.TestLoader()#創建載入器 suite.addTest(loader.loadTestsFromTestCase(TestHttp))#通過類名載入 runner = unittest.TextTestRunner() runner.run(suite)#執行
執行結果: 登陸響應文本: {'code': '0002', 'message': '登陸失敗,密碼錯誤'} .. 登陸響應文本: {'code': '0000', 'message': '登陸成功', 'login_time': '2022-23-20 12:12:16', 'create_time': '2021-23-28 04:12:19'} ---------------------------------------------------------------------- Ran 2 tests in 0.288s OK Process finished with exit code 0
5.loader.loadTestFromModule()
import unittest # from test01.demo_case import TestHttp#引入測試用例類 from test01 import demo_case#引入模塊 suite = unittest.TestSuite()#存儲器,存儲用例 # #第一個用例 # suite.addTest(TestHttp("test_login_yes"))#添加要執行的用例 # #第二個用例 # suite.addTest(TestHttp("test_login_no")) loader = unittest.TestLoader()#創建載入器 # suite.addTest(loader.loadTestsFromTestCase(TestHttp))#通過類名載入 suite.addTest(loader.loadTestsFromModule(demo_case))#通過類名載入 runner = unittest.TextTestRunner() runner.run(suite)#執行
執行結果: .登陸響應文本: {'code': '0002', 'message': '登陸失敗,密碼錯誤'} . ---------------------------------------------------------------------- Ran 2 tests in 0.259s OK 登陸響應文本: {'code': '0000', 'message': '登陸成功', 'login_time': '2022-26-20 12:12:51', 'create_time': '2021-23-28 04:12:19'} Process finished with exit code 0
6.TextTestRunner()
import unittest # from test01.demo_case import TestHttp#引入測試用例類 from test01 import demo_case suite = unittest.TestSuite()#存儲器,存儲用例 # #第一個用例 # suite.addTest(TestHttp("test_login_yes"))#添加要執行的用例 # #第二個用例 # suite.addTest(TestHttp("test_login_no")) loader = unittest.TestLoader()#創建載入器 # suite.addTest(loader.loadTestsFromTestCase(TestHttp))#通過類名載入 suite.addTest(loader.loadTestsFromModule(demo_case))#通過類名載入 file = open(file="log.txt",mode="w",encoding="utf8") runner = unittest.TextTestRunner(stream=file,verbosity=2)#stream為日誌存儲路徑,verbosity=0/1/2 列印日誌的詳細等級,2最詳細 runner.run(suite)#執行 file.close()#關閉資源
執行結果:
7.上下文管理器with open()
import unittest # from test01.demo_case import TestHttp#引入測試用例類 from test01 import demo_case suite = unittest.TestSuite()#存儲器,存儲用例 # #第一個用例 # suite.addTest(TestHttp("test_login_yes"))#添加要執行的用例 # #第二個用例 # suite.addTest(TestHttp("test_login_no")) loader = unittest.TestLoader()#創建載入器 # suite.addTest(loader.loadTestsFromTestCase(TestHttp))#通過類名載入 suite.addTest(loader.loadTestsFromModule(demo_case))#通過類名載入 with open(file="log.txt",mode="w",encoding="utf8") as file:#執行完後自動關閉 runner = unittest.TextTestRunner(stream=file,verbosity=2)#stream為日誌存儲路徑,verbosity=0/1/2 列印日誌的詳細等級,2最詳細 runner.run(suite)#執行 #print(file.closed)#判斷狀態,True=關閉
執行結果與open()一致
8.HTMLTestRunnerNew
import unittest import HTMLTestRunnerNew#引入模板類 # from test01.demo_case import TestHttp#引入測試用例類 from test01 import demo_case suite = unittest.TestSuite()#存儲器,存儲用例 loader = unittest.TestLoader()#創建載入器 suite.addTest(loader.loadTestsFromModule(demo_case))#通過類名載入 with open(file="qabujiaban_report.html",mode="wb") as file:#執行完後自動關閉 runner = HTMLTestRunnerNew.HTMLTestRunner(stream=file, verbosity=2,title="這裡是標題",description="這裡寫描述",tester="這裡寫誰測試的") runner.run(suite)
生成報告:
9.setUp()&tearDown()
import unittest#引入unittest框架 from test01.qabujiaban_class import HttpRequest#引入測試類 #編寫一個存儲測試用例的類 class TestHttp(unittest.TestCase):#用例類繼承unittest.TestCase用於編寫測試用例 def setUp(self) -> None: print("每一條用例執行前執行...") def tearDown(self) -> None: print("每一條用例執行結束後執行...(一般放到用例之後)") #正確登陸測試用例 def test_login_yes(self):#測試用例函數必須test_開頭,否則框架無法識別當前是用例 print("執行用例11111111111111111") def test_login_no(self): print("執行用例22222222222222222") if __name__ == '__main__': unittest.main()#執行全部測試用例
執行結果:
============================= test session starts ============================= platform win32 -- Python 3.7.3, pytest-7.2.0, pluggy-1.0.0 plugins: html-3.2.0, metadata-2.0.4collected 2 items demo_case.py .每一條用例執行前執行... 執行用例22222222222222222 每一條用例執行結束後執行...(一般放到用例之後) .每一條用例執行前執行... 執行用例11111111111111111 每一條用例執行結束後執行...(一般放到用例之後) [100%] ============================== 2 passed in 0.10s ============================== Process finished with exit code 0