unittest接口测试框架设计

news2024/11/23 15:48:30

1、测试框架的价值

1、实现对所有测试脚本、测试数据文件以及测试报告文件的管理,提升接口测试执行和回归的效率。

2、降低人工的工作成本,可以在下班之后通过框架来自动运行,提高单位人工的产能。

3、框架可以应对多种不同的接口测试工作的需求,适用性和可扩展性强。

4、对接口测试成果物进行规范化管理,方便随时进行工作的开展以及成果物的查阅

2、测试框架设计思路

2.1 框架设计目标

最终只需要调整框架配置文件的一些参数,不需要人工干预测试脚本的执行

2.2 框架设计过程

1、明确框架层次确定下来

a、配置层: config   框架的配置文件 主要是CSV文件

b、脚本层:script  分为独立接口脚本ind_interface和联调接口脚本mul_interface

c、数据层:testdatafile 分为独立接口ind_interface,数据联调接口数据mul_interface

d、报告层:testresultfile 分为框架测试报告fram_result ,此次框架执行过程中,运行了哪些接口测试脚本

独立接口测试报告: ind_interface

联调接口测试报告:mul_interface

2、对框架的设计进行评审

3、创建框架对应的文件夹

名称最好都是英文的,拼音的

4、把现有相关的成果物归类

把现有相关的成果物归类,包括脚本成果物,测试数据文件,测试报告文件,框架配置文件等放入对应的文件夹中,把命名尽量有一个统一的规范。

5、框架的设计

6、框架的实现

7、框架的调试运行

3、框架试验

首先下载HTMLTestRunner.py

HTMLTestRunner - tungwaiyip's software

放在框架的文件夹下

3.1 V1.0版本,传入一组固定的测试数据,进行接口测试

需求:  通过unittest框架实现注册接口的测试

1、导入unittest类库

import unittest

2、定义测试类,必须继承unittest.TestCase

class测试类名(unittest.TestCase):

class test_updateuser(unittest.TestCase):

3、测试方法的名字必须以test_打头

    def test_case1(self):

4、在main函数中直接使用unittest.main()即可

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

5、加入测试断言

脚本中要进行预期结果和实际结果的对比

assert断言函数,

self.assertIn("更新个人信息成功",response)
       self.assertIn("更新个人信息成功",response)

6、通过使用setup进行测试的初始化工作

    def setUp(self):
        url="http://localhost:8080/jwshoplogin/user/login.do"
        userinfo={"username":"张海",
                  "password":"123456"}

        response=requests.post(url,data=userinfo)

        self.sessionID=dict(response.cookies)['JSESSIONID']
        print(self.sessionID)

7、通过使用teardown进行测试的回收工作

    def tearDown(self):
        pass

整体代码:

# 对更新用户信息的脚本进行测试,使用unittest框架技术,V1.0版本,传入一组固定的测试数据,进行接口测试
# 接口说明:
# 接口访问地址:   http://localhost:8080/jwshoplogin/user/update_information.do
# 接口传入参数:1、email: 2、phone:3、answer: 4、question:
# 接口预期返回结果:
# 1、email已存在, 请更换email再尝试更新 2、更新个人信息成功  3、更新个人信息失败"
#*****************************************************************************
# 脚本实现:
# 导入相关类库
import unittest
import requests

# 定义测试类,继承unittest框架
class test_updateuser(unittest.TestCase):
    # 通过setup方法实现登录接口的调用
    def setUp(self):
        url="http://localhost:8080/jwshoplogin/user/login.do"
        userinfo={"username":"程勇4",
                  "password":"123456"}

        response=requests.post(url,data=userinfo)

        self.sessionID=dict(response.cookies)['JSESSIONID']
        print(self.sessionID)

    # V1.0版本,传入一组固定的测试数据,进行接口测试
    def test_case1(self):
        # 传入指定的接口测试数据
        url="http://localhost:8080/jwshoplogin/user/update_information.do"
        userinfo={"email":"1234561@qq.com",
                  "phone":"13311095555",
                  "question": "苹果",
                  "answer":"最喜欢的水果"
        }
        session={"JSESSIONID":self.sessionID}
        # 进行接口调用
        response=requests.post(url,data=userinfo,cookies=session).text
        print(response)
        self.assertIn("更新个人信息成功",response)

    def tearDown(self):
        pass

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

输出结果:

