接口联调测试脚本优化

news2024/9/21 0:31:35

工作中,或者面试中,人家会问有没有什么优势?

你可以说我不光会写接口脚本,还能对接口脚本的结构进行了优化。

接口无非就是输入参数、发送请求、对响应结果进行比对,这些过程 都是一样的。如果不做一个通用的方法。10个接口要写10个方法类,100个更多,那如果 我有一个通用的方法,我只需要做不同的参数就可以了。这样我们脚本的量是最少的。但是所能实现的内容是非常多的。也就是同样的工作内容,但是有不同的工作效率,而且执行起来的速度也会更快一些,因为我们只需要输入数据,代码不需要进行修改,维护成本也会更低一些。

1、接口脚本的优化

1.1  接口脚本优化的价值

1、最大程度上提高了测试脚本的复用性,降低了测试脚本的维护成本

2、只需要不断的追加或替换相关的测试数据即可

3、方便后续接口测试工作的扩展以及测试执行

1.2  如何进行接口测试脚本结构优化

1、优化测试脚本类的设计,对应的接口测试方法需要传入参数。接口访问地址,接口参数(字典数据),接口预期返回结果,接口名称

2、在进行类的实例化的时候,再依据接口测试说明传入相关的参数值

如何进行脚本结构优化呢?

1.3  适用范围

1、适合于接口测试不需要返回值,也不需要特殊参数时

2、接口请求方式是一致的

2、 V1.0版本  基础版本五个类

定义一个登录类,定义五个方法。

# 针对多个接口进行联调测试,接口内容如下:
# 1、用户注册接口
# 2、用户登录接口
# 3、忘记密码接口
# 4、提交密保问题答案
# 5、回答完密保问题后修改密码接口
import requests
# 定义一个接口联调的测试类
class workflow_forgetpassword_test():
    # 用户注册接口
    def yhzc_test(self):
        url="http://localhost:8080/jwshoplogin/user/register.do"
        # 正确的用户注册数据
        userinfo={"username":"张海1",
                  "password":"123456",
                  "email":"1234561@qq.com",
                  "phone":"13311095555",
                  "question":"最喜欢的水果",
                  "answer":"苹果"}
        # 发送注册请求,并获取响应
        response=requests.post(url,data=userinfo).text
        print(response)
        r=response.find("注册成功")
        if r>0:
            print("用户注册接口测试通过")
        else:
            print("用户注册接口测试失败")
    # 2、用户登录接口
    def yhdl_test(self):
        url="http://localhost:8080/jwshoplogin/user/login.do"
        # 正确的用户登录数据
        userinfo={"username":"张海1",
                    "password":"123456"}
        # 发送登录请求,并获取响应
        response=requests.post(url,data=userinfo).text
        print(response)
        r=response.find("登录成功")
        if r>0:
            print("用户登录接口测试通过")
        else:
            print("用户登录接口测试失败")
    # 3、忘记密码接口
    def wjmi_test(self):
        url="http://localhost:8080/jwshoplogin/user/forget_get_question.do"
        # 正确的用户忘记密码数据
        userinfo={"username":"张海1"}
        # 发送用户忘记密码请求,并获取响应
        response=requests.post(url,data=userinfo).text
        print(response)
        r=response.find("最喜欢的水果")
        if r>0:
            print("用户忘记密码接口测试通过")
        else:
            print("用户忘记密码接口测试失败")
    # 4、提交密保问题答案
    def tjmbwtda_test(self):
        url="http://localhost:8080/jwshoplogin/user/forget_check_answer.do"
        # 提交密保答案
        userinfo={"username":"张海1",
                  "question":"最喜欢的水果",
                  "answer":"苹果"}
        # 发送提交问题答案接口请求,并获取响应
        response=requests.post(url,data=userinfo).text
        print(response)
        # 1、字符串类型的返回结果,转化为字典类型
        dic={}
        dic=eval(response)
        token=dic["data"]
        print(token)
        # r=response.find("data")
        r = response.find(token)
        if r>0:
            print("提交问题答案接口请求接口测试通过")
        else:
            print("提交问题答案接口请求接口测试失败")
        # 返回获取到的token
        return token
    # 5、回答完密保问题后修改密码接口
    def hdwtxgmm_test(self,token):
        url="http://localhost:8080/jwshoplogin/user/forget_reset_password.do"
        # 提交密保答案
        print("传入的token",token)
        userinfo={"username":"张海1",
                  "passwordNew":"123456",
                  "forgetToken":token}
        # 发送提交问题答案接口请求,并获取响应
        response=requests.post(url,data=userinfo).text
        print(response)
        r = response.find("修改密码成功")
        if r>0:
            print("提交问题答案接口请求接口测试通过")
        else:
            print("提交问题答案接口请求接口测试失败")
        # 返回获取到的token

