web自动化6-pytest③实践测试用例-回归用例web自动化

在这里插入图片描述

# -*- coding: utf-8 -*-
"""
lemut_select - 业务受理
Author: duxiaowei
Date: 2024/7/17
"""
import timeimport allure
import pytest
from selenium.webdriver.common.by import By# 业务受理
@allure.feature("业务受理")
class Test_业务受理:@pytest.fixture(scope="function", autouse=True)def setup(self, web_start):self.driver = web_starttime.sleep(1)self.driver.find_element(By.XPATH, '//div/span[text()="业务受理"]').click()time.sleep(2)yieldtime.sleep(1)# 关闭当前页签,打开-业务查询页签self.driver.find_element(By.XPATH, '//div/span[text()="业务受理"]').click()# 客满维护@allure.title("客满维护")@pytest.mark.parametrize('HIC信息单号,开始天,结束天', [("YT02407120021805", "2024-07-11", "2024-07-12")])def test_客满维护(self, HIC信息单号, 开始天, 结束天):self.driver.find_element(By.XPATH, '//ul/li[text()="客满维护"]').click()time.sleep(2)try:self.driver.find_element(By.XPATH, '//label[text()="HIC信息单号:"]/following-sibling::div/div/input').send_keys(HIC信息单号)time.sleep(1)# 时间框self.driver.find_element(By.XPATH, '//label[text()="挂机时间:"]/following-sibling::div/div/input').click()time.sleep(1)self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div/div/div/span/span/div/input[@class="el-input__inner"]').clear()self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div/div/div/span/span/div/input[@class="el-input__inner"]').send_keys(开始天)time.sleep(1)self.driver.find_elements(By.XPATH,'//div[not(contains(@style,"display"))]/div/div/div/span/span/div/input[@class="el-input__inner"]')[2].clear()self.driver.find_elements(By.XPATH,'//div[not(contains(@style,"display"))]/div/div/div/span/span/div/input[@class="el-input__inner"]')[2].send_keys(结束天)time.sleep(1)self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div[@class="el-picker-panel__footer"]/button[2]/span').click()time.sleep(1)  # 查询self.driver.find_element(By.XPATH, '//span[text()="查询"]').click()time.sleep(2)text = self.driver.find_element(By.XPATH,'//div[@class!="el-table__fixed"]/div/table/tbody/tr/td[3]/div/span[text()="' + HIC信息单号 + '"]').textprint(text)# 导出self.driver.find_element(By.XPATH,'//div[@id="clientSatList"]/div/form/div[2]/div/div[2]/button/span').click()time.sleep(2)assert text == HIC信息单号finally:self.driver.find_element(By.XPATH, '//span[contains(text(),"客户满意度")]/i').click()# 电商督办@allure.title("电商督办")@pytest.mark.parametrize('信息单号,开始天,结束天', [("YT02407120020689", "2024-07-05", "2024-07-12")])def test_电商督办(self, 信息单号, 开始天, 结束天):self.driver.find_element(By.XPATH, '//ul/li[text()="电商督办"]').click()try:time.sleep(2)self.driver.find_element(By.XPATH, '//label[text()="信息单号:"]/following-sibling::div/div/input').send_keys(信息单号)time.sleep(1)# 时间框self.driver.find_element(By.XPATH, '//label[text()="录入时间:"]/following-sibling::div/div/input').click()time.sleep(1)self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div/div/div/span/span/div/input[@class="el-input__inner"]').clear()self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div/div/div/span/span/div/input[@class="el-input__inner"]').send_keys(开始天)time.sleep(1)self.driver.find_elements(By.XPATH,'//div[not(contains(@style,"display"))]/div/div/div/span/span/div/input[@class="el-input__inner"]')[2].clear()self.driver.find_elements(By.XPATH,'//div[not(contains(@style,"display"))]/div/div/div/span/span/div/input[@class="el-input__inner"]')[2].send_keys(结束天)time.sleep(1)self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div[@class="el-picker-panel__footer"]/button[2]/span').click()time.sleep(1)  # 查询self.driver.find_element(By.XPATH, '//span[text()="查询"]').click()time.sleep(2)  # 详情页self.driver.find_element(By.XPATH,'//div[@class!="el-table__fixed"]/div/table/tbody/tr/td/div/span/button/span[text()="详情"]').click()time.sleep(2)text = self.driver.find_element(By.XPATH,'//th[contains(text(),"信息单号:")]/following-sibling::td/span').textprint(text)# 进入详情页assert text == 信息单号# 关闭self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div/div/button[@aria-label="Close"]/i').click()finally:# 关闭time.sleep(1)self.driver.find_element(By.XPATH, '//span[contains(text(),"电商督办")]/i').click()# 电商邀评@allure.title("电商邀评")@pytest.mark.parametrize('订单编号,开始天,结束天', [("3949535376648537739", "2024-07-05", "2024-07-13")])def test_电商邀评(self, 订单编号, 开始天, 结束天):self.driver.find_element(By.XPATH, '//ul/li[text()="电商邀评"]').click()try:time.sleep(2)self.driver.find_element(By.XPATH, '//label[text()="订单编号:"]/following-sibling::div/div/input').send_keys(订单编号)time.sleep(1)# 时间框self.driver.find_element(By.XPATH,'//i[@class="el-input__icon el-range__close-icon"]').click()self.driver.find_element(By.XPATH, '//label[text()="邀评新增时间:"]/following-sibling::div/div/input').click()time.sleep(1)self.driver.find_element(By.XPATH,'//label[text()="邀评新增时间:"]/following-sibling::div/div/input').send_keys(开始天)self.driver.find_elements(By.XPATH,'//label[text()="邀评新增时间:"]/following-sibling::div/div/input')[1].send_keys(结束天)time.sleep(1)self.driver.find_element(By.XPATH, '//span[text()="查询"]').click()# 导出self.driver.find_element(By.XPATH,'//span[text()="评价导入"]/parent::button/parent::div/following-sibling::div/button/span').click()time.sleep(2)# 进入详情页self.driver.find_element(By.XPATH,'//div[@class!="el-table__fixed"]/div/table/tbody/tr/td/div/span/button/span[text()="闭环"]').click()time.sleep(2)text = self.driver.find_element(By.XPATH,'//*[@id="reviewUserInfo"]/div[1]/div[2]/table/tbody[1]/tr/td[1]/div/input').get_attribute('value')# 判断值是否正确assert text == 订单编号# 关闭time.sleep(1)self.driver.find_element(By.XPATH, '//span[contains(text(),"邀评客户信息")]/i').click()finally:# 关闭time.sleep(1)self.driver.find_element(By.XPATH, '//span[contains(text(),"电商邀评")]/i').click()# 工贸督办@allure.title("工贸督办")@pytest.mark.parametrize('信息单号,开始天,结束天', [("JN02407120022700", "2024-07-05", "2024-07-13")])def test_工贸督办(self, 信息单号, 开始天, 结束天):self.driver.find_element(By.XPATH, '//ul/li[text()="工贸督办"]').click()try:time.sleep(2)self.driver.find_element(By.XPATH, '//label[text()="信息单号:"]/following-sibling::div/div/input').send_keys(信息单号)time.sleep(1)# 时间框self.driver.find_element(By.XPATH, '//label[text()="入库时间:"]/following-sibling::div/div/input').click()time.sleep(1)self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div/div/div/span/span/div/input[@class="el-input__inner"]').clear()self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div/div/div/span/span/div/input[@class="el-input__inner"]').send_keys(开始天)time.sleep(1)self.driver.find_elements(By.XPATH,'//div[not(contains(@style,"display"))]/div/div/div/span/span/div/input[@class="el-input__inner"]')[2].clear()self.driver.find_elements(By.XPATH,'//div[not(contains(@style,"display"))]/div/div/div/span/span/div/input[@class="el-input__inner"]')[2].send_keys(结束天)time.sleep(1)self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div[@class="el-picker-panel__footer"]/button[2]/span').click()time.sleep(1)self.driver.find_element(By.XPATH, '//span[text()="查询"]').click()time.sleep(2)# 进入详情页self.driver.find_element(By.XPATH,'//div[@class!="el-table__fixed"]/div/table/tbody/tr/td/div/span/button/span[text()="查看详情"]').click()time.sleep(2)text = self.driver.find_element(By.XPATH,'//*[@id="industrySuperviseDetail"]/div[1]/div[2]/table/tbody[2]/tr/td[3]/div/input').get_attribute('value')# 判断值是否正确assert text == 信息单号# 关闭time.sleep(1)self.driver.find_element(By.XPATH, '//span[contains(text(),"督办详情")]/i').click()finally:# 关闭time.sleep(1)self.driver.find_element(By.XPATH, '//span[contains(text(),"工贸督办")]/i').click()# 抱怨信息督办库@allure.title("抱怨信息督办库")@pytest.mark.parametrize('信息单号,开始天,结束天', [("JH02407120022611", "2024-07-05", "2024-07-13")])def test_抱怨信息督办库(self, 信息单号, 开始天, 结束天, web_start):self.driver.find_element(By.XPATH, '//ul/li[text()="抱怨信息督办库"]').click()try:time.sleep(2)self.driver.find_element(By.XPATH, '//label[text()="信息单号:"]/following-sibling::div/div/input').send_keys(信息单号)time.sleep(1)# 时间框self.driver.find_element(By.XPATH, '//label[text()="录单时间(起):"]/following-sibling::div/div/input').click()time.sleep(1)self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div/div[@class="el-picker-panel__body"]/div[1]/span[1]/div/input').clear()self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div/div[@class="el-picker-panel__body"]/div[1]/span[1]/div/input').send_keys(开始天)time.sleep(2)# 时间框-确定self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]//div[2]/button[2]/span').click()# 时间框self.driver.find_element(By.XPATH, '//label[text()="录单时间(止):"]/following-sibling::div/div/input').click()time.sleep(1)self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div/div[@class="el-picker-panel__body"]/div[1]/span[1]/div/input').clear()self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div/div[@class="el-picker-panel__body"]/div[1]/span[1]/div/input').send_keys(结束天)time.sleep(1)# 时间框-确定self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]//div[2]/button[2]/span').click()time.sleep(1)self.driver.find_element(By.XPATH, '//span[text()="查询"]').click()time.sleep(1)text = self.driver.find_element(By.XPATH,'//*[@id="complainInfoDatabase"]/div[2]/div[1]/div[3]//tr/td[3]').textassert text == 信息单号finally:# 关闭time.sleep(1)self.driver.find_element(By.XPATH, '//span[contains(text(),"抱怨信息督办库")]/i').click()# 小海跳闸审核查询@allure.title("小海跳闸审核查询")@pytest.mark.parametrize('信息单号,开始天,结束天', [("DL02407120002842", "2024-07-05", "2024-07-13")])def test_小海跳闸审核查询(self, 信息单号, 开始天, 结束天, web_start):self.driver.find_element(By.XPATH, '//ul/li[text()="小海跳闸审核查询"]').click()try:time.sleep(2)self.driver.find_element(By.XPATH, '//label[text()="信息单号:"]/following-sibling::div/div/input').send_keys(信息单号)time.sleep(1)# 时间框self.driver.find_element(By.XPATH, '//label[text()="登记开始时间:"]/following-sibling::div/div/input').click()time.sleep(1)self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div/div[@class="el-picker-panel__body"]/div[1]/span[1]/div/input').clear()self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div/div[@class="el-picker-panel__body"]/div[1]/span[1]/div/input').send_keys(开始天)time.sleep(1)# 时间框-确定self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]//div[2]/button[2]/span').click()time.sleep(1)# 时间框self.driver.find_element(By.XPATH, '//label[text()="登记结束时间:"]/following-sibling::div/div/input').click()time.sleep(1)self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div/div[@class="el-picker-panel__body"]/div[1]/span[1]/div/input').clear()self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div/div[@class="el-picker-panel__body"]/div[1]/span[1]/div/input').send_keys(结束天)time.sleep(1)# 时间框-确定self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]//div[2]/button[2]/span').click()time.sleep(1)self.driver.find_element(By.XPATH, '//span[text()="查询"]').click()time.sleep(1)self.driver.find_element(By.XPATH,'//*[@id="tripList"]/div[2]/div[1]/div[3]/table/tbody/tr/td[2]/div/span/button').click()time.sleep(2)text = self.driver.find_element(By.XPATH,'//*[@id="tripDetail"]/div[1]/div[2]/table/tbody[1]/tr/td[1]/div/input').get_attribute('value')# 判断值是否正确assert text == 信息单号# 关闭time.sleep(1)self.driver.find_element(By.XPATH, '//span[contains(text(),"小海跳闸审核查询详情")]/i').click()time.sleep(1)finally:self.driver.find_element(By.XPATH, '//span[contains(text(),"小海跳闸审核查询")]/i').click()# 舆情工单处理@allure.title("舆情工单处理")@pytest.mark.parametrize('舆情工单号,开始天,结束天', [("202407120115", "2024-07-05", "2024-07-13")])def test_舆情工单处理(self, 舆情工单号, 开始天, 结束天):self.driver.find_element(By.XPATH, '//ul/li[text()="舆情工单处理"]').click()try:time.sleep(1)self.driver.find_element(By.XPATH, '//span[contains(text(),"高级查询")]').click()time.sleep(1)self.driver.find_element(By.XPATH, '//label[text()="舆情工单号:"]/following-sibling::div/div/input').send_keys(舆情工单号)time.sleep(1)# 创建时间self.driver.find_element(By.XPATH, '//label[text()="创建时间:"]/following-sibling::div/div/input').click()time.sleep(1)self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div/div/div/span/span/div/input[@class="el-input__inner"]').clear()self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div/div/div/span/span/div/input[@class="el-input__inner"]').send_keys(开始天)time.sleep(1)self.driver.find_elements(By.XPATH,'//div[not(contains(@style,"display"))]/div/div/div/span/span/div/input[@class="el-input__inner"]')[2].clear()self.driver.find_elements(By.XPATH,'//div[not(contains(@style,"display"))]/div/div/div/span/span/div/input[@class="el-input__inner"]')[2].send_keys(结束天)time.sleep(1)self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div[@class="el-picker-panel__footer"]/button[2]/span').click()time.sleep(1)self.driver.find_element(By.XPATH, '//span[text()="查询"]').click()time.sleep(1)# 鼠标-滑动到浏览器底部self.driver.execute_script("window.scrollTo(0, document.body.clientHeight)")# 详情time.sleep(1)self.driver.find_element(By.XPATH,'//*[@id="industrySupervise"]/div[2]/div[1]/div[3]/table/tbody/tr/td[2]/div/span/button[1]/span').click()time.sleep(2)text = self.driver.find_element(By.XPATH,'//*[@id="industrySupervise"]/div[3]/div/div[2]/div/div[1]/form/div[2]/div[1]/div/div').text# 判断值是否正确assert text == 舆情工单号# 关闭time.sleep(1)# 关闭self.driver.find_element(By.XPATH,'//div[not(contains(@style,"display"))]/div/div/button[@aria-label="Close"]/i').click()time.sleep(1)finally:self.driver.execute_script("window.scrollTo(0, 0)")self.driver.find_element(By.XPATH, '//span[contains(text(),"舆情工单处理")]/i').click()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/51455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity Apple Vision Pro 开发:如何把 PolySpatial 和 Play To Device 的版本从 1.2.3 升级为 1.3.1

