让JMeter测试数据生成更容易

news2024/9/25 19:22:21

让JMeter测试数据生成更容易

背景:

在软件测试过程中,为了确保系统的稳定性和可靠性,需要对各种场景进行全面的测试。而不同的场景往往需要各种各样的测试数据,这些数据需要具有一定的真实性和多样性,以模拟实际使用中的各种情况。然而,手动创建大量的测试数据是一项繁琐且耗时的工作,并且可能无法保证数据的质量和一致性。针对此情况,要么需要测试人员花费大量时间和精力手动编写数据,要么使用一些工具来自动生成测试数据。

1. Faker介绍

Faker 是一个 Python 库,主要用于生成各种类型的模拟数据,以在开发和测试过程中使用。Faker 就是这样一个非常实用的工具,它主要用来生成开发测试过程中的模拟真实数据,能够极大地提高测试效率和质量

它可以生成诸如人名、地址、电话号码、电子邮件、日期、时间、公司名称、职位、信用卡号码等各种看似真实的信息。这些模拟数据在测试软件功能、验证数据处理逻辑、填充数据库进行性能测试等方面非常有用。

通过使用 Faker,开发人员和测试人员可以快速创建大量具有不同特征和多样性的数据,而无需手动输入或从真实数据源获取。这有助于更全面地测试应用程序在不同数据条件下的行为,发现潜在的问题,并提高软件的质量和稳定性。

总之,Faker 是一个强大的工具,能够为开发和测试工作提供方便、高效的模拟数据生成解决方案

在JMeter中也可以使用faker来实现,这里使用的是javafaker的jar包

1.1 下载

  1. 访问java的maven仓库

  2. 输入javafaker进行查询

image-20240801101941482

  1. 点击进入进行下载

    image-20240801102540453

  2. 下载成功

    image-20240801102612656

  3. 由于javafaker有依赖,还需要安装snakeyaml,使用如上方法进行下载

    image-20240801102717070

  4. 如果没有看到jar下载,点击view all

    image-20240801102909122

  5. 选择jar包下载即可

    image-20240801102938325

1.2 安装

前提:已下载2个jar包

image-20240801103049626

把上面2个jar包放到JMeter的lib目录下

image-20240801104612034

2. JMeter+Faker使用

案例:

同步用户数据接口,名称、姓别、年龄、手机号码、电子邮件、地址等数据批量自动生成

脚本编写:

步骤:

  1. 创建线程组
  2. 创建HTTP信息头管理器
  3. 创建BeanShell 预处理程序
  4. 创建调试取样器
  5. 创建查看结果树
  6. 创建HTTP请求
  1. 创建线程组,点击测试计划,右键选择线程-线程组直接创建即可
  2. 创建配置元件 - HTTP信息头管理器,发送post请求需要,否则请求不成功

image-20240801105756211

  1. 创建前置处理器 - BeanShell 预处理程序

    在此编写faker相应的代码,faker具体使用可参考apidoc,访问地址如下:

    image-20240801111232810

    BeanShell中内容如下

    import com.github.javafaker.Faker;
    
    Faker faker = new Faker(new Locale("zh-CN"));
    String name = faker.name().name();
    String address = faker.address().fullAddress();
    vars.put("name", name);
    vars.put("address", address);
    String cityName = faker.address().cityName();
    vars.put("cityname",cityName);
    
    
  2. 创建调试取样器

  3. 创建察看结果树,运行查看

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 创建HTTP请求,可以把写入的变量进行调用,这里面使用的是postman创建的mock服务来返回响应值

    image-20240801134947309

    路径:直接添写postman的mock server地址

    参数:根据所需要的内容进行发送

3. JMeter的内置函数-自定义

JMeter本身的函数助手中已经提供了一些快捷的方法,但是依据不同项目的需求,如何能自定义方法呢?接下来我们的目标就是一起来学习研究如何把自定义的函数放到函数助手中。

image-20240802150738239

目录:创建一个生成名称的方法,根据输入的参数中文或英文生成对应的名称

用法: ${__RandName}