if __name__ == '__main__':
    workflowobj=workflow_forgetpassword_test()
    # 1、用户注册接口
    workflowobj.yhzc_test()
    # 2、用户登录接口
    workflowobj.yhdl_test()
    # 3、忘记密码接口
    workflowobj.wjmi_test()
    # 4、提交密保问题答案
    token=workflowobj.tjmbwtda_test()
    # print("返回的token",token)
    # 5、回答完密保问题后修改密码接口
    workflowobj.hdwtxgmm_test(token)
    # 2、用户登录接口
    workflowobj.yhdl_test()




3、 V2.0版本  方法的结构优化三各类

根据脚本的适用范围,可以选择优化。

#对多个接口组成的联调测试的脚本 进行结构优化

# 1、用户注册

# 2、用户登录

# 3、忘记密码

# 4、提交密保问题答案

# 5、回答完密保问题后修改密码

这个里面,用户注册、用户登录、忘记密码可以优化成一个接口联调的测试类workflow_forgetpassword_v2,需要从main函数中传入url,userinfo,expresult的参数。4和5需要传递token,因此不能和123写在一起。

# 对多个接口组成的联调测试的脚本进行结构优化V2
# 1、用户注册接口
# 2、用户登录接口
# 3、忘记密码接口
# 4、提交密保问题答案
# 5、回答完密保问题后修改密码接口
import requests
# 定义一个接口联调的测试类
class workflow_forgetpassword_v2_test():
    # 用户注册接口
    def userinterface_test(self,url,userinfo,expresult,interfacename):
        # 发送注册请求,并获取响应
        response=requests.post(url,data=userinfo).text
        print(response)
        r=response.find(expresult)
        if r>0:
            print(interfacename,"接口测试通过")
        else:
            print(interfacename,"接口测试失败")

if __name__ == '__main__':
    ##############注册接口测试数据及调用####################################
    url = "http://localhost:8080/jwshoplogin/user/register.do"
    # 正确的用户注册数据
    userinfo = {"username": "张海2",
                "password": "123456",
                "email": "12345612@qq.com",
                "phone": "13311095555",
                "question": "最喜欢的水果",
                "answer": "苹果"}
    expresult="注册成功"
    interfacename="用户注册接口"
    workflowobj2=workflow_forgetpassword_v2_test()
    workflowobj2.userinterface_test(url,userinfo,expresult,interfacename)

    #################登录接口测试数据及调用#########################################
    url = "http://localhost:8080/jwshoplogin/user/login.do"
    # 正确的用户登录数据
    userinfo = {"username": "张海2",
                "password": "123456"}
    expresult = "登录成功"
    interfacename = "用户登录接口"
    workflowobj2.userinterface_test(url, userinfo, expresult,interfacename)

4、V3.0 版本,在不同的python文件中进行接口模板类的实例化和调用

在不同的python文件中进行接口模板类的实例化和调用,新建一个python文件,把V2版本方法导入进来,可以在本版本调用