51A4D6A5E348145E7C45FCF7B24C8977
{"status":0,"msg":"更新个人信息成功","data":{"id":33,"username":"程勇4","password":null,"email":"1234561@qq.com","phone":"13311095555","question":"苹果","answer":"最喜欢的水果","role":null,"createTime":null,"updateTime":null}}


Ran 1 test in 0.018s

OK

Process finished with exit code 0

3.2 V2.0 通过csv文件进行更新测试数据的读取

在这里读取testdatafile下面的test_updateuser_V21.csv文件

第0列是网址

第1列是userinfo里面有几个参数,

第2列是断言情况

第3列是参数名

第4列是参数值

第5列是参数名

第6列是参数值

通过unittest框架实现更新测试数据的读取,

1、导入unittest类库,导入csv库函数

# 导入相关类库
import os
import unittest
import requests
import csv

2、通过setup方法实现登录接口的调用

读取testdatafile下面的test_updateuser_V21.csv文件,只读第一行,

    def setUp(self):
        # # 从csv测试数据文件中读取url和登录测试数据
        path=os.getcwd()
        print(path)
        # p1=os.path.abspath(os.path.dirname(path)+os.path.sep+".")
        # print(p1)
        p2 = os.path.abspath(os.path.dirname(path) + os.path.sep + "..")
        self.fpath=p2+"\\testdatafile\\ind_interface\\test_updateuser_V21.csv"
        # print(fpath)
        userinfo={}
        file1=open(self.fpath,'r')

逐行读取测试的数据

并取出 JSESSIONID

        table=csv.reader(file1)
        for row in table:
            print(row[0])
            url=row[0]
            userinfo[row[3]]=row[4]
            userinfo[row[5]]=row[6]
            print(userinfo)
            break  # 读完一行就退出
        response=requests.post(url,data=userinfo)
        self.sessionID=dict(response.cookies)['JSESSIONID']
        print(self.sessionID)

3、读取第二行以后的数据,并根据j读取参数填入到userinfo中。

            if num>1:
                url=row[0]
                expresult=row[2]
                j=int(row[1])
                for i in range(3,j*2+3,2):
                    userinfo[row[i]]=row[i+1]

整体代码:

# V2.0 通过csv文件进行更新测试数据的读取

# 接口说明:
# 接口访问地址:   http://localhost:8080/jwshoplogin/user/update_information.do
# 接口传入参数:1、email: 2、phone:3、answer: 4、question:
# 接口预期返回结果:
# 1、email已存在, 请更换email再尝试更新 2、更新个人信息成功  3、更新个人信息失败"
#*****************************************************************************
# 脚本实现:
# 导入相关类库
import os
import unittest
import requests
import csv

# 定义测试类,继承unittest框架
class test_updateuser_V2(unittest.TestCase):
    # 通过setup方法实现登录接口的调用
    def setUp(self):
        # # 从csv测试数据文件中读取url和登录测试数据
        path=os.getcwd()
        print(path)
        # p1=os.path.abspath(os.path.dirname(path)+os.path.sep+".")
        # print(p1)
        p2 = os.path.abspath(os.path.dirname(path) + os.path.sep + "..")
        self.fpath=p2+"\\testdatafile\\ind_interface\\test_updateuser_V21.csv"
        # print(fpath)
        userinfo={}
        file1=open(self.fpath,'r')
        table=csv.reader(file1)
        for row in table:
            print(row[0])
            url=row[0]
            userinfo[row[3]]=row[4]
            userinfo[row[5]]=row[6]
            print(userinfo)
            break  # 读完一行就退出
        response=requests.post(url,data=userinfo)
        self.sessionID=dict(response.cookies)['JSESSIONID']
        print(self.sessionID)

    # V2.0版本,读取指定的测试数据文件中对应的内容,进行接口测试
    def test_case1(self):
        # 打开对应的文件
        file1=open(self.fpath,'r')
        # 如何从指定行开始读取
        table=csv.reader(file1)
        userinfo={}
        num=0
        for row in table:
            num=num+1
            if num>1:
                url=row[0]
                expresult=row[2]
                j=int(row[1])
                for i in range(3,j*2+3,2):
                    userinfo[row[i]]=row[i+1]
                print(userinfo)
                session={"JSESSIONID":self.sessionID}
                print(session)
                response=requests.post(url,data=userinfo,cookies=session).text
                print(response)
                userinfo={}
                self.assertIn("更新个人信息成功",response)


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

