Python测试进阶(三)

news2024/11/14 15:35:32

文章目录

  • 性能测试
  • JMeter
    • 测试计划
    • 模拟并发
    • 结果分析
    • 分布式
    • 性能监控
      • grafana
      • Flux
      • Prometheus
    • 小结

性能测试

  • 为什么做性能测试?主要是解决这些问题
    1
  • 什么是性能测试
    • 模拟多个用户的操作,看对服务器性能的影响
  • 指标
    • TPS:transaction per second
    • RT:响应时间
  • 常见工具
    2

JMeter

  • 这个工具最常用
  • 安装
    • 下载,建议使用 5.2.1 版本,到archive找
    • 解压,加入到环境变量或者直接切换到解压目录
    • 还需要 Java 环境
  • 启动(Windows)
    • 图像界面:双击运行 jmeter.bat
    • 命令行界面:jmeter -n,Linux/Mac也是同样

测试计划

  • 先在 Windows 使用图形界面创建及调试测试计划,再到 Linux 执行压测
    • 因为直接在 Linux 创建计划那个界面有点问题
  • 步骤,先在 Windows下操作
    • 打开界面,Test Plan 里添加线程组
      1
    • 线程组中添加录制控制器
      2
    • Test Plan 里添加 Script Recorder,也就是和 Thread Group 并驾齐驱,一个过滤一个保存信息
      3
    • 设置网络代理
      • 可以直接设置机器的网络> 代理,但这样会影响全局
      • 使用浏览器插件:SwitchOmega,在Firefox的 extensions 中也能搜到
      • Chrome 中可能有网络问题,可以在这里安装教程搜索安装
        4
      • new profile,设置完成需要。Apply Changes
        5
      • 为什么设置代理呢?简单来说就是让访问链路经过我们设置的 JMeter 代理,才能抓包分析;具体原理自查
      • 当然,设置浏览器代理意味着我们只能测 web 页面,一般非 web(URL) 提供的服务(比如直接运行本地脚本),只能转化为请求 URL 才能在这测(通过 web 服务请求本地脚本,再返回需要的数据,再解析 web 数据)
    • 配置Script Recorder,点击 start
      • 配置:其实就是这两个地方改一下,匹配要访问的网站,保存录制的位置
        6
      • start 提示安装证书
        7
    • 可以发现在 bin 目录下面出现了证书 ApacheJMeterTemporaryRootCA.crt,双击导入
      • 注意:这里要选择 受信任 区域
        8
      • 也可以在 浏览器> 隐私与安全 导入
    • 此时可以看到抓的包的详细信息
      • Record 录制,其实就是把所有的访问请求包抓取复制一下
      • 而后就可以过滤包,获取我们需要的(要测试的)访问路径,进行后序测试
    • 过滤请求路径(URL)
      • 很多抓到的包我们并不需要,在 exclude 添加规则;可以看到左侧少了很多包
        9
      • 我们要测试的网站可能会访问其他网站,可以通过 include 限制只抓取我们的;例如我们只想访问 baidu.com
        10
      • 此时访问 bing.com,左侧空空如也~
    • 得到了我们需要的URL,就可以禁用掉 Script Recorder
      11
    • 在 Thread Group > Listener 添加 View Results Tree,再次发送请求时,就可以在这看到结果
      12
    • 上面这是把其他的 toggle 了,不然点击 start 会全部请求并得到所有响应
  • 以上便是使用 JMeter 录制的基操,目的是得到要测试的URL(录下来)

