主頁 > 後端開發 > Python+Pytest+Allure+Git+Jenkins介面自動化框架

Python+Pytest+Allure+Git+Jenkins介面自動化框架

2020-09-16 04:29:31 後端開發

Python+Pytest+Allure+Git+Jenkins介面自動化框架

一、介面基礎

  介面測驗是對系統和組件之間的介面進行測驗,主要是效驗資料的交換,傳遞和控制管理程序,以及相互邏輯依賴關系,其中介面協議分為HTTP,RPC,Webservice,Dubbo,RESTful等型別,

  介面測驗流程

    1、需求評審,熟悉業務和需求

    2、開發提供介面檔案

    3、撰寫介面測驗用例

    4、用例評審

    5、提測后開始測驗

    6、提交測驗報告

兩種常見的 HTTP 請求方法:GET 和 POST

二、專案說明

  本框架是一套基于Python+Pytest+Requests+Allure+Jenkins而設計的資料驅動介面自動化測驗的框架,

  技術堆疊

    Python、Pytest、Requests、Pactverity、Excel、Json、Mysql、Allure、Logbook、Git、Jenkins

三、介面測驗框架結構圖

四、專案功能

  Python+Pytest+Allure+Jenkins介面自動化框架,實作Excel或Json維護測驗用例,支持資料庫操作,利用封裝的請求基類調取相應的測驗用例介面,獲取組態檔中的環境地址與環境變數,

結合Pytest進行單元測驗,使用LogBook進行記錄日志,并生成allure測驗報告,最后進行Jenkins集成專案實作集成部署,并發送測驗報告郵件,

五、代碼設計與功能說明

1、工具類封裝

1.1、log日志

  專案中的log日志是logbook進行日志記錄的,方便測驗開發除錯時進行排錯糾正或修復優化,日志可選擇是否列印在螢屏上即運行時是否在終端輸出列印,日志格式輸出可調整,

  handle_log.py部分原始碼

 1 def log_type(record, handler):
 2     log = "[{date}] [{level}] [{filename}] [{func_name}] [{lineno}] {msg}".format(
 3         date=record.time,  # 日志時間
 4         level=record.level_name,  # 日志等級
 5         filename=os.path.split(record.filename)[-1],  # 檔案名
 6         func_name=record.func_name,  # 函式名
 7         lineno=record.lineno,  # 行號
 8         msg=record.message  # 日志內容
 9     )
10     return log
11 # 日志存放路徑
12 LOG_DIR = BasePath + '/log'
13 print(LOG_DIR)
14 if not os.path.exists(LOG_DIR):
15     os.makedirs(LOG_DIR)
16 # 日志列印到螢屏
17 log_std = ColorizedStderrHandler(bubble=True)
18 log_std.formatter = log_type
19 # 日志列印到檔案
20 log_file = TimedRotatingFileHandler(
21     os.path.join(LOG_DIR, '%s.log' % 'log'), date_format='%Y-%m-%d', bubble=True, encoding='utf-8')
22 log_file.formatter = log_type
23 
24 # 腳本日志
25 run_log = Logger("global_log")
26 def init_logger():
27     logbook.set_datetime_format("local")
28     run_log.handlers = []
29     run_log.handlers.append(log_file)
30     run_log.handlers.append(log_std)
31     return ""

  列印在終端的日志,如下圖所示,

   同時運行專案后,會在專案檔案log中自動生成一個以當天日期命名的log檔案,點擊log日志檔案可查看日志詳情即專案運行時所記錄的日志或報錯日志,如下圖所示,

1.2、組態檔

  專案中涉及到一些組態檔如username、password或環境變數時,我們可通過組態檔來獲取配置值,通過組態檔中key與value的定義來確定獲取組態檔的值,

  handle_init.py部分原始碼

 1 class HandleInit:
 2     # 讀取組態檔
 3     def load_ini(self):
 4         file_path = BasePath + "/config/config.ini"
 5         cf = configparser.ConfigParser()
 6         cf.read(file_path, encoding='UTF-8')
 7         return cf
 8 
 9     # 獲取ini里面對應key的value
