作为一个入行有2-3个月的软件测试新手,真的太懂新手的迷茫了!刚开始写测试脚本,要么一运行就崩溃,要么接口返回的数据不会解析,要么代码写得乱七八糟,复用性极差,踩了无数坑😭。

        之前实习时一边跟着学习,一边整理了自己常用、也最核心的4个Python知识点,包含完整代码示例、知识点总结和实际测试场景应用,纯干货无冗余,都是新手入门必掌握的内容。今天分享出来,和各位同是新手的小伙伴互相交流、一起进步,希望大家少走一些我踩过的弯路~        

第一部分:异常处理(新手必学,避免脚本崩溃)

        刚开始写测试脚本,我最头疼的就是“脚本崩溃”——有时候是找不到文件,有时候是网络超时,有时候是数据格式错了,一报错整个脚本就停了,还要从头排查问题,浪费好多时间。后来学会了异常处理,终于能让脚本“优雅”报错,再也不用被崩溃搞心态了!

1. 知识点总结

        在测试里,程序出现错误太正常了(比如元素找不到、网络超时、数据格式错误),处理不当就会让脚本直接崩溃。异常处理就能解决这个问题,让脚本要么友好报错,要么继续执行,还能帮我们释放资源,避免浪费。

        try ... except : 捕获异常(脚本出错时,不崩溃,执行我们写的处理逻辑)

        else: 如果没有异常发生,执行此块(比如脚本正常执行完,打印“执行成功”)

        finally:无论是否发生异常,一定会执行(重点!常用于关闭浏览器、数据库连接,避免资源占用,新手很容易忘记这一步)

        raise:主动抛出异常(比如断言失败时,主动报错,标记用例失败,方便我们排查)

raise 用途(新手常用场景):

        校验数据不合法时主动报错(比如测试数据为空,直接报错,不用等脚本执行到后面再崩溃)

        测试异常处理是否生效(自己主动抛错,看脚本能不能正常捕获)

        发现问题直接中断流程(比如接口返回码不对,直接中断,节省执行时间)

补充:if 'file' in locals(): (新手避坑点)

1. 判断变量是否被创建成功

2. 防止文件没打开就执行close(),导致新的错误(我刚开始就踩过这个坑,文件没打开,却写了close(),又报了新错)

分享一个我自己记的简单口诀,新手容易记住:

        try:尝试做事(执行可能出错的代码)

        except:自己处理错误(出错了不崩溃,执行我们写的提示)

        raise:自己不兜着了,抛给上级处理(自己处理不了,主动报错)

        finally:无论如何都要收尾关资源(不管错不错,都要关闭浏览器、文件)

完整代码示例(可直接复制,新手练手必备)
try: file = open("D:/python/test.txt")
 #执行文件操作
content = file.read()
print("文件读取成功")
#主动抛出异常(演示用,新手可以试试注释掉这行,看脚本正常执行的效果)
raise Exception("主动触发一个测试异常") 
except FileNotFoundError: 
    print("文件不存在") 
#捕获其他类型的错误,e是错误信息,方便我们排查问题 
except Exception as e: 
    print(f"发生错误:{e}") 
finally: 
#无论是否报错,都会执行,新手一定要记得写! 
    print("==进入 finall块===") 
if 'file' in locals(): 
    file.close() print("文件已关闭,资源释放")

结果如下:

2. 基本结构

(1)基本结构(最基础,新手先掌握这个)
try: 
num = int("abc")#这里会报错(字符串转整数,肯定错) 
except ValueError: 
    #捕获特定异常,给出友好提示,不崩溃 
    print("捕获到数值转换错误")

结果如下:

(2)多重捕获与资源清理(Finally)

实际测试中,可能会出现多种错误,这个结构能处理多种错误,还能确保资源释放,新手一定要掌握,比如打开浏览器后,不管脚本对错,都要关闭浏览器。

try: 
    file = open("D:/python/test.txt") 
    #执行操作 
except FileNotFoundError: 
    print("文件不存在") 
except Exception as e: 
    print(f"发生未知错误{e}") 
finally: 
    #无论是否报错,都会执行,释放资源 
    if 'file' in locals(): 
        file.close() print("资源已经释放")

结果如下:

(3)主动抛出与自定义异常

这个稍微进阶一点,但很实用!比如测试数据为空时,我们可以主动报错,让问题更明显,不用等脚本执行到后面才发现错误。