模拟并发

  • JMeter 通过线程组(Thread Group)模拟多用户,所以 Test Plan 必须创建线程组
    • 模拟多用户主要是压力测试,性能的衡量不止抗压能力,但却是最重要的指标
    • 代表 1 秒钟模拟 500 个请求,执行一次
      1
  • 我们在下面创建 Request,
    • server 我们在本地通过 python 模拟:python -m http.server 80
    • 所以,填本地内网 IP,端口 80
      2
    • start,命令行可以看到输出
      3
  • 线程(用户)数量由 JMeter 客户端的硬件性能决定,太大就会直接报错
    • 硬件性能是一方面,也可以通过配置文件限制 VM 的内存使用范围(毕竟是个软件)
    • 运行:jconsole
      4
    • 在哪配置呢?Linux 是 jmeter.sh 里JVM_ARGS参数,Windows 是 jmeter.bat 里:
      5
    • 可以将 1g 改大一点
  • 当然,还可以类似 pytest,设置 setup/teardown request
    • View Results Tree 并不是必须的,因为请求了外部网站,不加看不到结果
      6
  • 一般在待测服务器执行压测脚本还是远端发起请求(经过域名解析这些)?

结果分析

  • 上面已经通过 View Results Tree 看到了请求的结果
    • 界面上还有个 Browse,能把其他服务器上的压测结果拿过来看
    • 有多种格式,支持 json,正则过滤等等
  • 还有两种方式
    • Aggregate Report 聚合报告
  • Aggregate Report
    • 各指标含义
      1
    • 本地启动服务,5个并发,平均响应时间14,还可以
      2
    • 但我们一般不使用图形界面,本身就会占用资源
    • 在图形界面创建计划并保存,命令行运行:jmeter -n -t aggregate.jmx -l test_http.jtl
      • 不使用图形界面
      • 一般会保存成 .jtl 报告
      • .jmx 文件是 xml 格式,可以直接打开修改配置
      • 报告就保存到当前目录了,还是应该配置 jmeter 的环境变量
        3
      • 因为是通过 python 在本地开的服务,后面已经开始出错了;TPS 一直在 700 以下
    • docker 创建 nginx 容器做服务器,测一下
      • 创建容器 docker run --name nginx-load-test -p 88:80 -d nginx:1.17.9,我们映射到本地的 88 端口,和 python server 区别
      • Windows上使用 docker 麻烦一些,Linux又不支持GUI界面,你可以买一台苹果~
      • 更改 jmx(改访问的端口),再次启动测试,主要看 TPS,CPU 占用率(docker stats nginx-load-test),平均响应时间
      • docker 中的 ip 和本机内网 ip 一样吗?推荐文章

分布式

  • 为了突破单机的性能瓶颈,我们一般用分布式集群进行压测,确保有足够压力
  • 负载机(slaver)部署步骤
    • 解压安装 jmeter 包
    • 修改:bin/jmeter.properties
      • 查找并设置 server.rmi.ssl.disable=true 不使用 SSL
    • 修改:bin/system.properties
      • 添加:java.rmi.server.hostname=192.168.100.99 本机内网 ip
    • 启动:Windows中就是双击 jmeter-server.bat
      1
    • 同样的,其他 slave 机器也这样设置,我这里另一台 Linux 机器的 ip 为 192.168.109.131
    • 启动:bin/jmeter-server
  • 控制机(controller)部署
    • 不使用 SSL
    • 修改 bin/jmeter.properties
      # Remote Hosts - comma delimited
      remote_hosts=192.168.109.131:1099,192.168.109.132
      
    • 启动:jmeter / jmeter.sh (GUI 方式)
    • 主从关系
      3
    • 一般不会把 controller 配置成 slave,本身负载就比较大,单独分开比较好
  • 在 controller 远程启动 slave 干活
    • 创建线程组,配置要请求的地址

    • Remote Start,使用集群机器向被测机器发起请求,如果是 Start All 每个 slave 都会执行一遍计划(request/record controller)
      5
      6

    • 1099 是 slave 的默认端口,可以不用指定,也可以在 jmeter.properties 指定 server_port=1099

    • 也许会主从连接失败,一般是因为忘了关闭 slave 的防火墙 systemctl stop firewalld.service

  • 当然,也可以在 controller 使用命令行启动
    • 执行:jmeter -n -t fenbushi.jmx -l fenbushi.jtl -R 192.168.109.131:1099,192.168.109.132