返回结果:


D:\python\interfacefram\script\ind_interface
http://localhost:8080/jwshoplogin/user/login.do
{'username': '张海1', 'password': '123456'}
6F9569002161C3B7388ED9E0000CDE58

{'email': '1234564@qq.com'}
{'JSESSIONID': '6F9569002161C3B7388ED9E0000CDE58'}
{"status":0,"msg":"更新个人信息成功","data":{"id":26,"username":"张海1","password":null,"email":"1234564@qq.com","phone":null,"question":null,"answer":null,"role":null,"createTime":null,"updateTime":null}}
{'phone': '13311095551'}
{'JSESSIONID': '6F9569002161C3B7388ED9E0000CDE58'}

3.3 v3.0 创建HTML格式的测试报告文件

使用测试套件执行

1、导入unittest框架文件,及测试报告库

import os
import unittest
import requests
import csv
from HTMLTestRunner import HTMLTestRunner
2、定义测试报告文件
    path=os.getcwd()
    p2 = os.path.abspath(os.path.dirname(path) + os.path.sep + "..")
    filename=p2+"\\testresultfile\\ind_interface\\test_updatauser_report.html"

3、加载测试套

    suite=unittest.TestSuite()
    suite.addTest(test_updateuser_V3("test_case1"))

4、 以wb的方式打开文件

file=open(filename,"wb")

5、调用HTML测试报告的报告生成测试报告

    runner=HTMLTestRunner(stream=file,title="更新用户接口测试",description="接口测试报告")
    print("测试报告")
    runner.run(suite)
    file.close()

程序:

# v3.0  创建HTML格式的测试报告文件

# 接口说明:
# 接口访问地址:   http://localhost:8080/jwshoplogin/user/update_information.do
# 接口传入参数:1、email: 2、phone:3、answer: 4、question:
# 接口预期返回结果:
# 1、email已存在, 请更换email再尝试更新 2、更新个人信息成功  3、更新个人信息失败"
#*****************************************************************************
# 脚本实现:
# 导入相关类库
import os
import unittest
import requests
import csv
from HTMLTestRunner import HTMLTestRunner

# 定义测试类,继承unittest框架
class test_updateuser_V3(unittest.TestCase):
    # 通过setup方法实现登录接口的调用
    def setUp(self):
        # # 从csv测试数据文件中读取url和登录测试数据
        path=os.getcwd()
        # print(path)
        # p1=os.path.abspath(os.path.dirname(path)+os.path.sep+".")
        # print(p1)
        p2 = os.path.abspath(os.path.dirname(path) + os.path.sep + "..")
        print(p2)
        self.fpath=p2+"\\testdatafile\\ind_interface\\test_updateuser_V21.csv"
        # print(fpath)
        userinfo={}
        file1=open(self.fpath,'r')
        table=csv.reader(file1)
        for row in table:
            print(row[0])
            url=row[0]
            userinfo[row[3]]=row[4]
            userinfo[row[5]]=row[6]
            print(userinfo)
            break
        response=requests.post(url,data=userinfo)
        self.sessionID=dict(response.cookies)['JSESSIONID']
        print(self.sessionID)


    def test_case1(self):
        # 打开对应的文件
        file1=open(self.fpath,'r')
        # 如何从指定行开始读取
        table=csv.reader(file1)
        userinfo={}
        num=0
        for row in table:
            num=num+1
            if num>1:
                url=row[0]
                expresult=row[2]
                j=int(row[1])
                for i in range(3,j*2+3,2):
                    userinfo[row[i]]=row[i+1]
                print(userinfo)
                session={"JSESSIONID":self.sessionID}
                print(session)
                response=requests.post(url,data=userinfo,cookies=session).text
                print(response)
                userinfo={}
                self.assertIn("更新个人信息成功",response)


if __name__ == '__main__':
    # unittest.main()
    # 定义测试报告文件
    path=os.getcwd()
    p2 = os.path.abspath(os.path.dirname(path) + os.path.sep + "..")
    filename=p2+"\\testresultfile\\ind_interface\\test_updatauser_report.html"

    # 加载测试套
    suite=unittest.TestSuite()
    suite.addTest(test_updateuser_V3("test_case1"))
    # 以wb的方式打开文件
    file=open(filename,"wb")

    # 调用HTML测试报告的报告生成测试报告
    runner=HTMLTestRunner(stream=file,title="更新用户接口测试",description="接口测试报告")
    print("测试报告")
    runner.run(suite)
    file.close()