class TestDataError(Exception): 
    pass
def check_data(data): 
    if not data: 
        raise TestDataError("测试数据不能为空") 
try: 
    check_data(None) 
except TestDataError as e: 
print(f"测试数据校验失败:{e}")

结果如下:

完整代码示例(重复演示,方便新手复制练手)
try: 
    file = open("D:/python/test.txt") 
    #执行文件操作 
    content = file.read() 
    print("文件读取成功") 
    #主动抛出异常(演示用) 
    raise Exception("主动触发一个测试异常") 
except FileNotFoundError: 
    print("文件不存在") 
#捕获其他类型的错误,e是错误信息,方便打印查看 
except Exception as e: 
    print(f"发生错误:{e}") 
finally: 
#无论是否报错,都会执行 
    print("==进入 finall块===") 
    if 'file' in locals(): 
        file.close() 
        print("文件已关闭,资源释放")

运行结果:

3. 常见错误总结(新手高频踩坑!)

整理了我刚开始写代码时,经常遇到的几种错误,每个错误都附了示例,新手可以对照着看,避免踩坑~

        ①ZeroDivisionError → 除以 0 10 / 0 # 报错 ZeroDivisionError(我刚开始不小心写过,直接崩溃)

       ② FileNotFoundError → 文件找不到 open("aaa.txt") # 文件不存在 → FileNotFoundError(路径写错、文件名写错都会报这个错)

        ③KeyError → 字典 key 不存在 d = {"name":"aa"} d["age"] # 报错 KeyError(字典里没有age这个键,新手很容易写错键名)

        ④AssertionError → assert 条件不满足(自动化测试最常见,用例失败会报这个错)

        ⑤TypeError:类型不被接受(比如用列表转整数,类型不对)

        ⑥ValueError:值错误(输入的值不对、不合法)(类型被接受但内容不合格) int("abc") # 报错 ValueError(类型合法,值不合法) int([1,2]) # 报错 TypeError(类型不合法)

错误代码案例(新手可以复制运行,看看报错效果)

这个案例包含了上面的几种错误,还有主动抛异常的方法,新手可以注释掉不同的代码,看看每种错误的报错效果,加深记忆~

# 演示:ZeroDivisionError、FileNotFoundError、KeyError、AssertionError
	# 包含:系统自动抛异常 + 自己 raise 主动抛异常
	def test_error():
		try:
			# ======================
			# 1. ZeroDivisionError 除以0错误
			# ======================
			# a = 10 / 0
			
			# ======================
			# 2. FileNotFoundError 文件不存在
			# ======================
			# open("不存在的文件.txt")
			
			# ======================
			# 3. KeyError 字典键不存在
			# ======================
			# d = {"name": "张三"}
			# print(d["age"])

			# ======================
			# 4. AssertionError 断言失败
			# ======================
			# age = 15
			# assert age >= 18
			
			# ======================
			# ✅ 重点:主动 raise 抛出异常(人为制造错误)
			# ======================
			raise ZeroDivisionError("我主动抛出除零错误!")

		except ZeroDivisionError as e:
			print("捕获到:ZeroDivisionError")
			print("错误信息:", e)
			# raise  # 这里加raise = 继续抛给上层

		except FileNotFoundError as e:
			print("捕获到:FileNotFoundError")
			print("错误信息:", e)

		except KeyError as e:
			print("捕获到:KeyError")
			print("错误信息:", e)

		except AssertionError as e:
			print("捕获到:AssertionError")
			print("错误信息:", e)

	# 调用测试
	test_error()

运行结果:

4. 测试场景应用(新手实际工作中会用到!)

分享两个我实际工作中用到的场景,新手可以参考,知道学了异常处理能用来做什么~

        ①UI自动化:当页面上找不到某个按钮时,捕获NoSuchElementException,截图并记录日志,而不是让脚本崩溃(不然前面执行的用例都白跑了)

        ②接口测试:当接口返回码不是200时,抛出异常标记测试失败,方便我们后续查看哪些用例失败了

5. 练习题(新手练手必备)

这些练习题都是我当时练手的,难度不高,能帮我们巩固异常处理的知识点,新手可以试着写一写,有不会的可以留言交流~

