python+request+unittest+ddt自动化框架

news2024/10/10 21:52:29

参考资料:

用户中心 - 博客园 抓包模拟器笔记

肖sir__接口自动化python+request+ddt(模版) - xiaolehua - 博客园 python+request+unittest+ddt自动化框架

博文阅读密码验证 - 博客园

肖sir__python之模块configparser - xiaolehua - 博客园 configparser 模块

https://www.cnblogs.com/xiaolehong/p/16801208.html  ddt

第1层的话是config配置层,这个里面主要是封装了一些我们测试环境的url地址和一些连接数据库的IP地址,用户名密码等等

第2层是data数据层,这个里面主要放的是接口的用例,把接口的入参,接口的路径,接口的编号,请求方法都放在这个里面了,一个接口放在一个sheet页面里面,然后一个sheet页面里面有多个接口测试用例,有正常场景的也有多个异常场景的

第3层是一个library第三方的公共库层,里面主要是放了发邮件的工具类,生成测试报告的工具类还有做数据驱动的ddt模块

第4层就是utils工具类层,主要封装了读取Excel表格,读取ini配置文件和发送接口请求的工具类

第5层就是testcase用例层,这个里面首先会创建一个类,然后在里面创建以test开头的方法,然后定义一个data装饰器主要是用来接受Excel表格里面的接口入参,第一步先做数据的处理,然后第二步再通过封装好的发接口请求的工具类发送接口请求得到response返回值,第三步再对接口进行断言,一般会对接口返回的状态码和返回的比较具有唯一性的文本信息进行断言

第6层就是run运行层,首先会通过把所有的用例加载到一个suite套件里面,然后再通过调用run方法运行这个套件,并且通过HTMLtestrunner模块生成测试报告放到report包

第7层报告层里面,然后最后通过Jenkins做可持续集成,在回归测试阶段,每天晚上都会运行一下我们的接口自动化用例,大致的一个框架结构就是这样的。

流程讲解:

用分层思想进行接口自动化框架: python+requests+unittest+ddt

先建立一个新的项目,然后建一些包,

定义一个confi包是用来组建接口请求的,

定义一个data包用来存放测试用例表格的,

定义一个library包存放外部导入的工具函数,

定义一个report包存放最终的测试报告,

定义一个run_allcase包执行所有的用例并生成报告用的,

定义一个testcase包在里面运行编写的测试用例,

定义一个utils包存放所有自己写的封装语句。

首先在utils包下新建一个head_path模块在里面编写项目与包的路径。

在conf包下建一个conf.ini文件里面写入要运行的系统基本信息和登陆账号密码。

在utils包下新建一个head_conf模块在里面编写处理ini文件的代码。

在utils包下新建一个head_requests模块在里面写入封装接口的工具类。

在utils包下新建一个head_excel模块在里面写入读取表格的代码,使用pip3 install openpyxl下载。

在testcase包下新建一个test_login模块在里面写入数据驱动的代码,需要拿到ddt这个工具函数。

在wandwos系统中新建一个表格,表格内写入id、接口名称、用例标题、用例类型、url、要填写的信息、预期结果、是否通过空置。然后将表格导入项目包中的data包内。

在testcase包下新建一个test_login模块,用来写入运行表格用例的代码。

最后把HTML文件导入到项目包内的library包下,然后在run_allcase包下新建一个模块,里面写入运行所有用例的代码,和生成测试报告的代码。并将报告的存放路径放到report包下。

1、先跑通流程,输出测试 报告(加两条接口) 2、自己尝试写 3、整理讲解稿

复习UI自动化框架:

UI自动化框架可以分为8个模块,conf、data、public、pageobject、testcase、runner、report、log。

conf是用来储存系统环境、数据库、邮件的配置参数、项目的绝对路径、各个模块的绝对路径,其中文件有ini、yaml、xlsx文件等,通过响应的方法来处理相应的文件。ini文件一般通过继承configparse模块进行处理,yaml一般使用@unittest.skip@file_data@unpack装饰器进行读取,xlsx主要通过引用openxlrd、xlrd、xlwt、xlutils处理。