扩展 JMeter 的函数可以分成下面几个步骤:

  1. 在 IDE 中新建 JAVA或Maven 项目,引入扩展 JMeter 函数所需的依赖
  2. 编写并实现自定义函数的代码,编译打包
  3. 将编译好的包拷贝至 JMeter 的lib目录
  4. 编辑JMeter测试脚本,使用自定义的函数
  5. 运行脚本,查看运行结果是否正确

3.1 新建JAVA项目

​ IDE使用IDEA进行项目的创建,可以使用普通的JAVA项目或者是MAVEN项目

普通的java项目创建,把JMETER_HOME/lib下的 ApacheJMeter_core.jar 和 ApacheJMeter_java.jar 复制到java项目下,并添加到Lib中

image-20240802152648555

MAVAN项目创建

pom.xml,在 中加入 JMeter 的 ApacheJMeter_core 、ApacheJMeter_java和 ApacheJMeter_functions 依赖

    <dependencies>
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_core</artifactId>
            <version>${jmeter-version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_functions</artifactId>
            <version>${jmeter-version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_java</artifactId>
            <version>${jmeter-version}</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

由于 ApacheJMeter_core 和 ApacheJMeter_functions 已经包含在 JMeter 的运行时中,所以后面编译打包出来的 jar 不需要包含它们,此处将这两个依赖的 scope 设为 provided。

保存 pom.xml 后,如果 Maven 没有开始自动下载相关的依赖文件,在项目上右键点击,选择 Maven > Update Project,完成依赖的下载。

3.2 实现代码

扩展 JMeter 函数,有两处要点:

  1. 实现函数功能的类所在的 package 的声明必须包含".functions"

    JMeter 可以通过非 UI 方式运行,因为它的设计中让一些核心的类(比如 ApacheJMeter_core 等)可以在非 UI 运行方式下被优先加载进来,加载这些类的时候是通过命名规则来实现的。

    所有实现 JMeter 函数的类必须包含".functions.“,因此我们自定义实现的类里也必须遵守这一规则,比如,类所在的 package 名称为"com.customized.functions”

  2. 实现类继承 org.apache.jmeter.functions.AbstractFunction

3.2.1 创建Package

​ 1. 右键java,点击创建Package,输入内容com.demo.functions

image-20240802163210378

​ 2. 创建成功

image-20240802163136126

3.2.2 继承实现AbstractFunction类
  1. 创建实现类

image-20240802153253244

  1. 直接使用idea的提示

image-20240802153338778

  1. 点击Implement methods

image-20240802153414674

  1. 点击OK即可,默认生成相应的代码

    package com.demo.functions;
    
    import org.apache.jmeter.engine.util.CompoundVariable;
    import org.apache.jmeter.functions.AbstractFunction;
    import org.apache.jmeter.functions.InvalidVariableException;
    import org.apache.jmeter.samplers.SampleResult;
    import org.apache.jmeter.samplers.Sampler;
    
    import java.util.Collection;
    import java.util.List;
    
    public class CardIdFunc extends AbstractFunction {
        @Override
        public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
            return null;
        }
    
        @Override
        public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
    
        }
    
        @Override
        public String getReferenceKey() {
            return null;
        }
    
        @Override
        public List<String> getArgumentDesc() {
            return null;
        }
    }
    
    
3.3 AbstractFunction功能介绍

ApacheJMeter_core 中的 AbstractFunction 类提供了4个抽象方法,在扩展的时候需要实现它们。

  1. execute:JMeter 会将上次运行的 SampleResult 和当前的 Sampler 作为参数传入 execute 方法中,方法的返回值就是在运行该函数后应得到的值,返回类型为 String 类型
public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException;
  1. getArgumentDesc:关于你实现的函数所需的参数的描述。
public List<String> getArgumentDesc();
  1. setParameters :传递用户在执行过程中传入的函数所需的实际参数值
public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException;
  1. getReferenceKey:自定义的函数的名字,JMeter 约定的命名规则是在函数名前面加入双下划线"__"。建议函数的名字跟实现类的类名保持一致。
public String getReferenceKey();
3.4 示例代码
package com.demo.functions;

import com.demo.utils.FakerUtil;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.functions.AbstractFunction;
import org.apache.jmeter.functions.InvalidVariableException;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