题目一
  #案例
    def divide(a,b):
        try:
            result = a/b
        except ZeroDivisionError:
                print("错误,除数不能为0")
                return None
        except TypeError:
                print("错误请输入数字")
                return None
        else:
                print("计算成功")
                return result
        finally:
                print("计算结束")
    print(divide(10, 2))
    print(divide(10, 0))  

运行结果:

题目二

编写一个函数 login_check(username, password),这个是登录校验的常用函数,新手一定要练!

  • 如果 username 为空,抛出 ValueError("用户名不能为空")。

  • 如果 password 长度小于 6 位,抛出 ValueError("密码长度不能小于 6 位")。

  • 使用 try...except 调用该函数,捕获异常并打印友好的错误信息,确保程序不崩溃。

def login_check(username,password):
    '''
    登录校验函数
    :param username:用户名
    :param password:密码
    :raises ValueError:用户名空/密码过于简短时抛出错误
    '''
    #1.判断用户名是否为空
    if not username:
         #主动报错
         raise ValueError("用户名不能为空")
    #2.判断密码是否小于6位
    if len(password) < 6:
         raise ValueError("密码长度不能小于6位")

#调用函数(try...except捕获异常)
if __name__ == '__main__':
    #测试场景1.用户名为空时(会报错)
    try:
        login_check("","12345")
        print("登录校验成功")
    except ValueError as e:
        print("登录失败:",e)
    #测试场景2:密码太短(会报错)
    try:
        login_check("张三", "123")
        print("密码校验成功")
    except ValueError as e:
        print("登录失败:",e)
    #测试场景3:参数正确(正常通过)
    try:
        login_check("admin", "123456")
        print("登录校验成功")
    except ValueError as e:
        print("登录失败:",e)

运行结果:

第二部分:JSON操作(接口测试重中之重!)

刚做接口测试的时候,我完全搞不懂JSON是什么,看到接口返回的一串字符串就头大,不知道怎么取值、怎么断言,后来专门花时间学了JSON操作,才发现原来这么简单,现在分享给和我一样刚接触接口测试的新手~

1. 知识点总结

这是接口测试最重要的部分!接口请求体和响应体通常都是JSON格式,不会JSON操作,基本做不了接口测试,新手一定要重点掌握~

  • 模块:import json(先导入模块,才能使用JSON相关的方法,新手别忘了这一步)

  • 字典/列表 《————》 JSON字符串:(最常用,记牢这两个方法)

    • json.dumps(): Python对象转JSON字符串(序列化,发送接口请求时会用到)

    • json.loads(): JSON字符串转Python对象(反序列化,解析接口响应体时会用到)

  • 文件 <-> JSON:(保存、读取测试数据时会用到)

    • json.dump(): 写入 JSON 文件。

    • json.load(): 读取 JSON 文件。

例子(新手可以复制运行,看看效果):

        import json
        #1.字典转JSON字符串(发送请求前)
        data = {"username":"test","pwd":"123"}
        json_str = json.dumps(data)
        print(type(json_str))#<class 'str'>
        #2.JSON字符串转字典(收到响应后)
        response_str = '{"code":200,"msg":"success"}'
        res_dict = json.loads(response_str)
        print(res_dict)

运行结果:

2. 测试场景应用(新手实际工作场景)

分享三个我实际工作中常用的场景,新手可以对应着练习,很快就能掌握:

  • 接口断言: 接口返回的是 JSON 字符串,需要用 loads 转成字典,然后断言 data['code'] == 200(判断接口是否正常返回)。

  • 构造请求: 将测试数据字典 dumps 成字符串发送给服务器(比如登录请求,需要把账号密码转成JSON格式发送)。

  • 测试数据管理: 将复杂的测试数据保存在 .json 文件中,需要时读取,不用每次都写重复的代码,节省时间。

3. Python字典和JSON字符串的区别(新手必分清!)

我刚开始就经常混淆这两个,导致代码报错,后来整理了它们的区别,再也没踩过坑,新手一定要分清~

字典:是Python里的数据对象(内存里的东西,程序能用)
data = {
		"name": "小明",
		"age": 18,
		"is_student": True
		}

特点:

  • 是 Python 数据类型,程序能直接使用

  • 可以用 data["name"] 直接取值(很方便)

  • 键可以单引号、双引号都行(新手怎么写都可以)

  • 布尔值:True False 首字母大写