data是用来储存用来进行测试用例的测试数据,通过xlsx处理,然后通过公共的读xlsx方法进行处理。

public可以分为两部分,一部分可以用来储存自己设计的模块,如调用数据库模块,用到pymysql模块、日志输出模块用到logging模块、邮件发送模块用到smtp模块和email模块、处理ini文件模块用到configparse模块、读取xlsx测试用例数据模块用到openxlrd模块、xlrd模块、xlwt模块、xlutil模块,另一部分是用来封装对UI页面的处理基类,用到的selenium模块,其中包括选择驱动、打开网页、定位元素、鼠标移动、鼠标点击、动态等待、输入内容等。Base类中通过设置一个set-driver的类方法建立一个driver对象,然后测试用例来调取这个Base类中的set-driver方法中的driver对象,就可以通过单例模式来实现测试用例。有时候我们还在这个模块中针对每个流程进行封装。

pageElement是封装了当前界面的所有元素,这样我们就实现了元素定位、流程、案例的分离,降低代码之间的耦合度,降低维护成本。

testcase是用来封装测试用例,在此模块中我们可以通过调用基类的set-driver类方法实现单例模式。通过unitest框架继承unitest.TestCas设计测试用例。用到ddt数据驱动来输入测试数据。

runner是用来封装要运行的测试用例,还是通过使用unitest模块中的unitest.TestSuite来装测试用例,unitest.TestRunner,HTMLTestRunner来执行测试用例。

report是用来存储运行测试用例后的结果,用到HTMLTestRunner。

log是用来储存运行测试用例的日志,用到logging模块,设置输出的控制台的日志等级,设置输出到文件的日志等级等。

python+request+unittest+ddt自动化框架:

1.首先新建一个项目,新建包:

conf配置包:域名,账号密码。

data;存放数据:接口用例,用例Excel表

library:外部函数包,工具类:报告模板,邮件模板

report:报告包:接收测试用例运行报告

run_allcase:运行包:运行的内容

testcase:用例包:封装测试用例,通过调用基类的set-driver类方法实现单例模式。通过unitest框架继承unitest.TestCas设计测试用例。用到ddt数据驱动来输入测试数据。

utils:工具类:自己封装的方法

2.library放入模版工具

3.conf新建ini文件输入节点和键值

4.utils新建处理conf、Excel、path、request文件的模块和封装登录的公共方法

5.testcase包放login、delete、update用例,

6.run包写运行文件

7.report包接收生成的报告

1.library存入email和网页驱动文件;

写入conf文件。注意网址是否可访问

[env]
url = http://cms.duoceshi.cn
headers = {"Content-Type":"application/x-www-form-urlencoded;charset=UTF-8"}

[test_data]
username=admin
pwd=123456

[db]

[email]

2.定义路径。需要OS路径模块

#coding=utf-8

'''
此模块是用来组件项目的各个包的路径
'''
import os

# 定义项目的路径
# 获取当前运行脚本的绝对路径
base_path = os.path.dirname(os.path.dirname(__file__))
# print(base_path)

# 定义conf的路径
conf_path = os.path.join(base_path,'conf')

# 定义data的路径
data_path = os.path.join(base_path,'data')

# 定义report路径
report_path = os.path.join(base_path,'report')

#定义testcase路径
testcase_path = os.path.join(base_path,'testcase')

3.处理conf文件。导入处理读取和操作配置模块,OS路径模块,路径处理里的所有模块,使用类,

#coding=utf-8

'''
此模块是用来处理conf.ini文件的
'''
from configparser import ConfigParser
from utils.handle_path import *
import os
class Handle_conf(ConfigParser):
    '''
    当前这个类是用来处理conf.ini文件的工具类
    '''
    def __init__(self,filename):
        super(Handle_conf,self).__init__()  #继承父类的构造方法
        self.filename = filename  #把传进来的形式参数赋值给到实例变量self.filename
        self.read(self.filename)  #打开ini文件进行读取

    def get_value(self,section,option):
        '''
        获取ini文件中的section下面对应的option的value值
        '''
        value = self.get(section,option)
        return value
path=os.path.join(conf_path,"conf.ini") #两个路径拼接
conf = Handle_conf(path) #创建对象。调用类并传入配置文件