10     def get_value(self, key, node=None):
11         if node == None:
12             node = 'Test'
13         cf = self.load_ini()
14         try:
15             data =https://www.cnblogs.com/wuweiblogs/p/ cf.get(node, key)
16             logger.info('獲取組態檔的值,node:{},key:{}, data:{}'.format(node, key, data))
17         except Exception:
18             logger.exception('沒有獲取到對應的值,node:{},key:{}'.format(node, key))
19             data =https://www.cnblogs.com/wuweiblogs/p/ None
20         return data

  獲取組態檔中的值日志如下圖所示,

1.3、Api介面請求

  獲取相關測驗用例及介面用例配置,記錄請求相關引數的日志,定義Allure測驗報告的步驟,

  handle_apirequest.py部分代碼

 1 class ApiRequest:
 2     def api_request(self, base_url, test_case_data, case_data):
 3         get_name = None
 4         get_url = None
 5         get_method = None
 6         get_headers = None
 7         get_cookies = None
 8         get_case_name = None
 9         get_case_params = None
10         response_data =https://www.cnblogs.com/wuweiblogs/p/ None
11         try:
12             get_name = test_case_data['config']['name']
13             get_url = base_url + test_case_data['config']['url']
14             get_method = test_case_data['config']['method']
15             get_headers = test_case_data['config']['headers']
16             get_cookies = test_case_data['config']['cookies']
17         except Exception as e:
18             logger.exception('獲取用例基本資訊失敗,{}'.format(e))
19         try:
20             get_case_name = case_data['name']
21             get_case_params = case_data['params']
22         except Exception as e:
23             logger.exception('獲取測驗用例資訊失敗,{}'.format(e))
24         with allure.step("請求介面:%s,請求地址:%s,請求方法:%s,請求頭:%s,請求Cookies:%s" % (
25                 get_name, get_url, get_method, get_headers, get_cookies)):
26             allure.attach("介面用例描述:", "{0}".format(get_case_name))
27             allure.attach("介面用例請求引數:", "{0}".format(get_case_params))
28         logger.info(
29             '請求介面名:%r,請求地址:%r,請求方法:%r,請求頭:%r,請求Cookies:%r' % (get_name, get_url, get_method, get_headers, get_cookies))
30         logger.info('請求介面名:%r,請求介面用例名:%r,介面用例請求引數:%r' % (get_name, get_case_name, get_case_params))
31         try:
32             response_data =https://www.cnblogs.com/wuweiblogs/p/ baseRequest.run_main(get_method, get_url, get_case_params, get_headers)
33         except Exception as e:
34             logger.exception('用例請求回傳失敗,{}'.format(e))
35         logger.info('請求介面名:%r,請求介面用例名:%r,回傳引數:%r' % (get_name, get_case_name, response_data.json()))
36         return response_data
1.4、Excel資料處理
1.4.1、Excel測驗用例

  測驗用例中維護在Excel檔案中,類中定義如何獲取Excel中的相關資料(如獲取某個單元格的內容,獲取單元格的行數,以及將資料寫入Excel中等操作),

  handle_exceldata.py部分原始碼

 1 class OperationExcel:
 2     def __init__(self, file_name=None, sheet_id=None):
 3         if file_name:
 4             self.file_name = file_name
 5             self.sheet_id = sheet_id
 6         else:
 7             self.file_name = ''
 8             self.sheet_id = 0
 9         self.data =https://www.cnblogs.com/wuweiblogs/p/ self.get_data()