性能监控

  • 数据展示平台实时展示压测数据
  • 这里用到两个工具:influxdb 和 grafana
    • 比较方便的使用方法是在 docker 里启动,但对Windows不太友好,使用 Mac 作为主机的同学可以直接用 docker
    • 这里推荐一种 Windows 上安装的方法
    • 下载地址:grafana-9.3.1 influxdb-2.5.1
    • grafana 是图形展示,能够和 influxdb 无缝对接
  • influxdb
    • influxdb 是数据源,可以理解成是一种时间序列数据库,解压后在 cmd 运行 influxd,从浏览器来到图形界面
      1

    • 有三种操作数据库的方式
      3

      UI 就是图形界面啦,在浏览器操作
      CLI (command line interface) 单独提供的命令行工具,must be downloaded and installed separately.
      HTTP API 也就是通过 Client Libraries (开发语言操作) UI界面有教程,或者是直接使用 cURL 之类的工具调用API

    • 先看下 HTTP API,选一种你熟悉的语言,跟着教程走一遍,官方文档

      • cmd 能看到一些 log,最好是直接在 pycharm 执行代码,方便调试
        2
      • 建议看详细教程,先不要到 Cloud 上搞,容易受网络影响
    • 核心概念是 bucket,所以的数据都存在这里,类似 SQL 数据表;完整代码:

      import influxdb_client, os, time
      from influxdb_client import InfluxDBClient, Point, WritePrecision
      from influxdb_client.client.write_api import SYNCHRONOUS
      
      # InfluxDB Cloud uses Tokens to authenticate API access.
      # We've created an all-access token for you for this set up process.
      # token = os.environ.get("INFLUXDB_TOKEN")
      token = "xxx-xxx" # 用你自己的token
      print(token)
      org = "Roy"
      # url = "https://us-west-2-1.aws.cloud2.influxdata.com/"
      url = "http://localhost:8086"
      
      # initialize the token, organization info, and server url
      # that are needed to set up the initial connection to InfluxDB.
      # The client connection is then established with the InfluxDBClient initialization.
      client = influxdb_client.InfluxDBClient(url=url, token=token, org=org)
      
      bucket = "first_bucket"
      
      # 得到API,执行写操作
      write_api = client.write_api(write_options=SYNCHRONOUS)
      
      p = influxdb_client.Point("my_measurement").tag("location", "Prague").field("temperature", 25.3)
      write_api.write(bucket=bucket, org=org, record=p)
      
      # 先执行上面的部分,写入数据到 bucket
      if __name__ == '__main__':
          # 查询
          query_api = client.query_api()
          # 类似SQL语句,这里叫做 flux,语法类似
          # The query client sends the Flux query to InfluxDB
          # and returns a Flux object with a table structure.
          query = 'from(bucket:"first_bucket")\
          |> range(start: -10m)\
          |> filter(fn:(r) => r._measurement == "my_measurement")\
          |> filter(fn:(r) => r.location == "Prague")\
          |> filter(fn:(r) => r._field == "temperature")'
      
          result = query_api.query(org=org, query=query)
      
          results = []
          for table in result:
            for record in table.records:
              results.append((record.get_field(), record.get_value()))
      
          print(results)  # [(temperature, 25.3)]
      
  • grafana
    • 官方文档
    • 启动:安装后的 bin 文件夹里 grafana-server.exe 访问 http://localhost:3000