注释参考:

from configparser import ConfigParser  #导入下载的模块,用于读取和操作配置文件,使配置文件生效
from utils.handle_path import  *  #从路径处理文件导入模块
import os  #导入OS模块,处理文件路径、检查文件是否存在等
class Handle_conf(ConfigParser): #创建一个类处理ini的工具类
    def __init__(self,filename):  #类的构造方法,创建类的实例时被调用
        super(Handle_conf,self).__init__()#继承父类的构造方法
        self.filename=filename #将传入的参数文件名赋值给实例变量,以便在类的其他方法中使用
        self.read(self.filename) #读取对象文件名
    def get_value(self,section,option): #自定义函数获取value值,conf文件里的节点和键值
        value=self.get(section,option) #自定义变量
        return value  #返回变量

4.传入xlsx表格。在本地data路径中修改传入表格

表格包括用例ID、用例名称、用例标题、请求方法、URL、请求体、预期结果,最下边命名接口名称

5.处理表格,导入表格操作模块,路径模块,OS模块

#coding=utf-8


'''
pip install openpyxl    下载openpyxl库
此模块是用来读取表格的工具类
'''
import openpyxl   #操作Excel表格的库
from utils.handle_path import *
import os

class Handle_Excel(object):
    '''封装一个班读取Excel表格的工具类'''

    def __init__(self,filename,sheet_name):
        self.filename = filename
        self.sheet_name = sheet_name

    def open(self):
        '''封装一个打开Excel表格的工具方法'''
        #通过openpyxl模块调用load_workbook函数打开filename文件
        self.wb = openpyxl.load_workbook(self.filename)
        # 通过self.wb这个Excel文件的对象读取对应的sheet页面的
        self.sh = self.wb[self.sheet_name]

    def read_data(self):
        '''封装了一个读取Excel表格的工具方法'''
        self.open()   #打开Excel表格

        #获取表格中的每一行的数据放在元组当中
        datas = list(self.sh.rows)  #把每一行的元素数据放在list列表当中
        # print(datas)  #datas是取到的所有行数据的对象,打印出来的A1,B1,C1。。。。。对应表格的A1,B1,C1。。。。
        # for i in datas[0]:  #通过for循环拿到里面的值,datas[0]取的是第一行的数据的对象
        #     print(i.value)
        #列表解析式
        title = [i.value for i in datas[0]]  #对这个datas进行for循环遍历并且赋值给title这个变量
        # print(title)

        #创建一个空列表,用来接收所有的测试用例
        cases = []
        for j in datas[1:]:  #对第2,3,4,5,6......行进行遍历
            # print(j)
            values = [k.value for k in j]  #然后通过对j进行遍历,用k.value获取没有用例对象中value值,然后放在一个列表
            # print(values)
            case = dict(zip(title,values))  #把title列表和values每个用例一一对应打包放进一个字典当中
            # print(case)
            cases.append(case)
        return  cases #把所有的用例返回
    def write_excel(self,row,column,value=None):
        '''
        封装一个往Excel表格里面写入测试结果的工具方法
        '''
        #打开表格
        self.open()
        # 往固定的row行和column列写入value数据
        self.sh.cell(row,column,value)
        #保存数据
        self.wb.save(self.filename)
if __name__ == '__main__':
    path = os.path.join(data_path,'apicase.xlsx')
    read_excel = Handle_Excel(path,'login')
    # read_excel.read_data()  #打印出来的A1,B1,C1.....拿到的对应的对象,没有拿到值
    read_excel.write_excel(2,8,'通过')

6.封装发送接口请求,导入requests模块

#coding=utf-8

'''
此模块是用来封装发送接口请求的工具类
'''
import requests
class Send_requests(object):
    '''封装了一个发送接口请求的工具类'''

    def __init__(self):
        '''用来保持会话'''
        self.session = requests.Session()

    def send(self,method,url,data=None,json=None,params=None,headers=None):
        method = method.lower()  #把接口的请求方法改为小写
        if method == 'get':
            response = self.session.get(url,params)
        elif method=="post":
            response = self.session.post(url,data,headers)
        elif method=="post_json":
            response = self.session.post(url,json,headers)
        elif method == 'delete':
            response = self.session.delete(url,data)
        return response