10 
11     # 獲取sheets的內容
12     def get_data(self):
13         data =https://www.cnblogs.com/wuweiblogs/p/ xlrd.open_workbook(self.file_name)
14         tables = data.sheets()[self.sheet_id]
15         return tables
16 
17     # 獲取單元格的行數
18     def get_lines(self):
19         tables = self.data
20         return tables.nrows
21 
22     # 獲取某一個單元格的內容
23     def get_cell_value(self, row, col):
24         return self.data.cell_value(row, col)
1.5、Json資料處理
1.5.1、Json測驗用例
 1 {
 2     "config":{
 3         "name":"post介面名",
 4         "url":"/langdetect",
 5         "method":"POST",
 6         "headers":{
 7             "Content-Type":"application/json"
 8         },
 9         "cookies":{
10 
11         }
12     },
13     "testcase":[
14         {
15             "name":"測驗用例1",
16             "params":{
17                 "query":"測驗"
18             },
19             "validate":[
20                 {
21                     "check":"status_code",
22                     "comparator":"eq",
23                     "expect":"200"
24                 }
25             ]
26         },
27         {
28             "name":"測驗用例2",
29             "params":{
30                 "query":"python"
31             },
32             "validate":[
33                 {
34                     "check":"msg",
35                     "comparator":"eq",
36                     "expect":"success"
37                 }
38             ]
39         }
40     ]
41 }
1.5.2、Json用例處理

  獲取Json檔案中里具體欄位的值,

  handle.json.py部分原始碼

 1 class HandleJson:
 2     # 讀取json檔案
 3     def load_json(self, file_name):
 4         if file_name == None:
 5             file_path = ""
 6         else:
 7             file_path = file_name
 8         try:
 9             with open(file_path, encoding='UTF-8') as f:
10                 data =https://www.cnblogs.com/wuweiblogs/p/ json.load(f)
11             return data
12         except Exception:
13             print("未找到json檔案")
14             return {}
15 
16     # 讀取json檔案里具體的欄位值
17     def getJson_value(self, key, file_name):
18         if file_name == None:
19             return ""
20         jsonData =https://www.cnblogs.com/wuweiblogs/p/ self.load_json(file_name)
21         if key == None:
22             getJsonValue = https://www.cnblogs.com/wuweiblogs/p/""
23         else:
24             getJsonValue =https://www.cnblogs.com/wuweiblogs/p/ jsonData.get(key)
25         return getJsonValue

2、基類封裝

2.1、請求基類封裝

  介面支持Get、Post請求,呼叫requests請求來實作介面的呼叫與回傳,介面引數包括,介面地址、介面請求引數、cookie引數、header引數,

 1 class BaseRequest:
 2 
 3     def send_get(self, url, data, header=None, cookie=None):
 4         """
 5         Requests發送Get請求
 6         :param url:請求地址
 7         :param data:Get請求引數
 8         :param cookie:cookie引數
 9         :param header:header引數
10         """
11         response = requests.get(url=url, params=data, cookies=cookie, headers=header)
12         return response
13 
14     def send_post(self, url, data, header=None, cookie=None):
15         """
16         Requests發送Post請求
17         :param url:請求地址
18         :param data:Post請求引數
19         :param data:Post請求引數
20         :param cookie:cookie引數
21         :param header:header引數
22         """
23         response = requests.post(url=url, json=data, cookies=cookie, headers=header)
24         return response
25 
26         # 主函式呼叫
27 
28     def run_main(self, method, url, data, header, cookie=None):
29         try:
30             result = ''
31             if method.upper() == 'GET':
32                 result = self.send_get(url, data, header, cookie)
33             elif method.upper() == 'POST':
34                 result = self.send_post(url, data, header, cookie)
35             return result
36         except Exception as e:
37             logger.exception('請求主函式呼叫失敗:{}'.format(e))

3、介面測驗用例撰寫

3.1、介面測驗用例

  參考Pytest來進行介面的單元測驗,通過JSON中多個測驗用例來做為引數化資料驅動,結合Allure制定相應介面的測驗報告,在介面回傳斷言之前,我們先進行該介面的契約測驗,

我們采用的是Pactverity的全量契約校驗測驗,當契約測驗通過時,我們再進行回傳引數的相關校驗測驗,

  test_getRequestJson.py部分原始碼

 1 @allure.feature('測驗GET請求模塊')
 2 class TestRequestOne():
 3     @allure.title('測驗標題')
 4     @allure.testcase('測驗地址:https://www.imooc.com')
 5     @pytest.mark.parametrize('case_data', testCaseData['testcase'])
 6     def test_requestOne(self, case_data):
 7         try:
 8             api_response = apiRequest.api_request(baseurl, testCaseData, case_data)
 9             api_response_data =https://www.cnblogs.com/wuweiblogs/p/ api_response.json()