grafana

  • 配置数据源(Data Source)
    • grafana 配置使用 influxdb 数据源,详细文档
      2
      3
    • 如果都是用 docker,有容器的配置方法,这里直接使用刚创建的 bucket
      5
      4
    • 详细介绍都在文档里,这里也有;上面使用的是 Configure Flux 方式
    • 这里推荐学习 Flux,因为 influxdb 用的是 OSS v2.5 版本,不再使用 databases 的概念了,即使用 SQL-like 方式,也是转化为 bucket
    • Flux 基础语法
    • 使用 Flux 向 influxdb 写数据
    • 使用 Flux 查询 influxdb 中的数据
    • Flux 是一门数据库语言,可以依赖平台(数据源)直接运行其脚本,比如在 influxdb 上
    • 也可以直接通过 API 执行 Flux 语句,上面给出了 python 的例子
    • influxdb 提供了直接对接第三方数据的接口,比如 jmeter 的数据直接写入到 influxdb (在 jmeter 中使用后端监听器 backend listener)
  • 配置仪表盘(Dashboard)
    • 这里重点看数据怎么展示,官方文档,说的很详细
    • You can create the perfect dashboard for your need. Each panel can interact with data from any configured Grafana data source.
    • Dashboard snapshots are static. 就是说如果更新了查询语句,需要 update snapshot
    • Dashboard 的界面介绍
    • 创建仪表盘,文档说的很详细,但是对于 jmeter,grafana 有对应的模板,我们选择这个
      1
    • 直接把地址粘贴过来 Load
      2
    • 这个 Measurement name 等价于 MySQL 中 table,指代数据表,这里默认 jmeter
    • import 之后
      3
  • 测试
    • 上面在尽力说清楚如何把保存测试数据及展示数据的两个工具串联起来
    • 接下来启动 jmeter,直接配置后端监听器为 influxdb,数据给到 influxdb 并在 grafana 展示一把
      4
    • 数据是给到了,但是没在 grafana 显示,添加 bucket 没有问题,为什么不显示呢?
      5
    • grafana 和 influxdb 是通的,influxdb 和 jmeter 是通的,那问题只能出在显示这里了,看到 Dashboard 的那堆感叹号了吗?换一个 Dashboard 就完美了
      6
    • 我们可以在右上角的 settings 编辑这个模板,能看到它的查询语句
      7
      8
  • Q&A:这里过滤查询 jmeter 表(measurement)
    • 但从上面的截图可以看到,jmeter 下面有4个application,但我这里只有两个
      9
    • 分析:之前使用 Telegraf 向 bucket 写数据,虽然是同一个数据库(bucket),但这个插件是运行在 docker 中的,这种情况下向 jmeter 表中写了前两个 application
      10
    • 也就是同一个库的同一个表,但有两个 application 在 docker 中,不允许访问了
    • 想换个专门的 Dashboard 展示这部分,创建 telegraf 的时候也会给一个 token,使用这个token 配置Data Soource,但识别不出来这个 bucket
      11
    • 原因是 telegraf 给的这个 token 权限不足,但好像无法修改,是官方设定的,可能对于 data collector 是必要的
      12
    • 一方面是 docker 隔离,必须分开获取,一方面又 token 权限不足,导致无法展示~

Flux

  • 上面接触了几个概念
    • bucket:相当于数据库 database
    • measurem:相当于数据表 table
  • 但还有一些,包括 Flux syntax 的含义都不熟悉,有点本末倒置
    • 后续的 CURD 都是通过 Flux
    • 在这里会结合文档一探究竟
  • 实战部分可以学以致用