# method = 'post'
# url ='http://cms.duoceshi.cn/cms/manage/loginJump.do'
# data ={"userAccount":"admin","loginPwd":"123456"}
# headers = {"Content-Type":"application/x-www-form-urlencoded"}
# s = Send_requests()
# se = s.send(method=method,url=url,data=data,headers=headers)
# print(se.json())

7.封装登录的公共办法,导入conf处理和接口请求模块

#coding=utf-8

'''
封装一个登录的公共方法
'''
from utils.handle_conf import conf
from utils.handle_requests import Send_requests
class Cms_login():
    def login(self):
        request = Send_requests()
        url = conf.get_value('env','url')+"/manage/loginJump.do"
        data = {"userAccount":"admin",
                "loginPwd":"123456"}
        headers = {"Content-Type":"application/x-www-form-urlencoded"}
        response = request.send(method='post',url=url,data=data,headers=headers)
        return request

8.写测试用例。导入ddt驱动模块、、、、、

login:

#coding=utf-8

import unittest
from ddt import ddt,data
from utils.handle_excel import Handle_Excel
from utils.handle_path import *
import os
from utils.handle_conf import conf
from utils.handle_requests import Send_requests
'''
ddt模块
打开dos窗口:输入 pip install ddt  进行下载
ddt模块:是用来做数据驱动的
ddt装饰器:用来装饰类
data装饰器:用来装饰方法的
装饰器的原理:就是闭包,闭包就是函数里面定义一个函数,外面的函数称为外函数,里面的函数称为内函数
外函数中返回内函数的函数名,也就是返回内函数的地址,内函数里面写装饰器的逻辑
'''
case_file = os.path.join(data_path,'apicase.xlsx')

@ddt
class Test_Login(unittest.TestCase):
    excel = Handle_Excel(case_file,'login')
    cases = excel.read_data()  #一个列表当中是5个字典,每个字典都是一个用例
    # print(cases)
    request = Send_requests()  #创建了一个发送接口请求的对象

    @data(*cases)
    def test_01_login(self,case):
        '''封装登录接口''' #数据要从Excel表格里面拿
        # 1.准备接口的入参
        url = conf.get_value('env','url')+case['url']
        print(url)
        # eval()  函数是用来执行一个字符串表达式,并返回表达式的值
        headers = eval(conf.get_value('env','headers'))
        method = case['method']
        data = eval(case['data'])
        excepted = eval(case['excepted'])
        case_id = case['case_id']
        case_id = case_id+1  #记录当前跑了几条用例

        # 2.发送接口请求
        response = self.request.send(method=method,url=url,data=data,headers=headers)
        result = response.json()
        # print(result)
        # 3.对接口的响应内容进行断言
        try:  #try尝试去执行代码
            self.assertEqual(excepted['msg'],result['msg'])  #断言期望结果和实际结果是否一直
            self.assertEqual(excepted['code'],result['code'])
        except Exception as e: #捕捉异常
            self.excel.write_excel(case_id,8,'未通过')
            print(e)
        else:
            self.excel.write_excel(case_id,8,'通过')

if __name__ == '__main__':
    unittest.main()

9.修改密码

#coding=utf-8

import unittest
from ddt import ddt,data
from utils.handle_excel import Handle_Excel
from utils.handle_path import *
import os
from utils.handle_conf import conf
from utils.handle_requests import Send_requests
from utils.base_login import Cms_login
'''
ddt模块
打开dos窗口:输入 pip install ddt  进行下载
ddt模块:是用来做数据驱动的
ddt装饰器:用来装饰类
data装饰器:用来装饰方法的
装饰器的原理:就是闭包,闭包就是函数里面定义一个函数,外面的函数称为外函数,里面的函数称为内函数
外函数中返回内函数的函数名,也就是返回内函数的地址,内函数里面写装饰器的逻辑
'''
case_file = os.path.join(data_path,'apicase.xlsx')

