齊河網(wǎng)站建設公司價格找廣網(wǎng)
鶴壁市浩天電氣有限公司
2026/01/24 14:20:07
齊河網(wǎng)站建設公司價格,找廣網(wǎng),wordpress字體選擇,深圳企業(yè)網(wǎng)站建設電話文章目錄 《MongoDB實戰(zhàn)入門》第12章 測試與部署:從開發(fā)到生產(chǎn)(python實戰(zhàn)完善版) 12.1 MongoDB單元測試 12.1.1 環(huán)境準備 12.1.2 核心代碼實現(xiàn)(覆蓋CRUD+聚合+事務) 第一步:編寫待測試的MongoDB業(yè)務操作類 第二步:編寫單元測試用例 第三步:運行單元測試 12.2 生產(chǎn)環(huán)境…文章目錄《MongoDB實戰(zhàn)入門》第12章 測試與部署:從開發(fā)到生產(chǎn)(python實戰(zhàn)完善版)12.1 MongoDB單元測試12.1.1 環(huán)境準備12.1.2 核心代碼實現(xiàn)(覆蓋CRUD+聚合+事務)第一步:編寫待測試的MongoDB業(yè)務操作類第二步:編寫單元測試用例第三步:運行單元測試12.2 生產(chǎn)環(huán)境部署最佳實踐12.2.1 環(huán)境變量配置(區(qū)分開發(fā)/測試/生產(chǎn))方案1:本地開發(fā)/測試環(huán)境(使用.env文件)方案2:生產(chǎn)環(huán)境(系統(tǒng)環(huán)境變量配置)12.2.2 安全配置實操1. 開啟MongoDB認證模式(服務端配置)2. 創(chuàng)建權限隔離的MongoDB用戶3. 限制IP訪問(防火墻層面)12.2.3 數(shù)據(jù)備份與恢復實戰(zhàn)(python+Shell)1. 定時備份腳本(python實現(xiàn))2. 設置定時備份(crontab)3. 數(shù)據(jù)恢復腳本(python實現(xiàn))4. 恢復命令使用示例12.3 基礎監(jiān)控12.3.1 MongoDB內(nèi)置監(jiān)控工具(mongostat/mongotop)1. mongostat:實時監(jiān)控全局運行狀態(tài)基本使用命令(生產(chǎn)環(huán)境帶認證)核心指標解讀(重點關注)2. mongotop:實時監(jiān)控集合級讀寫耗時基本使用命令(生產(chǎn)環(huán)境帶認證)12.3.2 python自定義監(jiān)控腳本(采集核心指標)后臺運行監(jiān)控腳本總結《MongoDB實戰(zhàn)入門》第12章 測試與部署:從開發(fā)到生產(chǎn)(python實戰(zhàn)完善版)本章聚焦MongoDB從開發(fā)測試到生產(chǎn)落地的全流程python實操,補充可直接復用的代碼示例,確保每個技術點都能落地執(zhí)行,核心圍繞單元測試、生產(chǎn)部署、監(jiān)控運維三大模塊展開。12.1 MongoDB單元測試單元測試的核心目標是脫離真實MongoDB服務依賴,通過模擬環(huán)境驗證數(shù)據(jù)操作邏輯的正確性,避免測試污染真實業(yè)務數(shù)據(jù),python生態(tài)中常用pytest(測試框架)+mongomock(MongoDB模擬工具)實現(xiàn)該需求。12.1.1 環(huán)境準備首先安裝所需依賴包:pipinstallpytest mongomock pymongo python-dotenv12.1.2 核心代碼實現(xiàn)(覆蓋CRUD+聚合+事務)第一步:編寫待測試的MongoDB業(yè)務操作類創(chuàng)建mongodb_service.py,封裝核心業(yè)務操作:# mongodb_service.pyfrompymongoimportMongoClientfromdatetimeimportdatetimefromtypingimportList,Dict,Optional,UnionclassMongoDBBusinessService:"""MongoDB業(yè)務操作封裝類,包含CRUD、聚合、事務等核心操作"""def__init__(self,mongo_client:MongoClient,db_name:str="business_db"):self.db=mongo_client[db_name]self.collection=self.db["user_orders"]# 訂單業(yè)務集合# 新增數(shù)據(jù)(C):創(chuàng)建訂單defcreate_order(self,order_info:Dict)-str:""" 創(chuàng)建訂單 :param order_info: 訂單信息字典,必須包含user_id、order_amount字段 :return: 新增訂單的ID字符串 :raises ValueError: 缺少必填字段時拋出異常 """required_fields=["user_id","order_amount"]ifnotall(fieldinorder_infoforfieldinrequired_fields):raiseValueError("訂單信息缺少必填字段(user_id/order_amount)")# 補充默認字段order_info.update({"create_time":datetime.now(),"order_status":"pending","update_time":datetime.now()})result=self.collection.insert_one(order_info)returnstr(result.inserted_id)# 查詢數(shù)據(jù)(R):按用戶ID查詢訂單defget_orders_by_user(self,user_id:str,limit:int=10)-List[Dict]:""" 按用戶ID查詢訂單列表 :param user_id: 用戶唯一標識 :param limit: 返回訂單數(shù)量上限 :return: 訂單列表(去除_id字段) """query={"user_id":user_id}projection={"_id":0}# 不返回_id字段orders=list(self.collection.find(query,projection).limit(limit).sort("create_time",-1))returnorders# 更新數(shù)據(jù)(U):更新訂單狀態(tài)defupdate_order_status(self,order_id:str,new_status:str)-int:""" 更新訂單狀態(tài) :param order_id: 訂單ID :param new_status: 新狀態(tài)(pending/paid/shipped/completed) :return: 受影響的記錄數(shù) """query={"_id":order_id}update_data={"$set":{"order_status":new_status,"update_time":datetime.now()}}result=self.collection.update_one(query,update_data)returnresult.modified_count# 刪除數(shù)據(jù)(D):刪除過期無效訂單defdelete_invalid_orders(self,user_id:str)-int:""" 刪除用戶的無效訂單(狀態(tài)為pending且創(chuàng)建時間超過24小時,僅示例) :param user_id: 用戶唯一標識 :return: 刪除的記錄數(shù) """# 模擬24小時前的時間(實際可根據(jù)業(yè)務調(diào)整)expire_time=datetime.now()-timedelta(hours=24)query={"user_id":user_id,"order_status":"pending","create_time":{"$lt":expire_time}}result=self.collection.delete_many(query)returnresult.deleted_count# 聚合查詢:按用戶統(tǒng)計訂單總金額defstat_user_order_total(self)-List[Dict]:""" 聚合查詢:統(tǒng)計每個用戶的訂單總金額、訂單數(shù)量 :return: 聚合結果列表 """pipeline=[{"$group":{"_id":"$user_id","total_amount":{"$sum":"$order_amount"},"order_count":{"$sum":1}}},{"$sort":{"total_amount":-1}},{"$limit":20# 僅返回前20名用戶}]returnlist(self.collection.aggregate(pipeline))# 事務操作:批量創(chuàng)建訂單(需MongoDB 4.0+支持,mongomock兼容事務模擬)defbatch_create_orders(self,order_list:List[Dict])-bool:""" 事務批量創(chuàng)建訂單,要么全部成功,要么全部回滾 :param order_list: 訂單列表 :return: 批量創(chuàng)建是否成功 """ifnotorder_list:returnFalsewithself.db.client.start_session()assession:session.start_transaction()try:fororderinorder_list:self.create_order(order)session.commit_transaction()returnTrueexceptExceptionase:session.abort_transaction()raiseException(f"批量創(chuàng)建訂單失?。簕str(e)}")第二步:編寫單元測試用例創(chuàng)建test_mongodb_service.py,使用pytest+mongomock實現(xiàn)無依賴測試:# test_mongodb_service.pyimportpytestimportmongomockfrompymongoimportMongoClientfromdatetimeimporttimedelta,datetimefrommongodb_serviceimportMongoDBBusinessService# 測試夾具1:創(chuàng)建模擬MongoDB客戶端(無需真實服務,全局復用)@pytest.fixture(scope="function")defmock_mongo_client():"""創(chuàng)建模擬MongoDB客戶端,測試完成后自動清理數(shù)據(jù)"""client=mongomock.MongoClient()# 完全兼容pymongo APIyieldclient# 測試結束后刪除測試數(shù)據(jù)庫,避免數(shù)據(jù)殘留client.drop_database("business_db")# 測試夾具2:初始化業(yè)務服務實例@pytest.fixture(scope="function")deforder_service(mock_mongo_client):"""初始化MongoDB業(yè)務服務,依賴模擬客戶端"""returnMongoDBBusinessService(mock_mongo_client)# -------------- 測試用例:覆蓋CRUD核心操作 --------------deftest_create_order_success(order_service):"""測試創(chuàng)建訂單(正常場景)"""order_data={"use