适合场所:多个接口测试开发工程师,同时编写不同的接口测试脚本,进行接口测试的执行

步骤:

1、创建一个新的python文件

2、在文件头部引入接口测试模板类所在文件

3、直接写main函数,进行类的实例化

4、传入相关的接口参数,进行接口测试方法的调用

# 在不同的文件中,调用通用接口测试脚本V3
import requests
from interfacetest.workflow_forgetpassword_v2 import workflow_forgetpassword_v2_test

if __name__ == '__main__':
    wjmaObj=workflow_forgetpassword_v2_test()
    # 定义接口的URL访问地址
    url="http://localhost:8080/jwshoplogin/user/forget_get_question.do"
    # 定义接口测试参数
    userinfo={"username":"张明"}
    # 定义接口预期返回值
    expresult="最喜欢的书"
    # 定义接口的名称
    interfacename="忘记密码接口"
    # 调用对应的接口测试方法
    wjmaObj.userinterface_test(url,userinfo,expresult,interfacename)

5、V4.0  脚本参数化

在上面的代码中,测试的参数始终在代码行间,因此修改起来比较麻烦。因此可以进一步优化,把相关的接口测试参数放入csv文件中。通过程序把相关的参数读取出来。传入接口测试脚本中

5.1 V4.1版本 解决相同参数的读取问题

首先要解决相同参数的读取问题,我们发现方法中需要传入的参数,都有url,expresult,interfacename,因此可以将他们放一起传入进去。

# v4.1: 共同的接口数据进行读取和传递
import csv
# 读取相关的接口测试文件
file=open("test1.csv","r")
table=csv.reader(file)
userinfo={}
for row in table:
    #逐行读取相关内容,并将其设置为相关的参数
    url=row[1]
    expresult=row[3]
    interfacename=row[5]
    print("url=",url,"  ","expresult=",expresult," ","interfacename=",interfacename)

输出结果:

"D:\Program Files\python\python.exe" D:/python/interface/interfacetest/test.py
url= http://localhost:8080/jwshoplogin/user/register.do    expresult= 注册成功   interfacename= 用户注册接口
url= http://localhost:8080/jwshoplogin/user/login.do    expresult= 登录成功   interfacename= 用户登录接口
url= http://localhost:8080/jwshoplogin/user/check_vaild.do    expresult= 校验成功   interfacename= 检测用户名或者邮件是否有效
url= http://localhost:8080/jwshoplogin/user/forget_get_question.do    expresult= 最喜欢的水果   interfacename= 忘记密码提示密保接口

Process finished with exit code 0

5.2  V4.1 解决参数个数不同的读取问题

我们可以看到,在发送的数据里,有的参数比较多,有的少。该怎么做呢。

1、找到参数的规律

共同的参数:URL:接口访问地址、expresult:接口响应预期结果、interfacename:接口名称

个性的参数:接口测试数据不同。

首先,将人工测试数据的个数,放到测试数据模板中。

分析从7到18 列,找到循环规律,初始值,终止值,每次变化几个

接着,存放入字典中,字典名[key]=value,userinfo[row[i]]=row[i+1]

一次循环结束后,要把字典数据清空,字典名={  }

价值:以后的接口测试,只需要维护接口测试数据的文档

不需要维护任何的代码

# # v4.2: 共同的接口数据进行读取和传递
import csv

# 读取相关的接口测试文件
file = open("test1.csv", "r")
table = csv.reader(file)
userinfo = {}
for row in table:
    j=int(row[6])
    for i in range(7,2*j+7,2):
        userinfo[row[i]]=row[i+1]
    print(userinfo)
    userinfo={}

输出结果:

"D:\Program Files\python\python.exe" D:/python/interface/interfacetest/test.py
{'username': '', 'password': '123456', 'email': 'lihui@13.com', 'phone': '13859645626', 'question': '最喜欢的水果', 'answer': '苹果'}
{'username': '张海', 'password': '123456'}
{'str': '李慧3', 'type': 'username'}
{'username': '李慧2'}