public class NameRandomFunction extends AbstractFunction {
    //自定义function的描述
    private static final List<String> desc = new LinkedList<String>();
    static {
        desc.add("Get a random name within specified parameter Country.");
    }

    //function名称
    private static final String KEY = "__FakerNameRandom";

    private static final int MAX_PARA_COUNT = 1;
    private static final int MIN_PARA_COUNT = 1;

    //传入参数的值
    private Object[] values;

    @Override
    public List<String> getArgumentDesc() {
        return desc;
    }

    @Override
    public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException {
        try {
            //获取参数1
            String param1 = ((CompoundVariable) values[0]).execute().trim();
            FakerUtil fakerUtil=new FakerUtil();
            String name = fakerUtil.name(param1);
            return String.valueOf(name);
        } catch(Exception ex) {
            throw new InvalidVariableException(ex);
        }
    }

    @Override
    public String getReferenceKey() {
        return KEY;
    }

    @Override
    public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
        checkParameterCount(parameters, MIN_PARA_COUNT, MAX_PARA_COUNT); //检查参数的个数是否正确
        values = parameters.toArray(); //将值存入类变量中
    }
}

代码解释:

  1. 函数名称定义,对应函数助手中的函数名称。例如:__BeanShell

    // function名称
    private static final String KEY = "__FakerNameRandom";
    //返回自定义的函数的名字
    @Override
    public String getReferenceKey() {
        return KEY;
    }
    
  2. 变量存储以及验证

    // 参数的数量
    private static final int MAX_PARA_COUNT = 1;
    private static final int MIN_PARA_COUNT = 1;
    // 参数值验证
    @Override
    public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
        checkParameterCount(parameters, MIN_PARA_COUNT, MAX_PARA_COUNT); //检查参数的个数是否正确
        values = parameters.toArray(); //将值存入类变量中
    }
    
  3. function描述

    //自定义function的描述
    private static final List<String> desc = new LinkedList<String>();
    static {
        desc.add("Get a random name within specified parameter Country.");
    }
    @Override
    public List<String> getArgumentDesc() {
        return desc;
    }
    
  4. 运行该函数,这里面使用了javafaker类及方法

    ------------------------------
    //此部分是AbstractFunction的内容
    @Override
    public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException {
            try {
                //获取参数1
                String param1 = ((CompoundVariable) values[0]).execute().trim();
                FakerUtil fakerUtil=new FakerUtil();
                String name = fakerUtil.name(param1);
                return String.valueOf(name);
            } catch(Exception ex) {
                throw new InvalidVariableException(ex);
            }
        }
    
    ------------------------------
    package com.demo.utils;
    
    import com.github.javafaker.Faker;
    
    import java.util.Locale;
    import java.util.Objects;
    
    public class FakerUtil {
        public String name(String Country){
            // 创建一个Faker实例
            Faker faker=null;
            if(Objects.equals(Country, "china")){
                faker = new Faker(Locale.CHINA);
            }else{
                faker = new Faker(Locale.ENGLISH);
            }
            return faker.name().fullName();
        }
        public static void main(String[] args) {
            FakerUtil fakerUtil=new FakerUtil();
            fakerUtil.name("china1");
        }
    }
    