@ddt
class Test_Login(unittest.TestCase):
    excel = Handle_Excel(case_file,'updateLoginPwd')
    cases = excel.read_data()  #一个列表当中是5个字典,每个字典都是一个用例
    # print(cases)
    request = Send_requests()  #创建了一个发送接口请求的对象
    @classmethod
    def setUpClass(cls) -> None:
        cls.request = Cms_login().login()  #调用登录接口


    @data(*cases)
    def test_02_updateLoginPwd(self,case):
        '''封装修改密码接口''' #数据要从Excel表格里面拿
        # 1.准备接口的入参
        url = conf.get_value('env','url')+case['url']
        print(url)
        # eval()  函数是用来执行一个字符串表达式,并返回表达式的值
        headers = eval(conf.get_value('env','headers'))
        method = case['method']
        data = eval(case['data'])
        excepted = eval(case['excepted'])
        case_id = case['case_id']
        case_id = case_id+1  #记录当前跑了几条用例

        # 2.发送接口请求
        response = self.request.send(method=method,url=url,data=data,headers=headers)
        result = response.json()
        # print(result)
        # 3.对接口的响应内容进行断言
        try:  #try尝试去执行代码
            self.assertEqual(excepted['msg'],result['msg'])  #断言期望结果和实际结果是否一直
            self.assertEqual(excepted['code'],result['code'])
        except Exception as e: #捕捉异常
            self.excel.write_excel(case_id,8,'未通过')
            print(e)
        else:
            self.excel.write_excel(case_id,8,'通过')
if __name__ == '__main__':
    unittest.main()

10.删除

#coding=utf-8

import unittest
from ddt import ddt,data
from utils.handle_excel import Handle_Excel
from utils.handle_path import *
import os
from utils.handle_conf import conf
from utils.handle_requests import Send_requests
from utils.base_login import Cms_login
'''
ddt模块
打开dos窗口:输入 pip install ddt  进行下载
ddt模块:是用来做数据驱动的
ddt装饰器:用来装饰类
data装饰器:用来装饰方法的
装饰器的原理:就是闭包,闭包就是函数里面定义一个函数,外面的函数称为外函数,里面的函数称为内函数
外函数中返回内函数的函数名,也就是返回内函数的地址,内函数里面写装饰器的逻辑
'''
case_file = os.path.join(data_path,'apicase.xlsx')

@ddt
class Test_Login(unittest.TestCase):
    excel = Handle_Excel(case_file,'delete')
    cases = excel.read_data()  #一个列表当中是5个字典,每个字典都是一个用例
    # print(cases)
    request = Send_requests()  #创建了一个发送接口请求的对象
    @classmethod
    def setUpClass(cls) -> None:
        cls.request = Cms_login().login()  #调用登录接口


    @data(*cases)
    def test_03_delete(self,case):
        '''封装登录接口''' #数据要从Excel表格里面拿
        # 1.准备接口的入参
        url = conf.get_value('env','url')+case['url']
        print(url)
        # eval()  函数是用来执行一个字符串表达式,并返回表达式的值
        headers = eval(conf.get_value('env','headers'))
        method = case['method']
        data = eval(case['data'])
        excepted = eval(case['excepted'])
        case_id = case['case_id']
        case_id = case_id+1  #记录当前跑了几条用例

        # 2.发送接口请求
        response = self.request.send(method=method,url=url,data=data,headers=headers)
        result = response.json()
        # print(result)
        # 3.对接口的响应内容进行断言
        try:  #try尝试去执行代码
            self.assertEqual(excepted['msg'],result['msg'])  #断言期望结果和实际结果是否一直
            self.assertEqual(excepted['code'],result['code'])
        except Exception as e: #捕捉异常
            self.excel.write_excel(case_id,8,'未通过')
            print(e)
        else:
            self.excel.write_excel(case_id,8,'通过')
if __name__ == '__main__':
    unittest.main()

11.运行。report包里看结果

#coding=utf-8