XR 开发社区: SpatialXR社区:完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 📕教程说明 本教程将介绍如何把 Unity 的 PolySpatial 和 Play To Device 版本从 1.2.3 升级为 1.3.1。 📕Play To Device 软件升级 ht…

使用 Visual Studio 2022 自带的 cl.exe 编译 tensorRT自带测试样例 sampleOnnxMNIST

1. 新建任意文件夹,将 D:\install\tensorRT\TensorRT-8.6.1.6\samples\sampleOnnxMNIST 下面的 sampleOnnxMNIST.cpp 文件复制进来,同时 D:\install\tensorRT\TensorRT-8.6.1.6\samples\sampleOnnxMNIST 下面的 sample_onnx_mnist.vcxproj 中的内容&…

Java核心 - 内部类详解

作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有疑问和建议,请私信或评论留言! 前言 在Java编程中&a…

vite5-macos仿macOS网页osx管理系统|vue3+arcoDesign桌面os

基于vite5.xvue3arco-design原创自研网页版os管理框架ViteWebOS。 使用最新前端技术vite5vue3pinia2arcoDesignsortablejsecharts搭建网页pc版桌面os式后台管理系统解决方案。支持自定义桌面栅格布局引擎、可拖拽桌面图标、多屏分页管理、自定义桌面壁纸主题、毛玻璃虚化背景等…