JSON:是字符串(纯文本、用来传输、保存)
'{
	"name": "小明",
	"age": 18,
	"is_student": true
	}'

特点:

  • 本质就是一串字符串,外面被引号包着,程序不能直接取值

  • 必须双引号,不能单引号(新手容易错,一定要注意)

  • 布尔小写:true false(和字典的区别,报错时可以检查这里)

  • 不能直接 json["name"] 取值,必须先用loads转成字典

第三部分:函数(代码复用神器,新手必学!)

刚开始写代码,我都是把所有代码堆在一起,写一个登录用例写一遍打开浏览器、输入账号密码的代码,不仅麻烦,后期修改也不方便,后来学会了函数封装,代码简洁了很多,也能重复使用,效率提升太多了!

1. 知识点总结

函数是代码复用的核心,测试中,我们不会把所有代码写在一个文件里,而是封装成函数,需要的时候直接调用,新手一定要养成封装函数的习惯。

  • def:定义函数(用def开头,后面跟函数名和参数)

  • 参数:位置参数、默认参数(def func(a,b=0))、可变参数(*args,**kaef)。新手先掌握位置参数和默认参数就够了。

  • return:返回结果(测试中常用于返回断言结果或提取的数据,比如调用函数后,返回接口返回的内容)

  • 作用域:局部变量VS全局变量(简单说,函数里定义的变量,只有函数里能用,外面不能用,新手不用太复杂,先记住这个就行)

2. 测试场景应用(新手高频使用)

  • 封装操作:将“打开浏览器”、“输入用户名”、“点击登录”封装成一个login()函数,多个用例可直接调用,不用重复写代码。

  • 数据驱动:编写一个函数,接受不同测试数据,执行相同测试逻辑(比如多组账号密码登录测试,不用写多个重复的脚本)

  • PO模式(Page Object):每个页面对应一个类,页面上的操作对应类中的方法(函数),后期维护更方便(新手可以先了解,慢慢掌握)

3. 代码示例(新手可以直接复制练手)

def send_request(url,method="GET",timeout=30):
        print(f"正在发送{method}请求到{url},超时时间:{timeout}s")
        return True#模拟请求成功
#调用
send_request("https://www.baidu.com/")
send_request("https://www.baidu.com/", method="POST", timeout=60)

运行结果;

练习题(新手练手,巩固函数知识点)

这个练习题很实用,是测试数据生成器,新手可以试着写一写,能帮我们掌握函数的默认参数和返回值~

题目:编写一个测试数据生成器函数 generate_user_data(role="user")。

  • 如果 role 是 "admin",返回字典 {"username": "admin001", "permission": "all"}。

  • 如果 role 是 "user" (默认),返回字典 {"username": "user001", "permission": "read"}。

  • 调用该函数,打印返回的字典内容。

def generate_user_data(role="user"):
    '''
    测试数据生成器函数
    :param role: 角色参数,默认值为 "user"
    :return: 根据角色返回对应的用户信息字典
    '''
    #判断角色是否为管理员
    if role == "admin":
        return {"username": "admin001", "permission": "all"}
    #默认角色(普通用户)
    else:
        return{"username": "user001", "permission": "read"}
# 1. 使用默认参数 role="user"
user_data = generate_user_data()
print("默认用户数据:", user_data)
# 2. 传入参数 role="admin"
admin_data = generate_user_data(role="admin")
print("管理员数据:", admin_data)

运行结果:

第四部分:文件处理(测试数据/日志管理必备)

刚工作的时候,我经常需要读取测试用例、写入测试日志,一开始不知道怎么操作文件,每次都手动输入测试数据,浪费好多时间,学会文件处理后,能自动读取、写入数据,效率提升太多了,新手一定要掌握!

文件打开模式说明(新手必记,容易混淆)

模式

说明

文件不存在时

r

只读

报错(新手经常忘,打开不存在的文件用r模式,会直接崩溃)

w

写入,不能读(覆盖原有内容)

创建新文件(注意:会覆盖原有内容,新手慎用)

a

追加(末尾追加)

创建(不会覆盖原有内容,写日志常用)

r+

读写(追加)

报错

1. 知识点总结