3.5 项目打包
  1. pom.xml配置, 为打包内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.demo</groupId>
    <artifactId>JMeter_Plugin_Test</artifactId>
    <version>1.0</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <jmeter-version>5.6.2</jmeter-version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_core</artifactId>
            <version>${jmeter-version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_functions</artifactId>
            <version>${jmeter-version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_java</artifactId>
            <version>${jmeter-version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.github.javafaker</groupId>
            <artifactId>javafaker</artifactId>
            <version>1.0.2</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>jmeter-plugins-NameRandom-${project.version}</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <!-- 打包方式 -->
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>assemble-all</id>
                        <phase>package</phase><!-- 绑定到package阶段上 -->
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
  1. maven install,直接双击即可运行打包

    image-20240802171928893

  2. 打包成功后,在target目录生成,复制jar到JMETER_HOME\lib\ext下

3.6 自定义函数使用
  1. 复制到lib下后,需要重新启动Meter,才能生效。

  2. 打开函数助手,根据定义的函数名称进行查找

    image-20240802174304381

  3. 输入参数值 :china,生成中文名称

image-20240802174338694

  1. 输入非china名称,则是英文,根据代码中编写的逻辑生成

    image-20240802174410494

3.7 执行结果验证
  1. HTTP请求中使用函数,"${__FakerNameRandom(c)}",参数非china为英文名称,china为中文名称

    image-20240802175418669

  2. 执行结果

    image-20240802175409080

  3. 输入china,"${__FakerNameRandom(china)}"

    image-20240802175347703

  4. 执行结果

    image-20240802175334734

参考:

1. Faker API使用

image-20240801111232810

以Address为例,点击Address类,查看其方法image-20240801111525329

具体使用

Faker faker = new Faker(new Locale("zh-CN"));
String cityName = faker.address().cityName();

2. Postman Mock Server使用

2.1 什么是Mock?

​ Mock:以可控的方式模拟真实对象行为的假的对象 ,可以根据自己的实际需求 返回想要的数据。

2.2 创建Mock Servers

​ 1. 步骤:Mock Servers --> + (Create Mock Server)

image-20240801135833308

  1. 添写Request Method、Requset URL等信息后,点击Next

    • Request Method: get或post,为http请求时的方法
    • Requset URL: 添加预期的方法
    • Response Body: 添加接口的返回内容

    image-20240801140258025

  2. 这个页面可以设置Mock Server的名称等信息,点击Create Mock Server

image-20240801140430313

  1. 创建成功后,会在Mock Server列表中显示,后面如何要使用,点击"Copy URl"即可复制Mock Server地址,例如:https://93a51b99-a2e2-4084-b16a-cefd24e3c1a6.mock.pstmn.io

image-20240801140536821

3. JMeter插件API

  1. 参考:官网API地址 https://jmeter.apache.org/api/org/apache/jmeter/functions/EscapeXml.html

  2. 案例参考: https://github.com/undera/jmeter-plugins/blob/master/plugins/functions/src/main/java/kg/apc/jmeter/functions/StrLen.java,具体代码如下:

    package kg.apc.jmeter.functions;
    
    import org.apache.jmeter.engine.util.CompoundVariable;
    import org.apache.jmeter.functions.AbstractFunction;
    import org.apache.jmeter.functions.InvalidVariableException;
    import org.apache.jmeter.samplers.SampleResult;
    import org.apache.jmeter.samplers.Sampler;
    import org.apache.jmeter.threads.JMeterVariables;
    
    import java.util.Collection;
    import java.util.LinkedList;
    import java.util.List;
    
    /**
     * Provides a DoubleSum function that adds two or more Double values.
     * Mostly copied from LongSum
     */
    public class StrLen extends AbstractFunction {
    
        private static final List<String> desc = new LinkedList<String>();
        private static final String KEY = "__strLen";
    
        static {
            desc.add("String to measure length");
            desc.add("Name of variable in which to store the result (optional)");
        }
    
        private Object[] values;
    
        /**
         * No-arg constructor.
         */
        public StrLen() {
        }
    
        /**
         * {@inheritDoc}
         */
        @Override
        public synchronized String execute(SampleResult previousResult, Sampler currentSampler)
                throws InvalidVariableException {
            JMeterVariables vars = getVariables();
            Integer len = ((CompoundVariable) values[0]).execute().length();
    
            if (vars != null && values.length > 1) {
                String varName = ((CompoundVariable) values[1]).execute().trim();
                vars.put(varName, len.toString());
            }
    
            return len.toString();
    
        }
    
        /**
         * {@inheritDoc}
         */
        @Override
        public synchronized void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
            checkMinParameterCount(parameters, 1);
            values = parameters.toArray();
        }
    
        /**
         * {@inheritDoc}
         */
        @Override
        public String getReferenceKey() {
            return KEY;
        }
    
        /**
         * {@inheritDoc}
         */
        public List<String> getArgumentDesc() {
            return desc;
        }
    }
    

);
}

       return len.toString();

   }

   /**
    * {@inheritDoc}
    */
   @Override
   public synchronized void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
       checkMinParameterCount(parameters, 1);
       values = parameters.toArray();
   }

   /**
    * {@inheritDoc}
    */
   @Override
   public String getReferenceKey() {
       return KEY;
   }

   /**
    * {@inheritDoc}
    */
   public List<String> getArgumentDesc() {
       return desc;
   }

}



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

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