'''
此模块是用来生成测试报告,并且发送报告到邮箱`
'''
import time
import unittest
from library.HTMLTestRunnerNew import HTMLTestRunner
from utils.handle_path import *
from library.mail import SendMail
#定义生成报告的路径和文件
now = time.strftime('%Y-%m-%d-%H-%M-%S')
print(now)
filename = report_path+'\\' + str(now)+"_api_report.html"
def auto_run():
    discover = unittest.defaultTestLoader.discover(start_dir=testcase_path,
                                                   pattern='test_*.py')
    f = open(filename,'wb')
    runner = HTMLTestRunner(stream=f,
                            title='cms平台接口自动化测试报告',
                            description="用例执行情况如下",
                            tester="dcs")
    runner.run(discover)
    f.close()
def sendMail():
    sm = SendMail(send_msg=filename,attachment=filename)
    sm.send_mail()
if __name__ == '__main__':
    auto_run()
    # sendMail()

12.查看表格结果

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

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

相关文章

4G路由网关R10在智能制造生产线的应用

在当今智能制造的时代,高效稳定的网络连接和数据传输至关重要。4G 路由网关 R10 以其卓越的性能,在智能制造生产线中发挥着重要作用。 4G 路由网关 R10 是一款功能强大的网络设备。它支持多种网络连接方式,包括 4G 网络、有线网络等&#xff…

骨传导耳机哪个牌子好?五大高热度骨传导耳机测评推荐

随着科技的不断进步,耳机已经成为了我们日常生活中不可或缺的一部分。从传统的有线耳机到无线蓝牙耳机,再到现在的骨传导耳机,每一次技术的革新都给用户带来了全新的体验。骨传导耳机,作为一种新兴的耳机类型,它通过颅…

乐歌E5,E6系列升降桌质量如何?2024推荐必买的四款热销型号

在数字化时代,电脑桌成为了我们日常生活和工作中不可或缺的一部分。然而,长时间坐在固定高度的电脑桌前,不仅会影响我们的工作效率,还可能对身体健康造成不良影响。因此,一款能够电动升降的电脑桌显得尤为重要。 乐歌…

Linux-创建函数

基本的脚本函数 返回值 在函数中使用变量 数组变量和函数-向函数传递数组参数 数组变量和函数-从函数返回数组 函数递归 创建库 在命令行上使用函数-在命令行上创建函数 在命令行上使用函数-在.bashrc文件中定义函数

计算机组成的抽象以及相关技术