5.3 V4.3 版本 

# 使用参数化技术进行多个接口联调的测试脚本的优化V4.3

import requests
import csv
# 定义一个接口联调的测试类
class workflow_forgetpassword_v4_test():
    # 用户注册接口
    def userinterface_test(self,url,userinfo,expresult,interfacename):
        # 发送注册请求,并获取响应
        response=requests.post(url,data=userinfo).text
        print(response)
        r=response.find(expresult)
        if r>0:
            print(interfacename,"接口测试通过")
        else:
            print(interfacename,"接口测试失败")

if __name__ == '__main__':
    workflowobj=workflow_forgetpassword_v4_test()
    file=open("test1.csv","r")
    table=csv.reader(file)
    userinfo = {}
    for row in table:
        #逐行读取相关内容,并将其设置为相关的参数
        url=row[1]
        expresult=row[3]
        interfacename=row[5]
        print("url=", url, "  ", "expresult=", expresult, " ", "interfacename=", interfacename)

        # 读取接口测试数据
        userinfo = {}
        j=int(row[6])
        for i in range(7,j*2+7,2):
            userinfo[row[i]]=row[i+1]
        print(userinfo)
        workflowobj.userinterface_test(url,userinfo,expresult,interfacename)

输出结果为:

"D:\Program Files\python\python.exe" D:/python/interface/interfacetest/workflow_test_v4.py
url= http://localhost:8080/jwshoplogin/user/register.do    expresult= 注册成功   interfacename= 用户注册接口
{'username': '', 'password': '123456', 'email': 'lihui@13.com', 'phone': '13859645626', 'question': '最喜欢的水果', 'answer': '苹果'}
{"status":1,"msg":"用户名已经存在"}
用户注册接口 接口测试失败
url= http://localhost:8080/jwshoplogin/user/login.do    expresult= 登录成功   interfacename= 用户登录接口
{'username': '张海', 'password': '123456'}
{"status":0,"msg":"登录成功","data":{"id":25,"username":"张海","password":null,"email":"123456@qq.com","phone":"13311095555","question":"最喜欢的水果","answer":"苹果","role":0,"createTime":1718700342000,"updateTime":1718710506000}}
用户登录接口 接口测试通过
url= http://localhost:8080/jwshoplogin/user/check_vaild.do    expresult= 校验成功   interfacename= 检测用户名或者邮件是否有效
{'str': '李慧3', 'type': 'username'}
{"status":0,"msg":"校验成功"}
检测用户名或者邮件是否有效 接口测试通过
url= http://localhost:8080/jwshoplogin/user/forget_get_question.do    expresult= 最喜欢的水果   interfacename= 忘记密码提示密保接口
{'username': '李慧2'}
{"status":0,"data":"最喜欢的水果"}
忘记密码提示密保接口 接口测试通过

Process finished with exit code 0

6、V5.0 编写接口测试报告

这个版本需要解决的问题是需要把接口实际响应结果以及测试结论存入测试报告

测试报告设计:接口名称、接口实际返回值、接口测试结论

使用字典数据进行测试结论以及接口实际返回值接收,如resultdata={"实际返回结果":response,"测试结论":"测试通过"}

将字典数据的内容写入测试报告,每完成一组测试,写入一条结论。

6.1  V5.1 定义一个接口联调的测试类,测试报告在main中写。

以登录接口为例,编写测试报告。