此时右键运行,输出结果如下:

D:\python\interfacefram
http://localhost:8080/jwshoplogin/user/login.do
{'username': '张海1', 'password': '123456'}
95A706B0546303971C2D3158D347B4A5
D:\Program Files\python\lib\unittest\case.py:546: ResourceWarning: unclosed file <_io.TextIOWrapper name='D:\\python\\interfacefram\\testdatafile\\ind_interface\\test_updateuser_V21.csv' mode='r' encoding='cp936'>
  self.setUp()
ResourceWarning: Enable tracemalloc to get the object allocation traceback
{'email': '1234564@qq.com'}
{'JSESSIONID': '95A706B0546303971C2D3158D347B4A5'}
{"status":0,"msg":"更新个人信息成功","data":{"id":26,"username":"张海1","password":null,"email":"1234564@qq.com","phone":null,"question":null,"answer":null,"role":null,"createTime":null,"updateTime":null}}
{'phone': '13311095551'}
{'JSESSIONID': '95A706B0546303971C2D3158D347B4A5'}


Ran 1 test in 0.031s

OK
{"status":0,"msg":"更新个人信息成功","data":{"id":26,"username":"张海1","password":null,"email":null,"phone":"13311095551","question":null,"answer":null,"role":null,"createTime":null,"updateTime":null}}


Process finished with exit code 0

发现问题1:此时testresultfile\ind_interface\test_updatauser_report.html没有生成

解决办法,这时右键运行是在测试套里跑的,没有生成测试报告,单独跑就会生成

注意:运行模式要改为以python文件而不是测试框架运行

点开上方"Edit Configurations"

选择python,点击加号+

选择python

在Unnamed中选择这个脚本,点击ok

此时选择刚添加的那个配置,执行,此时就会生成测试报告

可以看到测试报告:

3.4 V4.0 测试文件执行

以文件的方式来进行框架的执行
声明文件所在路径
    testdir='./'
    discover=unittest.defaultTestLoader.discover(testdir,pattern='test_updateser_v1.py')
#声明测试运行对象
runner=unittest.TextTestRunner()
runner.run(discover)

整体程序:

# v4.0  执行任意指定路径下的任意相关命名的python测试脚本
# 脚本实现:
import unittest
import requests

if __name__ == '__main__':

    #**********************************************
    #以文件的方式来进行框架的执行
    #声明文件所在路径
    testdir='./'
    discover=unittest.defaultTestLoader.discover(testdir,pattern='test_updateser_v1.py')
    #声明测试运行对象
    runner=unittest.TextTestRunner()
    runner.run(discover)

执行结果:

{"status":0,"msg":"更新个人信息成功","data":{"id":33,"username":"程勇4","password":null,"email":"1234561@qq.com","phone":"13311095555","question":"苹果","answer":"最喜欢的水果","role":null,"createTime":null,"updateTime":null}}
.
----------------------------------------------------------------------
Ran 1 test in 0.019s

OK

4、三种不同的框架小结

4.1、unittest框架的使用要求

1、import unittest

2、定义测试类需要继承unittest

class  测试类名(unittest.TestCase)

4.2、 unittest测试框架的基本组成要素

1、setUp初始化方法

测试前期的初始化工作,作为可选项

2、test_XXX测试方法

测试方法必须以test_开头

3、tearDown资源回收方法

可选、关闭对象、释放对象

4、运行方式

unittest.main()、测试套件执行、测试文件执行

4.3 unittest框架的执行顺序

setUp进行初始化

执行测试方法

tearDown进行资源回收

4.4 三种不同的框架进行运行的对比

4.4.1 unittest.main()

1、依次执行当前文件中对应测试类的所有测试方法

2、执行顺序以asc码顺序

是按照asc码顺序进行执行

setUp    测试方法test_case1    tearDown

setUp    测试方法test_case2    tearDown

3、一般测试方法名称建议定义为

test_case1、test_case2

4.4.2 测试套件执行

1、声明测试套

suite=unittest.TestSuite()

2、通过addtest方法添加测试用例

suite.addTest(类名("测试方法名"))

3、声明测试运行对象

runner=unittest.TestRunner()

4、执行测试套

runner.run(suite)