相关文章

零基础小白实现C#调用halcon dll的过程,并测试程序证明C#halcon联合开发成功

本篇将介绍零基础小白实现C#调用halcon dll的过程&#xff0c;同时这其中涉及到很多知识&#xff0c;务必将HDevelop和VisualStudio安装成功。下面我将详细阐述C#调用halcon dll的过程&#xff0c;你的点赞和评论是我一直前行的动力。 1. C#调用Halcon DLL的过程 要在C#中调用…

选择TPM管理咨询公司,这几点是关键!

在这个日新月异的商业时代&#xff0c;企业的竞争力不仅体现在产品和服务上&#xff0c;更在于其内部管理的精细化与高效化。TPM作为提升企业综合生产效率的利器&#xff0c;正逐步成为众多企业转型升级的必然选择。然而&#xff0c;如何在众多TPM管理咨询公司中慧眼识珠&#…

嘉盛:股指、国债及商品期货分析

股指展望中证全指在2024年下半年可能迎来约20%的上涨空间。尽管市场估值较低&#xff0c;风险溢价仍维持在高位&#xff0c;这提升了指数的配置性价比。预计无风险利率将继续维持在较低水平&#xff0c;对中证全指估值产生积极影响。盈利方面&#xff0c;预计下半年中证全指EPS…

【广东】邀您共赴纷享销客生态伙伴大会

在数字化浪潮的驱动下&#xff0c;CRM行业正迎来前所未有的创新机遇。作为CRM领域的引领者&#xff0c;纷享销客特别举办“纷享销客2024生态伙伴大会&#xff08;广东站&#xff09;”。我们诚挚邀请各位生态伙伴莅临现场&#xff0c;共同探讨SaaS CRM行业的最新趋势&#xff0…

haproxy负载均衡+mysql读写分离

haproxy负载均衡 [roothaproxy01 ~]# yum -y install ntpdate [roothaproxy01 ~]# yum -y install ntp [roothaproxy01 ~]# systemctl start ntpd 安装haproxy [roothaproxy01 ~]# yum -y install ntpdate 配置文件的地址 [roothaproxy01 ~]# rpm -ql haproxy [roothap…

美摄科技携手蔚来汽车,共创用户出行新体验!

7月27日&#xff0c;蔚来举办了以 AI 为主线的 “NIO IN 2024 蔚来创新科技日”&#xff0c;此次活动展示了蔚来在智能电动汽车领域最新探索与成果&#xff0c;为中国乃至全球的智能汽车行业树立了新的标杆。当晚&#xff0c;央视《主播说联播》以“中国智能车在全球竞争的另一…

MIT6.s081 2021 Lab Multithreading

Uthread: switching between threads 思路 xv6 已经实现了进程的切换机制&#xff0c;本实验要求参考进程的切换&#xff0c;实现一个用户态线程的切换。 要实现线程切换&#xff0c;必然涉及上下文&#xff0c;即寄存器的保存和恢复&#xff0c;那么需要保存哪些寄存器&…

建筑工程项目管理系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

建筑工地安全检查

在现代化的建筑工地中&#xff0c;安全始终是至关重要的核心问题。随着科技的不断进步&#xff0c;凡尔码建筑工地安全系统应运而生&#xff0c;灵活根据施工现场管理要求搭建建筑工地安全系统各个模块&#xff0c;为施工安全带来了全新的保障。 如何注册建筑工地安全系统后台…

自动打电话软件给企业带来了什么?

使用机器人外呼系统肯定都是想要给自己企业带来好处和解决问题的&#xff0c;想让自己的企业有所改变&#xff0c;有更好的发展&#xff0c;所以才会选择使用机器人外呼系统。而它也确实没让大家失望&#xff0c;使用了机器人外呼系统之后确实有许多企业发生了很大改变和进步&a…

鲁棒性目标检测 TOP2 方案分享