# 定义一个接口联调的测试类,测试报告在main中写。
class workflow_forgetpassword_v5_test():
    # 用户登录接口


    def userinterface_test(self,url,userinfo,expresult,interfacename):
        # 定义字典数据,存储实际接口响应结果和测试结论
        resultdate={}
        # 发送登录请求,并获取响应
        response=requests.post(url,data=userinfo).text
        print(response)
        resultdate["接口实际返回值"] = str(response)
        r=response.find(expresult)
        if r>0:
            print(interfacename,"接口测试通过")
            resultdate["测试结论"]="测试通过"
        else:
            print(interfacename,"接口测试失败")
            resultdate["测试结论"] = "测试失败"
        print(resultdate)
        return resultdate

    # 把相关的测试结论写入测试报告
    def result_report(self,reportfilename):
        file=open(reportfilename,'a')
        for key,value in resultdate.items():
            file.write(key+","+value+",")
        file.write("\n")
        file.close()
if __name__ == '__main__':
    file2 = open("testresult2.csv", "w")
    resultdata={}
    workflowobj=workflow_forgetpassword_v5_test()
    url = "http://localhost:8080/jwshoplogin/user/login.do"
    # 正确的用户登录数据
    userinfo = {"username": "张海2",
                "password": "123456"}
    expresult = "登录成功"
    interfacename = "用户登录接口"
    resultdate = workflowobj.userinterface_test(url, userinfo, expresult, interfacename)
    for key,value in resultdate.items():
        file2.write(key+","+value+",")
    file2.close()

测试结论:

"D:\Program Files\python\python.exe" D:/python/interface/interfacetest/workflow_test_v5.py
{"status":0,"msg":"登录成功","data":{"id":27,"username":"张海2","password":null,"email":"12345612@qq.com","phone":"13311095555","question":"最喜欢的水果","answer":"苹果","role":0,"createTime":1718772713000,"updateTime":1718772713000}}
用户登录接口 接口测试通过
{'接口实际返回值': '{"status":0,"msg":"登录成功","data":{"id":27,"username":"张海2","password":null,"email":"12345612@qq.com","phone":"13311095555","question":"最喜欢的水果","answer":"苹果","role":0,"createTime":1718772713000,"updateTime":1718772713000}}', '测试结论': '测试通过'}

Process finished with exit code 0

最后CSV中测试是通过的

6.2 V5.2  定义一个接口联调的测试类,测试结论写文件中,a 追加写,单独写一个方法


# 定义一个接口联调的测试类,测试结论写文件中,a 追加写,单独写一个方法。
class workflow_forgetpassword_v5_test():
    # 用户登录接口
    def userinterface_test(self,url,userinfo,expresult,interfacename):
        # 定义字典数据,存储实际接口响应结果和测试结论
        resultdate={}
        # 发送注册请求,并获取响应
        response=requests.post(url,data=userinfo).text
        print(response)
        resultdate["接口实际返回值"] = str(response)
        r=response.find(expresult)
        if r>0:
            print(interfacename,"接口测试通过")
            resultdate["测试结论"]="测试通过"
        else:
            print(interfacename,"接口测试失败")
            resultdate["测试结论"] = "测试失败"
        print(resultdate)
        return resultdate

    # 把相关的测试结论写入测试报告
    def result_report(self,reportfilename,resultdate):
        file=open(reportfilename,'a')
        for key,value in resultdate.items():
            file.write(key+","+value+",")
        file.write("\n")
        file.close()

if __name__ == '__main__':
    # file2 = open("testresult2.csv", "a")
    resultdata={}
    workflowobj=workflow_forgetpassword_v5_test()
    url = "http://localhost:8080/jwshoplogin/user/login.do"
    # 正确的用户登录数据
    userinfo = {"username": "张海2",
                "password": "123456"}
    expresult = "登录成功"
    interfacename = "用户登录接口"
    resultdate = workflowobj.userinterface_test(url, userinfo, expresult, interfacename)
    workflowobj.result_report("testresult3.csv",resultdate)

输出结果:

{"status":0,"msg":"登录成功","data":{"id":27,"username":"张海2","password":null,"email":"12345612@qq.com","phone":"13311095555","question":"最喜欢的水果","answer":"苹果","role":0,"createTime":1718772713000,"updateTime":1718772713000}}
用户登录接口 接口测试通过
{'接口实际返回值': '{"status":0,"msg":"登录成功","data":{"id":27,"username":"张海2","password":null,"email":"12345612@qq.com","phone":"13311095555","question":"最喜欢的水果","answer":"苹果","role":0,"createTime":1718772713000,"updateTime":1718772713000}}', '测试结论': '测试通过'}

7、V6.0 最终完整版

经过上面的试验,我们需要把功能都合并到一起。

1、一个脚本的程序就可以对应若干条接口测试

2、只需要维护测试数据就可以完成任意一组接口的测试

3、把所有接口测试的结论自动生成测试报告文件

# 把测试脚本结构优化,脚本参数化,以及测试报告所有的技术进行合并V6.0
import csv
import requests

# 定义测试类
class workflow_forgetpassword_v6_test():
    # 接口测试通用脚本
    def userinterface_test(self, url, userinfo, expresult, interfacename):
        # 定义字典数据,存储实际接口响应结果和测试结论
        resultdate = {}
        # 发送注册请求,并获取响应
        response = requests.post(url, data=userinfo).text
        print(response)
        resultdate["接口实际返回值"] = str(response)
        r = response.find(expresult)
        if r > 0:
            print(interfacename, "接口测试通过")
            resultdate["测试结论"] = "测试通过"
        else:
            print(interfacename, "接口测试失败")
            resultdate["测试结论"] = "测试失败"
        print(resultdate)
        return resultdate

    # 把相关的测试结论写入测试报告
    def result_report(self,reportfilename,resultdate,interfacename):
        file=open(reportfilename,'a')
        for key,value in resultdate.items():
            file.write(interfacename+","+key+","+value+",")
        file.write("\n")
        file.close()

if __name__ == '__main__':
    workflowobj=workflow_forgetpassword_v6_test()
    reportfilename="testresultnew.csv"
    file=open("test1.csv","r")
    table=csv.reader(file)

    for row in table:
        #逐行读取相关内容,并将其设置为相关的参数
        url=row[1]
        expresult=row[3]
        interfacename=row[5]
        print("url=", url, "  ", "expresult=", expresult, " ", "interfacename=", interfacename)
        # 读取接口测试数据
        userinfo = {}
        resultdata={}
        j=int(row[6])
        for i in range(7,j*2+7,2):
            userinfo[row[i]]=row[i+1]
            # 调用接口测试方法,传入接口测试数据
        resultdata=workflowobj.userinterface_test(url, userinfo, expresult, interfacename)
        #调用写入测试报告文件,传入测试结论及实际接口参数
        workflowobj.result_report(reportfilename,resultdata,interfacename)

下面是运行结果:

url= http://localhost:8080/jwshoplogin/user/register.do    expresult= 注册成功   interfacename= 用户注册接口
{"status":1,"msg":"用户名已经存在"}
用户注册接口 接口测试失败
{'接口实际返回值': '{"status":1,"msg":"用户名已经存在"}', '测试结论': '测试失败'}
url= http://localhost:8080/jwshoplogin/user/login.do    expresult= 登录成功   interfacename= 用户登录接口
{"status":0,"msg":"登录成功","data":{"id":25,"username":"张海","password":null,"email":"123456@qq.com","phone":"13311095555","question":"最喜欢的水果","answer":"苹果","role":0,"createTime":1718700342000,"updateTime":1718710506000}}
用户登录接口 接口测试通过
{'接口实际返回值': '{"status":0,"msg":"登录成功","data":{"id":25,"username":"张海","password":null,"email":"123456@qq.com","phone":"13311095555","question":"最喜欢的水果","answer":"苹果","role":0,"createTime":1718700342000,"updateTime":1718710506000}}', '测试结论': '测试通过'}
url= http://localhost:8080/jwshoplogin/user/check_vaild.do    expresult= 校验成功   interfacename= 检测用户名或者邮件是否有效
{"status":0,"msg":"校验成功"}
检测用户名或者邮件是否有效 接口测试通过
{'接口实际返回值': '{"status":0,"msg":"校验成功"}', '测试结论': '测试通过'}
url= http://localhost:8080/jwshoplogin/user/forget_get_question.do    expresult= 最喜欢的水果   interfacename= 忘记密码提示密保接口
{"status":0,"data":"最喜欢的水果"}
忘记密码提示密保接口 接口测试通过
{'接口实际返回值': '{"status":0,"data":"最喜欢的水果"}', '测试结论': '测试通过'}