执行特点:按照加载顺序的顺序和个数进行执行

注意:运行模式要改为以python文件而不是测试框架运行

4.4.3 测试文件执行

1、声明文件所在路径

2、定义discover对象打开相关的脚本文件

discover=unittest.defaultTestLoader.discover(文件路径,pattern='test3.py')

3、声明测试运行对象

runner=unittest.TextTestRunner()

4、执行测试套

runner.run(discover)

特点:执行任意指定路径下的任意相关命名的python测试脚本执行每一个文件中所有的测试方法,顺序也是按照asc码顺序进行

愿每个测试都能顺利转为测试开发,提高职业技能,成为前1%的存在,为公司节约更多的成本,为社会创造更大的价值,为自己和家庭谋求更高的收入,所有人不受职业年龄限制,越老越吃香,直至财富自由;愿测试技术越来越进步,测试效率提高,软件质量不断提高。愿祖国更加美好,人民更加幸福。多喜乐,常安宁。

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

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

相关文章

今天不看明天付费------中国AGI(人工智能)的发展趋势

深入解析了中国AGI&#xff08;人工智能&#xff09;的发展趋势&#xff0c;并清晰地展示了其市场分层结构。 ** 从下至上&#xff0c;AGI市场被划分为四个主要层级&#xff1a;基础设施层、模型层、中间层和应用层。 基础设施层作为最底层&#xff0c;为AGI的发展提供了坚实…

Gartner发布2024年企业高管增长议程:使网络安全投资与业务增长保持一致

网络安全投资和准备被视为推动企业发展的关键因素。除了避免损失之外&#xff0c;高管还应利用有效的以业务为中心的安全方法&#xff0c;通过大规模实现敏捷性和创新来推动收入增长。 主要发现 高增长公司通过扩大商业足迹来推动业绩&#xff0c;这需要大规模的创新、敏捷性和…

【论文解读】通过多标记预测建立更好更快的大型语言模型

Meta 的这篇多标记预测论文显示,与当前的下一标记预测器相比,多头预测器内存效率高、性能更好、训练速度更快。 https://arxiv.org/pdf/2404.19737 主要收获: 多标记预测是对 LLM 训练的一种简单而强大的修改,可提高样本效率和各种任务的性能。这种方法在大规模应用中尤为…

Linux编程---给函数取别名

0 Preface/Foreword 1 代码 1.1 源代码 #include <stdio.h> #include <string.h> int sum(int a, int b);int sum_alias(int a, int b) __attribute__ ((alias("sum"))); int main() { int ret 0; ret sum(5, 5) sum_alias(5, 5); …

学习笔记——动态路由——RIP(RIP路由汇总介绍)

四、RIP路由汇总介绍 当网络中路由器的路由条目非常多时&#xff0c;可以通过路由汇总&#xff08;又称路由汇聚或路由聚合&#xff09;来减少路由条目数&#xff0c;加快路由收敛时间和增强网络稳定性。 路由汇总的原理是&#xff0c;同一个自然网段内的不同子网的路由在向外…

开关电源调试记录-基于DK112(DK1203也一样)作为开关主控芯片的开关电源

调试了一款DK112&#xff08;datasheet&#xff09;开关电源控制芯片。 1、原理图如下&#xff1a; 2、测试波形 a.输出波形&#xff0c;图中标识“5V”的位置 b.芯片VCC引脚&#xff0c;图中标识“4”的位置 c.芯片FB引脚&#xff0c;图中标识“3”的位置 对于FB引脚&…

防近视台灯有效果吗?专业护眼台灯推荐!告诉你台灯怎么选

随着学业负担的加重和电子设备的广泛普及&#xff0c;近视问题在青少年群体中愈发凸显&#xff0c;近视率持续走高。导致近视的因素错综复杂&#xff0c;除了过度使用手机外&#xff0c;遗传因素、不良的用眼习惯、环境因素、营养不均衡以及学习压力等均为重要因素&#xff0c;…

VBA 进度条(2)

1.前提 1-1. 在VBA编辑器找到工具-引用-勾选MicroSoft Visual Basic for Applications Extensibility Library 1-2. 信任中心 -> 宏设置 -> 开发人员宏设置 -> 选中“信任对VBA工程对象模型的访问” 2.类模块 Private objApp As Object Private u…

国行版苹果Vision Pro即将发售 高昂定价吓退普通消费者?