学Java一篇文章就够了(手把手教你入门)

第11章 枚举&注解&内部类 一、枚举 概念 枚举类型是Java 5中新增特性的⼀部分,它是⼀种特殊的数据类型,之所以特殊是因为它既是⼀种类 (class)类型却⼜⽐类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安…

51单片机----开发工具介绍及软件安装

目录 一、硬件工具 二、软件工具 三、软件安装 四、总结 51单片机作为经典的入门级微控制器,因其易学易用、性价比高的特点,被广泛应用于各种电子产品中。想要玩转51单片机,首先需要了解其开发工具和软件安装方法。本文将从硬件和软件两方…

JCR一区级 | Matlab实现TTAO-Transformer-LSTM多变量回归预测

JCR一区级 | Matlab实现TTAO-Transformer-LSTM多变量回归预测 目录 JCR一区级 | Matlab实现TTAO-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【JCR一区级】Matlab实现TTAO-Transformer-LSTM多变量回归预测,三角拓扑聚合…

C语言 #具有展开功能的排雷游戏

文章目录 前言 一、整个排雷游戏的思维梳理 二、整体代码分布布局 三、游戏主体逻辑实现--test.c 四、整个游戏头文件的引用以及函数的声明-- game.h 五、游戏功能的具体实现 -- game.c 六、老六版本 总结 前言 路漫漫其修远兮,吾将上下而求索。 一、整个排…