Prometheus

  • 上面使用 influxdb 存储我们通过 jmeter 测试服务器得到的数据
  • 这里介绍一个工具,能实时获取到服务器各种性能数据,再用 grafana 展示
    • 压测展示的是性能数据,比如平均响应时间等
    • Prometheus 是监控硬件状态,CPU,内存,磁盘,温度等信息
  • 安装
    • 下载地址,我这里还是 Windows
    • 建议使用 docker,注意要和前面的 grafana 使用同一个 docker network
    • 还要下载 node_exporter,这个是真正监控主机的,在 Linux 上直接解压运行
    • 但是没有 Windows 的 node_exporter,好在社区提供了 windows_exporter
    • Prometheus 和 node_exporter 的关系:exporter 会后台运行,监控主机的状态,P 会去抓取 e 收集到的信息
  • 启动
    • 直接运行 exporter,访问 http://localhost:9182/,可以在 Metrics 看到信息(在哪运行就是监听哪个机器)
    • 修改 P 的配置文件 prometheus.yml,写上运行 exporter 的 IP:port
      scrape_configs:
        # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
        - job_name: "prometheus"
      
          # metrics_path defaults to '/metrics'
          # scheme defaults to 'http'.
          scrape_interval: 5s
          metrics_path: "/metrics"
          static_configs:
            - targets: ["localhost:9182"]
      
    • 运行 prometheus.exe,访问 http://localhost:9090/,在 Targets 能看到
      1
  • 展示
    • 在 grafana 添加数据源
      2
    • 配置 Dashboard,可以搜索使用,配置数据源时也有推荐(就用推荐的,比较新)
      3
    • 可以在命令行启动 python 的服务器并访问,被监控的 Linux 机器可以配置个 NGINX 服务器,然后通过 jmeter 疯狂访问,看看 Dashboard
      4

小结

  • 这篇内容比较多,但属于傻瓜式教程,我们围绕 jmeter,分别引入了数据收集,数据展示的多种工具
  • 下一篇会记录《电商系统压测实战》的过程,结合具体业务需求,开展测试

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

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

相关文章

基于Kubeadm快速部署一个K8s集群

目录kubeadm概述安装要求准备环境安装kubelet、kubeadm、kubectl使用kubeadm引导集群下载各个机器需要的镜像初始化主节点安装网络组件常用shell命令测试kubernetes集群部署dashboardkubeadm概述 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。 这个工具能通…

索引创建、删除的sql语句

目录 创建索引 使用ALTER TABLE 语句创建索引 使用CREATE TABLE 语句创建索引 删除索引 使用ALTER TABLE 语句删除索引 使用DROP INDEX 语句删除索引 创建索引 1、创建表的同时&#xff0c;指定给某个字段创建索引&#xff08;name&#xff09; create table cat(id …

SaaS 产品的文档策略

作者&#xff1a;Vaijayanti Nerkar 和 Priya Shetye&#xff0c;BMC Software 几年前&#xff0c;当 BMC Software 决定进军 SaaS 市场时&#xff0c;该公司开始投资开发基于云的产品。20多年来&#xff0c;BMC Software 产品都是典型的本地产品&#xff0c;因此&#xff0c;…

2022.12.11-YOLOv5使用NCNN将模型部署到Android端教程(1)部署自己的训练模型到Android实现静态图片检测

文章目录1. 前言2. 模型转换2.1. NCNN2.1.1. 简介2.1.2. ncnn2.1.3. ncnn-android-yolov52.2. 项目准备2.2.1. 安装Android studio2.2.2. 下载解压源码2.3. 安卓源码重新编译2.3.1. 构建工程2.3.2. 修改源码2.3.2.1. 修改CMakeLists.txt中的路径2.3.2.2. 重新重新ysnc project2…

【华为上机真题 2022】相对开音节

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

【无需注册账号】只需两步, Ai Studio上也可以玩[ChatGPT]了

☆ 只需两步&#xff0c; Ai Studio上也可以玩[ChatGPT]了 ☆ 无需账号即可体验喽~ 体验地址 只需两步&#xff0c; Ai Studio上也可以玩[ChatGPT]了 文章目录☆ 只需两步&#xff0c; Ai Studio上也可以玩[ChatGPT]了 ☆0 Fork后进入项目应用中心体验☆本页面下方体验☆注意…

5G无线技术基础自学系列 | 勘测准备

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 基站在详细的勘测之前需要做的准备包括…

CN_UDP协议