测试中,我们经常需要读取测试用例数据,或写入测试日志/报告,这些都离不开文件处理,新手重点掌握open()函数和常用方法就够了。

  • open():打开文件(核心函数,必须掌握)

  • 模式: 'r' (读), 'w' (写,覆盖), 'a' (追加), 'encoding='utf-8'' (防止乱码,新手一定要加,不然容易出现中文乱码)

  • with 语句: 强烈推荐!自动管理文件关闭,防止文件占用或数据丢失(新手容易忘记close(),用with语句就不用管了)

  • 常用方法:

    • read():将文件全部内容一次性读出来(适合小文件)

    • readline():调用一次读一行,适合逐行处理(大文件常用)

      f = open("test.txt", "r", encoding="utf-8")
      line1 = f.readline()  # 第一行
      line2 = f.readline()  # 第二行
      f.close()
      print(line1)  # admin001
      print(line2)  # user001
    •  #结果
      ["admin001\n", "user001\n", "test001"]

      readlines():作用:把文件每一行当作一个元素,全部放进列表
                          返回类型:列表 list [str]
                          特点:最常用!方便 for 循环遍历)

    •  f = open("test.txt", "r", encoding="utf-8")
      lines = f.readlines()
      f.close()
      print(lines)
      #结果
      ["admin001\n", "user001\n", "test001"]
    • write():写入一个字符串(不会自动换行!要换行自己加 \n,新手容易忘加,导致内容都堆在一起)

    •                     f = open("out.txt", "w", encoding="utf-8")
                          f.write("admin001\n")    # \n 表示换行
                          f.write("user001\n")
                          f.close()
                          #文件内容
                          admin001
                          user001 
    • writelines():把列表里的字符串依次写进去,也不会自动换行!

    •                     lines = ["admin001\n", "user001\n", "test001\n"]
                          f = open("out.txt", "w", encoding="utf-8")
                          f.writelines(lines)
                          f.close()

2. 测试场景应用

  • 读取配置:从.txt或者.ini文件读取数据库地址、环境URL,不用硬编码,后期修改方便。

  • 写入日志:将测试执行步骤和结果写入log.txt,方便后续排查问题(比如用例失败了,查看日志就能知道哪里错了)。

  • 读取用例:从CSV文件读取多组账号密码进行批量测试,不用手动输入,节省时间。

3. 写入文本文件(新手实操示例)

    #文件操作
    #打开文件的模式①只读模式:“r”只能看不能改,文件不存在会报错
    #②写入模式:“w”清空原有内容,没有文件会创建③追加功能:“a”在末尾加内容,不会删除原有
        f=open("test.txt","r",encoding="utf-8") #如果这个text文件和这个pyhton在同一目录下
    #方法一:用正斜杠 /(最简单,不用转义,推荐!)
        f=open("D:/python/test.txt","r",encoding="utf-8")#文件在其他位置,填入文件的绝对路径    
    #方法二:用双反斜杠 \\ 转义(标准写法)
        f = open("D:\\python\\test.txt", "w", encoding="utf-8")
        f=open("test.txt","w",encoding="utf-8")   
        f.write("写入你想加入文件的内容hh")#写入内容
        f.close()
        
    #写入文件(会清空原来的内容)
        f = open("D:/python/test.txt","w",encoding = "utf-8")
        f.write("第一行内容\n")
        f.write("第二行内容\n")
        f.write("第三行内容\n")
        f.close()

    #追加内容(不清空,在末尾追加)
        f = open("D:/python/test.txt","a",encoding = "utf-8")
        f.write("这是我追加的内容\n")
        f.close()

4. 读取文件内容(新手实操示例)

    f = open("D:/python/test.txt","r",encoding = "utf-8")
    content = f.read()
    print(content)
    f.close()
    #逐行获取(大文件必备)
    f = open("D:/python/test.txt","r",encoding = "utf-8") 
    for line in f:
        print(line,end="")#逐行输出,不额外换行
    f.close()

5. 路径怎么写(新手高频踩坑!)

我刚开始经常因为路径写错,导致文件找不到,报错FileNotFoundError,整理了两种路径写法,新手可以参考:

  • 1. 相对路径(与py文件在同一个文件夹):直接写文件名,简单方便 f = open("test.txt", "r", encoding="utf-8")

  • 2. 绝对路径(写完整地址,文件在其他位置时用):两种写法,推荐第一种

    • f = open("D:/python/test.txt", "r", encoding="utf-8")#正斜杠(推荐)

    • f = open("D:\\python\\test.txt", "r", encoding="utf-8")#双反斜杠(转义)