【OSCP系列】OSCP靶机-BTRsys-2.1(原创)

OSCP系列靶机—BTRsys-2.1 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、主机发现 二、端口扫描 1、快速扫描 2、全端口扫描 3、服务系统探测 4、漏洞探测 80端口扫到了一些目录,有wordpress框…

Paimon数据湖详解(第49天)

系列文章目录 一. Paimon数据湖增删改查 二. 查询优化 三. 系统表 四. Lookup Joins 文章目录 系列文章目录前言Paimon数据湖的使用1、创建Table1.1 创建catalog管理的表1.2 分区表1.3 Create Table As(了解)1.4 Create Table Like1.5 表属性1.6 创建外…

无心剑中译莎士比亚《爱如星辰引迷舟》

莎士比亚十四行诗第116首 Sonnet 116 爱如星辰引迷舟 Let me not to the marriage of true minds Admit impediments. Love is not love Which alters when it alteration finds, Or bends with the remover to remove: O, no! it is an ever-fixed mark That looks on tempe…

C++(week14): C++提高:(一)面向对象设计:设计原则、设计模式

文章目录 一、面向对象设计的概念4.统一建模语言:UML语言StartUML 二、类与类之间的关系0.总结(1)类与类的五种关系(2)区别(3)面向对象 vs 基于对象 1.继承 (泛化耦合)2.组合 (Composition)3.聚合 (Aggregation)4.关联(1)双向关联(2)单向关联 5.依赖 (Dependency) 三…