关联比赛: ACM MM2021 安全AI挑战者计划第七期&#xff1a;鲁棒性标识检测 ACM MM2021 鲁棒性目标检测比赛 TOP 2 方案 ​ 赛题背景 在商品知识产权领域&#xff0c;知识产权体现为在线商品的设计和品牌。不幸的是&#xff0c;在每一天&#xff0c;存在着非法商户通过一些…

一文学会本地部署可视化应用JSONCrack并配置公网地址实现远程协作

文章目录 前言1. Docker安装JSONCrack2. 安装Cpolar内网穿透工具3. 配置JSON Crack界面公网地址4. 远程访问 JSONCrack 界面5. 固定 JSONCrack公网地址 前言 本文主要介绍如何在Linux环境使用Docker安装数据可视化工具JSONCrack&#xff0c;并结合cpolar内网穿透工具实现团队在…

[Python学习日记-9] Python中的运算符

简介 计算机可以进行的运算有很多种&#xff0c;但可不只加减乘除这么简单&#xff0c;运算按种类可分为算数运算、比较运算、逻辑运算、赋值运算、成员运算、身份运算、位运算&#xff0c;而本篇我们暂只介绍算数运算、比较运算、逻辑运算、赋值运算 算数运算 一、运算符描述…

猫头虎分享:Python库 Pillow 的简介、安装、用法详解入门教程

猫头虎分享&#xff1a;Python库 Pillow 的简介、安装、用法详解入门教程 &#x1f4da; 大家好&#xff0c;今天猫头虎要和大家分享一款非常实用的 Python 图像处理库——Pillow。 &#x1f4a1; Pillow 是 Python 中非常流行的图像处理库&#xff0c;基于已经停止维护的 PI…

CE修改器步骤9学习教程

一、打开教程&#xff0c;因为我的电脑是64位的&#xff0c;所以打开这个&#xff08;x86_64&#xff09; 二、 跳转到步骤9&#xff0c;并让ce读取其内存 三、使用之前教程学到的知识&#xff0c;找到四个角色的健康值地址&#xff08;找到即可&#xff0c;不必找基址&#xf…

【STM32 FreeRTOS】Tickless低功耗模式

STM32低功耗模式 STM32 提供了 3 种低功耗模式&#xff0c;以达到不同层次的降低功耗的目的 睡眠模式&#xff08;内核停止工作&#xff0c;外设仍在运行&#xff09;停止模式&#xff08;所有时钟都停止&#xff09;待机模式&#xff08; 1.8 V 内核电源关闭&#xff09; Fr…

Qt-认识Qt(1)

目录 QT是做什么的&#xff1f; 什么是QT GUI开发的各种技术方案 QT支持的平台 Qt的版本和优点 开发工具概述 Qt是做什么的&#xff1f; Qt是用来干嘛的&#xff1f; 什么是Qt Qt是⼀个跨平台的C图形用户界⾯应用程序框架。它为应用程序开发者提供了建立艺术级图形界⾯所…

SSH远程管理/TCP Wrappers访问控制

文章目录 SSH远程管理/TCP Wrappers访问控制SSH(Secure Shell)协议OpenSSH配置信息服务监听选项用户登录控制登录验证方式 常用目录---ssh 远程安全登录---scp 远程安全复制---sftp FTP上下载 配置密钥对验证环境配置ECDSA算法RSA算法RSA算法实操在centos7 IP:20.0.0.51操作一、…

【嵌入式linux开发】智能家居入门5:老版ONENET,多协议接入(QT、微信小程序、HTTP协议、ONENET云平台、旭日x3派)

智能家居入门5&#xff08;QT、微信小程序、HTTP协议、ONENET云平台、旭日x3派&#xff09; 前言一、QT界面设计二、云平台产品创建与连接三、下位机端QT代码总览&#xff1a;四、微信小程序端代码总览五、板端测试 前言 前四篇智能家居相关文章都是使用STM32作为主控&#xf…

用时间序列数据画蜡烛图

数据集&#xff1a;时间序列数据集&#xff08;2024.8.16收集&#xff09;-修改date资源-CSDN文库 示例一 import pandas as pd import mplfinance as mpf# 读取CSV文件 df pd.read_csv(999999_dcolhchg.csv)# 将日期列加上19000000&#xff0c;然后转换为日期格式 df[date]…