文章目录UDP协议UDP概述UDP的首部格式UDP数据报封装入IP数据报UDP校验伪首部真首部UDP数据报处理例UDP vs TCPUDP协议 User Datagram Protocol - Wikipedia 1Attributes2Ports3UDP datagram structure4Checksum computation 4.1IPv4 pseudo header4.2IPv6 pseudo header 5Reli…

百度安全查询,查询网址是否存在百度安全风险的方法

如果网站被百度安全识别为风险网站&#xff0c;或者是提示该页面可能存在虚假信息&#xff0c;该页面可能已被非法篡改&#xff0c;那么就不妙了。 怎样才能知道自己的网是否存在百度安全风险&#xff1f; 查询网站百度安全的方法: 第一步、打开SEO综合查询工具 第二步、添加…

[附源码]Python计算机毕业设计SSM基于的校园失物招领平台(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

线程池 (通俗易懂)

线程池一、线程池是什么二、标准库中的线程池三、实现线程池3.1 思路与细节3.2 完整代码四、标准库里的构造方法一、线程池是什么 之前我们已经认识过"池"&#xff1a;String&#xff0c;字符串常量池&#xff1b;MySQL JDBC&#xff0c;数据库连接池(DataSource)……

【案例实践】EKMA曲线及大气O3来源解析

【查看原文】EKMA曲线及大气O3来源解析实践技术应用 目前&#xff0c;大气臭氧污染成为我国“十四五”期间亟待解决的环境问题。臭氧污染不仅对气候有重要影响&#xff0c;而且对人体健康、植物生长均有严重损害。为了高效、精准地治理区域大气臭氧污染&#xff0c;首先需要了…

【OpenCV学习】第14课:边缘检测与自定义线性滤波(卷积, Rebert算子, Sobel算子, 拉普拉斯算子)

仅自学做笔记用,后续有错误会更改 参考文章&#xff1a;http://t.zoukankan.com/whw1314-p-12007928.html 理论 卷积的概念&#xff1a; 在图像上使用卷积的目的&#xff1a;模糊图像&#xff0c; 提取边缘轮廓&#xff0c; 图像锐化等 卷积如何工作&#xff1a; 下边给出…

MATLB|基于燃料电池混合动力汽车双层凸优化

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

算法基础篇-01-时间复杂度和空间复杂度

1. 用什么表示算法的运行快慢&#xff1f; n 代表是算法里面的问题规模&#xff0c;n越大&#xff0c;运算越慢&#xff0c;比如n1和n100肯定是不一样的&#xff1b;机器不一样&#xff0c;相同的算法代码运行所消耗的时间也不一样&#xff1b; 2. 借用生活中的案例 类比生活中…

[附源码]Python计算机毕业设计SSM基于的校园卡管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

鸿蒙开发初体验以及遇到的几点坑

今天尝试了一下鸿蒙开发&#xff0c;有一些经验跟大家进行分享。建议大家先看完我的文章&#xff0c;再去尝试鸿蒙。 我安装好了开发工具&#xff0c;并且跑通了Hello World程序。同时&#xff0c;我还跑通了小鸿网课Java版本项目&#xff1a; 感觉&#xff0c;还好吧… 操作…

[附源码]Python计算机毕业设计SSM基于的小型房屋租赁平台(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

WordPress后台添加顶级菜单add_menu_page()函数的用法及实例代码

WordPress后台管理页面包括文章、多媒体、链接、页面、评论、外观、插件......等等主菜单选项&#xff0c;我们在开发主题和插件的时候经常需要在后台添加菜单。 目录 一、WordPress后台添加顶级菜单 概述 一、add_menu_page()函数介绍 三、参数详解 四、Wordpress默认菜…

零基础怎么入门Python?

“零基础可以学习Python吗&#xff1f;” 这是很多初学者经常问的一个问题&#xff0c;我的回答是可以&#xff01; 现在很多小学、初中也开始学习编程语言&#xff0c;选择的入门语言就是Python。 Python其实和学中文没什么区别&#xff0c;学习中文是为了更好的和人沟通&a…