第1章 计算机抽象以及相关技术 最高端的服务器是超级计算机:几十万个处理器和太字节(terabyte)2的40次方的内存TB,成本数千万或数亿。通常写为1000000000000,万亿。 云计算接替了传统服务器称为仓储级计算机中心,可以实现Saas(软…

vue3的知识整理

1. vue3的生命周期 vue3的生命周期一般有2种形式写法,一种是基于vue2的options API的写法,一种是vue3特有的Composition API options API的生命周期 基本同vue2的生命周期基础,只是为了与生命周期beforeCreate和created对应,将bef…

餐企中场战事:高端网红退败,平价品牌向前

餐饮行业,风起云涌。人人都在讨论逆流与寒气的今天,品牌何以为战?步入平价时代,又该如何寻找制胜法宝? 01风浪越大,餐饮机会越多 如果把餐饮业的历史无限拉长,你会发现每个看似经济下行的节点…

Chromium 中前端HTMLDialogElement <Dialog> c++代码实现

一、HTMLDialogElement: open property Baseline Widely available The open property of the HTMLDialogElement interface is a boolean value reflecting the open HTML attribute, indicating whether the <dialog> is available for interaction. Value A boole…

CENTOS上的网络安全工具(三十)DPDK和HyperScan环境构建

一、预备知识 由于DPDK涉及到强CPU相关的优化策略&#xff0c;以及对网卡驱动栈的替换&#xff0c;所以在开始之前&#xff0c;首先需要垫补点CPU相关的概念&#xff0c;以及Linux上和网卡驱动相关的管理命令。 &#xff08;一&#xff09;CPU架构及相关概念 1. Socket、Core…

社交网络中的AI趋势:Facebook的创新探索

在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的迅速发展正在深刻改变社交网络的面貌。作为全球最大的社交媒体平台之一&#xff0c;Facebook在AI领域的创新探索&#xff0c;不仅提升了用户体验&#xff0c;还推动了整个社交网络生态的演变。本文将深入探讨…

Linux操作系统分析实验-用户与内核共享内存,实验二

Linux操作系统分析实验-多线程与内核模块编程&#xff0c;实验一_实验一 多线程与内核模块编程-CSDN博客 一、实验目的 1、理解Linux进程地址空间、虚拟内存、物理内存的概念&#xff1b; 2、理解物理内存分配和回收原理。 3、利用链表实现动态内存分配。 4、了解共享内存…

VMtools安装办法解决本地与虚机拷贝

一、打开虚拟机选项-重新安装VMware Tools 二、等待虚拟机开启&#xff0c;点开运行(WinR)输入D:/setup.exe 前提正常引用虚拟机光盘介质&#xff0c;保证光驱位置处于D盘&#xff0c;下一步进行安装完成。

Golang | Leetcode Golang题解之第466题统计重复个数

题目&#xff1a; 题解&#xff1a; func getMaxRepetitions(s1 string, n1 int, s2 string, n2 int) int {n : len(s2)cnt : make([]int, n)for i : 0; i < n; i {// 如果重新给一个s1 并且s2是从第i位开始匹配 那么s2可以走多少位&#xff08;走完了就从头开始走p1, p2 :…

Jenkins pipeline语法笔记

Jenkins pipeline 简介Jenkins Pipeline 优势DSL 是什么 pipeline支持两种语法&#xff1a;声明式pipeline语法&#xff1a;Pipelineagent Pipeline 声明式语法DeclarativeenvironmentoptionsparameterstriggerstoolsinputwhenParallel Pipeline Scripted语法流程控制Declarati…

【HarmonyOS】HMRouter使用详解(三)生命周期

生命周期&#xff08;Lifecycle&#xff09; 使用HMRouter的页面跳转时&#xff0c;想实现和Navigation一样的生命周期时&#xff0c;需要通过新建生命周期类来实现对页面对某一个生命周期的监控。 新建Lifecycle类 通过继承IHMLifecycle接口实现生命周期接口的方法重写。 通过…

20240904 华为笔试 二叉树消消乐

文章目录 题目解题思路代码BUG 代码最终代码题目 题目描述 给定原始二叉树和参照二叉树(输入的二叉树均为满二叉树,二叉树节点的值范围为[1,1000],二叉树的深度不超过1000),现对原始二叉树和参照二又树中相同层级目值相同的节点进行消除,消除规则为原始二叉树和参照二又树中…

进程概念三

1&#xff0c;运行状态R 1&#xff0c;理论&#xff1a; 在cpu中&#xff0c;有一个结构体&#xff1a;runqueue组成的一个双向链表&#xff0c;里面记录着对应的进程的代码和数据&#xff0c;存在内存中随时准备被调度&#xff0c;这种时候就叫做运行状态 2&#xff0c;why&a…

25西安电子科技大学考研预报名人数信息—公布

01报名信息直播 西安电子科技大学之前考研收集信息表现在公布&#xff0c;本次收集涉及到833、834、893&#xff08;原953&#xff09;专业&#xff0c;即计算机科学与技术学院、人工智能学院、网络与信息安全学院、卓越工程师学院 对于大家想提问的问题&#xff0c;学长学姐将…

AI智能聊天问答系统源码+AI绘画系统+图文搭建部署教程,文生图图生图,TTS语音识别输入,AI智能体,文档分析

一、前言 人工智能的快速进步吸引了全球的瞩目&#xff0c;各式AI应用如绘图、语言模型和视频处理等已在多个领域获得应用。这些技术不仅加速了科技的创新&#xff0c;也在艺术创作、内容生产和商业实践等方面显示了其巨大潜力。例如&#xff0c;AI语言模型极大提升了内容自动…

Cursor 与 DeepSeek API 的完美融合

在当今的编程领域中&#xff0c;选择合适的工具对于提高编程效率和质量至关重要。今天&#xff0c;我们将深入探讨如何将强大的 AI 辅助编程工具 Cursor 与优秀的 DeepSeek API 进行配置&#xff0c;以实现更加高效的编程体验。 一、Cursor&#xff1a;强大的 AI 辅助编程工具…