10             # pactverity——全量契約校驗
11             config_contract_format = Like({
12                 "msg": "成功",
13                 "result": 0,
14                 "data": EachLike({
15                     "word": Like("testng")
16                 })
17             })
18             mPactVerify = PactVerify(config_contract_format)
19             try:
20                 mPactVerify.verify(api_response_data)
21                 logger.info(
22                     'verify_result:{},verify_info:{}'.format(mPactVerify.verify_result, mPactVerify.verify_info))
23                 assert mPactVerify.verify_result == True
24             except Exception:
25                 err_msg = '契約校驗錯誤'
26                 logger.exception('測驗用例契約校驗失敗,verify_result:{},verify_info:{}'.format(mPactVerify.verify_result,
27                                                                                      mPactVerify.verify_info))
28             try:
29                 for case_validate in case_data['validate']:
30                     logger.info('斷言期望相關引數:check:{},comparator:{},expect:{}'.format(case_validate['check'],
31                                                                                    case_validate['comparator'],
32                                                                                    case_validate['expect']))
33                     comparatorsTest.comparators_Assert(api_response, case_validate['check'],
34                                                        case_validate['comparator'], case_validate['expect'])
35                     logger.info('測驗用例斷言成功')
36             except Exception as e:
37                 logger.exception('測驗用例斷言失敗')
38         except Exception as e:
39             logger.exception('測驗用例請求失敗,原因:{}'.format(e))
3.2、主運行

  運用Pytest和Allure的特性,命令列運行測驗用例檔案夾,并生成對應的allure測驗報告,

1 if __name__ == "__main__":
2     pytest.main(['-s', '-v', 'test_case/testRequest/', '-q', '--alluredir', 'reports'])

4、Allure2測驗報告

  當我們運行主函式時,并生成對應的測驗用例報告時,我們可以看到在該檔案夾中會生成對應的json檔案的測驗報告,將json檔案的測驗報告轉換成html形式的,命令如下

  reports是json格式測驗報告存放的目錄位置,allure_reports是html測驗報告檔案生成的目錄位置,allure命令如下,

1 allure generate reports -o allure_result/

  專案根目錄下的allure_reports檔案,存放的是allure生成的測驗報告,可看出檔案下有一個HTML檔案,可通過Python的編輯器Pycharm來打開該HTML檔案(測驗報告),

或可通過allure命令來打開該HTML,展示HTML測驗報告,如下所示,

  測驗報告檔案,HTML測驗報告如下,

   allure命令打開HTML測驗報告,命令如下所示,

1 allure open allure_result/

  如下圖所示,

  打開生成的HTML測驗報告如下圖所示,

5、Jenkins集成

  Allure+Jenkins的分享,我之前在Pytest+Allure+Jenkins的博客中已經分享過了,這塊可以出門左轉看看,前期的準備就不在這里重復說明了,我們就直接來上手創建Item進行相關配置,

  General中GitHub專案地址的配置,將自己專案的Git復制至專案URL處,如下圖所示,

   原始碼管理設定,勾選Git,填寫相應的專案Git地址,Git專案權限所有者,以及對應的拉取代碼的分支,如下圖所示,

   配置構建命令,選擇“執行windows批處理命令”,用python運行主函式運行腳本,命令如下圖所示,

   當我們在Jenkins里面成功安裝Allure插件后,直接可以在構建后操作中配置Allure的相關配置,在Pytest+Allure+Jenkins中已經說明過的,

Results應與專案運行時設定的Allure生成的Json格式報告的路徑一致,Report path為Allure html報告結果生成檔案存放的路徑,

   排除萬難之后,我們就可以用Jenkins來運行專案了,如下圖所示,

   測驗報告詳情頁,如下圖所示,

六、后期優化

  1、介面測驗用例之間的資料依賴

  2、測驗報告郵件的發送

  ,,,,,,

七、感想

   該框架是在涉及python的知識點比較多,將介面測驗與契約測驗結合起來,該框架是在作業之余學習多篇文章,實戰上手逐步入門開始的,適合新手入門介面自動化實戰練習,僅供參考學習,框架中有不少可優化點與不足點,希望大家多多提建議或想法,

  開源地址:https://github.com/wuwei88/Apiautomation.git

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/53198.html

標籤:Python

上一篇:Python可視化:matplotlib 制作雷達圖進行對比分析

下一篇:網路基礎之——tcp協議的流式問題之遠程執行命令程式解決粘包問題,定制復雜的報頭

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more