简单几步,把浏览器书签转换成导航网页

废话不多说直奔主题上干货 Step 1 下载浏览器书签 1,电脑浏览器点击下载Pintree Pintree 是一个开源项目,旨在将浏览器书签导出成导航网站。通过简单的几步操作,就可以将你的书签转换成一个美观且易用的导航页面。 2. 安装 Pintree B…

常见OVS网桥及其链接接口详解

目录 引言OVS简介常见OVS网桥 QBR(qbr)PLY网桥br-intbr-tunbr-routerbrcps常见网桥链接接口 QVOQVIQVMPatch网桥和接口的工作原理应用场景 虚拟化环境数据中心网络云计算平台 1. 引言 开放虚拟交换机(Open vSwitch,简称OVS&…

iOS卡顿优化

概述 怎么优化下面场景离屏渲染的情况 图层阴影(Shadow):设置图层的 shadowOpacity、shadowOffset、shadowRadius 等属性。 图层圆角(Corner Radius):设置图层的 cornerRadius 属性,并同时启用了 masksToBounds。 图层蒙版(Mask):设置图层的 mask 属性或使用 maskT…

【保姆级讲解下QT6.3】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

【人工智能 | 机器学习 | 理论篇】线性模型

文章目录 1. 基本形式2. 线性回归3. 对数几率回归4. 线性判别分析5. 多分类学习6. 类别不平衡问题 1. 基本形式 设有 d 个属性描述的示例 x ( x 1 , x 2 , x 3 , . . . , x d ) x ({x_1, x_2, x_3, ..., x_d}) x(x1​,x2​,x3​,...,xd​) 线性模型(linear mode…

每天一个设计模式之命令模式(第二天)

交互模式中的命令模式,在开始记录之前,要讲些自己的感受,真真切切的感受到了悟性的瓶颈!一共十页书,需要自己细细琢磨品味,至少三四遍才大概了解了他们间的逻辑,我需要调整下自己的学习思路&…

使用 Vue 2.x + Element UI 搭建后台管理系统详解

引言 Vue.js 是一个非常流行的前端框架,而 Element UI 是基于 Vue 2.x 的一套完整的 UI 组件库,非常适合用来构建企业级的后台管理系统。本文将详细介绍如何使用 Vue 2.x 和 Element UI 来搭建一个后台管理系统,包括项目初始化、路由配置、状…

高级java每日一道面试题-2024年7月29日-并发篇-什么时候用乐观锁,什么时候用悲观锁?

面试官: 什么时候用乐观锁,什么时候用悲观锁? 我回答: 乐观锁和悲观锁是两种常用的并发控制策略,它们在多线程环境下用于保护共享资源免受并发修改的问题。下面我们将详细讨论这两种锁的使用场景和优缺点,以便你在实际开发中能够根据具体情况做出合适…