5. 读取文件内容
    f = open("D:/python/test.txt","r",encoding = "utf-8")
    content = f.read()
    print(content)
    f.close()
    #逐行获取(大文件必备)
    f = open("D:/python/test.txt","r",encoding = "utf-8") 
    for line in f:
        print(line,end="")#逐行输出,不额外换行
    f.close()

运行结果:

方法一(普通方式,手动关闭文件)
        f=open("test.txt","r",encoding="utf-8")#打开文件
        content=f.read()#读取文件内容
        print("文件内容")
        print(content)
        f.close()#必须要写,否者或占用公共资源
方法二(with语句,推荐新手)
    with open("D:/python/test.txt","r",encoding="utf-8") as f:
        content = f.read()
        print(content)
    #退出缩进,文件自动关闭

6. 案例(新手实操,必练!)

这个案例很实用,模拟测试用例的创建、读取和统计,新手可以复制运行,练手文件处理的知识点,我当时就是靠这个案例,掌握了文件的读写操作~

需求:创建一个名为 cases.txt 的文件,写入三行测试用例描述(例如:"登录成功", "密码错误", "用户不存在"),编写代码读取该文件,逐行打印内容,并统计一共有多少个测试用例。

    方法一:
        #打开文件,如果没有创建
        f = open("D:\\python\\test4-2.txt","w",encoding="utf-8")
        f.write("登陆成功\n")
        f.write("密码错误\n")
        f.write("用户不存在\n")
        f.close()#写入完成,关闭保存
        #读取文件
        f = open("D:\\python\\test4-2.txt","r",encoding="utf-8")
        lines = f.readlines()#读取所有行
        #逐行打印
        for line in f:
            print(line,end="")
        print(f"一共有{lines}个测试用例")
        f.close()

       

    方法二:
    #创建cases.txt,并写入3条测试用例
    with open("D:\\python\\case.txt","w",encoding="utf-8") as f:
        f.write("登陆成功\n")
        f.write("密码错误\n")
        f.write("用户不存在\n")
    #读取文件逐行打印并统计总数
    with open("D:\\python\\case.txt","r",encoding="utf-8") as f:
        # 读取所有行,返回列表
        lines = f.readlines()
    #逐行打印
    for line in lines:
        print(line,end="")
    #统计总数:列表的长度就是用例个数
    print(f"\n测试用例总数:{len(lines)} 个")

方法一运行结果:

方法二运行结果:

基础铺垫:if __name__ == '__main__' 与断言

刚开始写代码的时候,完全不懂这行代码的意思,直到一次把自己的文件导入给同事,发现自己写的测试代码也跟着执行了,才明白它的作用,现在整理清楚,分享给和我一样的新手!

1. if __name__ == '__main__':

简单说就是:这个文件被「直接运行」时,才执行下面的测试代码;如果这个文件被别人「导入调用」,下面的代码就不执行。新手一定要记住,不然很容易出现代码混乱的情况~

2. 断言(assert)

这是自动化测试的核心!刚开始我以为断言没用,直到写自动化脚本时,不知道怎么判断用例是否通过,才发现断言就是“自动判断对错”的神器,不用手动去核对结果,太省心了。

核心逻辑:断言 预期结果 == 实际结果

  • 相等 → 安静通过(用例成功)

  • 不等 → 报错(AssertionError,用例失败)

assert 1 + 1 == 2 # 对 → 安静通过 
assert 1 + 1 == 3 # 错 → 抛 AssertionError

最后:致和我一样的测试新手

写这篇文章的时候,想起自己刚入行的迷茫,不知道该学什么、怎么学,经常因为写不出脚本、脚本崩溃而焦虑,但是慢慢坚持下来,一点点积累,也能慢慢上手。

以上4个知识点,是我之前整理的,也是Python测试新手最常用、最核心的内容,每一个知识点都附了完整代码和实际场景,新手可以直接复制练手。

软件测试这条路,新手难免会踩坑,希望这篇分享能帮到和我一样的小伙伴,我们互相交流、互相鼓励、共同进步,慢慢从新手成长为能独当一面的测试工程师✨

如果大家有更好的学习方法、或者有不懂的问题,欢迎在评论区留言,我们一起探讨、一起进步!

​​​​​​​

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