2024年2月2日&#xff0c;苹果第一代空间计算设备Vision Pro在美国上市。6月28日&#xff0c;国行版苹果Vision Pro也将正式发售&#xff0c;别为256GB版29999元、512GB版31499元、1TB版32999元。不过从此前Vision Pro预售情况来看&#xff0c;Vision Pro的“杀手锏”在“价格”…

基于JSP的书店仓库管理系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;JSP 数据库&#xff1a;MySQL 技术&#xff1a;JSPJava 工具&#xff1a;ECLIPSE、Tomcat 系统展示 首页 管理员功能模块…

简过网:上万元的学费,考公到底要不要报个培训班?

考公报不报班一直是很多朋友比较纠结一件事&#xff0c;报班了学费太贵&#xff0c;不报班又怕考不上&#xff0c;如果你也有这种困扰&#xff0c;那么&#xff0c;不妨看看这篇文章&#xff01; 首先&#xff0c;对于报班VS自学这个问题&#xff0c;小编的建议是&#xff1a;…

MES管理系统的实施难点以及解决方案

随着智能制造的浪潮席卷全球&#xff0c;MES管理系统成为了众多制造企业提升竞争力的关键武器。MES管理系统以其强大的功能&#xff0c;能够有效连接企业的上层ERP系统与底层自动化设备&#xff0c;实现生产过程的实时监控与优化。然而&#xff0c;实施MES管理系统并非一帆风顺…

TIMESTAMP 和DATETIME 的区别

DATETIME类型 存储范围&#xff1a;DATETIME类型可以存储从1000-01-01 00:00:00到9999-12-31 23:59:59的日期和时间值&#xff0c;精度可以达到微秒级别。时区处理&#xff1a;DATETIME类型不与特定时区关联。它直接存储你提供的日期和时间值&#xff0c;不包含任何时区信息。…

SSM超市管理系统-计算机毕业设计源码10428

目 录 摘要 1 绪论 1.1 研究意义 1.2国内外研究现状 1.3论文结构与章节安排 2 超市管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 …

Arduino平台软硬件原理及使用——SR04超声波传感器的使用

文章目录&#xff1a; 一、超声波传感器工作原理 二、SR04超声波库的使用 三、SR04超声波传感器在Arduino中的使用 一、超声波传感器工作原理 如上图所示&#xff1a;HCSR04超声波传感器拥有4个针脚&#xff0c;除了VCC接正极、GND接负极外&#xff0c;还有两个引脚“Trig”及“…

vue-主题切换

themeName/index.vue页面: <template><div class"theme-view"><div click"themeClick" class"theme-btn">切换颜色</div><br>{{themeName white ? 白色 : 深色}}主题页面</div> </template><sc…

pytorch统计学分布

1、pytorch统计学函数 import torcha torch.rand(2,2) print(a) print(torch.sum(a, dim0)) print(torch.mean(a, dim0)) print(torch.prod(a, dim0))print(torch.argmax(a, dim0)) print(torch.argmin(a, dim0)) print(torch.std(a)) print(torch.var(a)) print(torch.median…

UE4 Unlua的快速使用

目录 Unlua的使用前言下载Unlua插件插件安装快速入门语法汇总模块导入多行字符串官方静态方法调用蓝图方法调用重载蓝图中的方法主动调用被重载的蓝图方法输入绑定动态绑定Lua脚本委托容器使用 延迟与协程的使用C 调用Lua 静态导出自定义类型到Lua使用网络UMG资源释放自定义加载…

秋招季的策略与行动指南:提前布局,高效备战,精准出击

6月即将进入尾声&#xff0c;一年一度的秋季招聘季正在热火进行中。对于即将毕业的学生和寻求职业发展的职场人士来说&#xff0c;秋招是一个不容错过的黄金时期。 秋招的序幕通常在6月至9月间拉开&#xff0c;名企们纷纷开启网申的大门。在此期间&#xff0c;求职备战是一个系…

SaaS客户裂变:如何构建合作伙伴的双向沟通桥梁

在SaaS行业中&#xff0c;客户裂变不仅是增长的关键&#xff0c;更要求与合作伙伴之间建立稳固的沟通桥梁。如何构建合作伙伴双向沟通的桥梁&#xff0c;真正做到理解对方的价值需求&#xff0c;实现长期合作共赢呢&#xff1f; 一、明确价值共享 首先&#xff0c;确保双方明…