Process finished with exit code 0

这样就能实现参数化并能输出测试结论,提高了执行的效率。

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

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

相关文章

【Java并发编程之美 | 第一篇】并发编程线程基础

文章目录 1.并发编程线程基础1.1什么是线程和进程?1.2线程创建与运行1.2.1继承Thread类1.2.2实现Runnable接口1.2.3实现Callable接口(与线程池搭配使用)1.2.4小结 1.3线程常用方法1.3.1线程等待与通知1.3.2线程睡眠1.3.3让出CPU执行权1.3.4线…

【JS重点16】对象原型

目录 一:对象原型是什么 二:对象原型作用 三:constructor属性 四:如何赚钱 一:对象原型是什么 每个对象都有一个属性__proto__(称为原型对象),该属性是一个对象 __proto__是JS非标准属性在实例对象中,…

【leetcode37-51】二叉树

94. 二叉树的中序遍历 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def inorderTraversal(self, root: O…

Certificate数字证书的有效性验证

1.证书相关概念 在讲证书有效性验证的逻辑之前,先了解几个概念。 证书颁发机构:一般为运营数字证书的机构,该机构负责证书的签发、吊销等生命周期管理。证书链:证书颁发机构一般会由多个组成,为树状层级,第…

产品Web3D交互展示有什么优势?如何快速制作?

智能互联网时代,传统的图片、文字、视频等产品展示方式,因为缺少互动性,很难引起用户的兴趣,已经逐渐失去了宣传优势。 Web3D交互展示技术的出现,让众多品牌和企业找到了新的方向,线上产品展示不在枯燥无趣…

大屏适配方案汇总

1. 适配方案1:rem font-size 我们都知道,在 css 中 1rem 等于 html 根元素设定的 font-size 的 px 值,通过动态的修改html 根元素的 font-size 大小就能动态的改变 rem 的大小,从而实现适配。 原理 动态设置 HTML 根字体大小将…

大模型上下文实验之大海捞针和数星星

大模型上下文实验之大海捞针和数星星 大海捞针和数星星大海捞针大海捞针测试简介Greg Kamradt 的“大海捞针”实验实验步骤实验预期 ChatGPT-4 128K的实验结果Claude-2.1 200K的实验结果 数星星数星星简介多证据获取多证据推理 实验结果多证据获取任务示例多证据推理任务示例 数…

Adobe Premiere 视频编辑软件下载安装,pr 全系列资源分享!

Adobe Premiere以其强大的功能、灵活的操作和卓越的性能,成为视频编辑领域的佼佼者。 在剪辑方面,Adobe Premiere提供了强大而灵活的工具集。用户可以在直观的时间线上对视频进行精细的裁剪、剪辑和合并操作。无论是快速剪辑短片,还是精心打造…

洗地机哪个品牌比较好?四款好用靠谱的优质洗地机推荐

随着现代生活节奏的加快,家庭清洁成了一项耗时且繁琐的任务。洗地机凭借其智能化和高效的清洁能力,越来越受到大家的青睐。然而,市场上各种品牌和型号琳琅满目,让人眼花缭乱。为了帮助大家在众多选择中找到心仪的产品,…

真人模特+虚拟模特:阿里通义万相带你体验全新的卖家秀!

哈喽,大家好,我是木头左,致力于程序服务生活! 一、引言 在数字化和虚拟化的时代,正在经历一场由人工智能驱动的革命。这场革命不仅改变了的生活,也正在改变的商业环境。阿里巴巴集团是这场革命的重要参与者…

铁路定向声波冲击波智能驱鸟器

对于铁路系统来说,鸟类活动会带来潜在的安全隐患。铁路沿线的接触网、电杆等设备,是鸟类筑巢的理想场所,但鸟类在筑巢过程中,常常使用的树枝、铁丝等杂物,一旦掉落在接触网设备上,就可能造成带电体与接地侧…

6月19日(周三)A股行情总结:A股震荡收跌,恒生科技指数大涨3%,10年期国债期货转涨续创新高

内容提要 车路云概念延续昨日涨势,华铭智能20CM 3连板。贵金属及PEEK材料概念全日走强;港股有色金属及能源股走强,紫金矿业涨超3%,中石油涨超3%。国债期货午后全线转涨,10年期主力合约涨0.05%报104.925元,…

2024年一年一度的618正式结束了,苹果与华为手机销量看看谁是大赢家?

一年一度的618正式结束了,各品牌基本上都发布了相应的战报。但是要告诉大家一点看战报要看定语,定语最少的才是真正的第一。现在给大家汇总下京东平台的数据,看看谁是最大赢家,谁又是国产荣光。注:所有数据截至6月18日…

好用的linux一键换源脚本

最近发现一个好用的linux一键换源脚本&#xff0c;记录一下 官方链接 大陆使用 bash <(curl -sSL https://linuxmirrors.cn/main.sh)# github地址 bash <(curl -sSL https://raw.githubusercontent.com/SuperManito/LinuxMirrors/main/ChangeMirrors.sh) # gitee地址 …

C语言练习01-循环

一、打印五行五列的三角形 如下图&#xff1a; #include<stdio.h>int main() {for (int i 1;i < 5; i){for (int j i; j < 5; j){printf("*");}printf("\n");}return 0; }#include<stdio.h>int main() {for (int i 1;i < 5; i){f…

鸿蒙开发通信与连接:【@ohos.bluetooth (蓝牙)】

蓝牙 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 蓝牙模块提供了基础的传统蓝牙能力以及BLE的扫描、广播等功能。 导入模块 import bluetooth from ohos.bluetooth;bluetooth.enableBluet…

6.S081的Lab学习——Lab7: Multithreading

文章目录 前言一、Uthread: switching between threads (moderate)提示&#xff1a;解析 二、Using threads (moderate)解析&#xff1a; 三、Barrier (moderate)解析&#xff1a; 总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招。打算尝试6.S081&#xff0c;将它的…

讨论字符串(未完)

讨论字符串 C语言中的字符串C中的字符串string类的构造函数string类对象的容量操作string类对象元素访问及遍历迭代器 string类对象的修改操作 string类的模拟实现成员变量构造函数析构函数扩容/预留空间push_back遍历operator[]迭代器 append任意位置插入数据和删除数据查找元…

PID控制算法学习笔记分享

目录 一、参数设定 二、PID计算公式 三、位置式PID代码实现 四、增量式PID代码实现 五、两种控制算法的优缺点 六、PID算法的改进 一、参数设定 比例系数&#xff08;kp&#xff09;&#xff1a;P项的作用是根据当前误差的大小来产生一个控制量。它直接与误差成正比&#…

Tensorflow入门实战 T05-运动鞋识别

目录 一、完整代码 二、训练过程 &#xff08;1&#xff09;打印2行10列的数据。 &#xff08;2&#xff09;查看数据集中的一张图片 &#xff08;3&#xff09;训练过程&#xff08;训练50个epoch&#xff09; &#xff08;4&#xff09;训练结果的精确度 三、遇到的问…