模拟服务器响应的测试框架:moco

news2024/9/22 17:30:28

第1章:引言

大家好,我是小黑,在这篇博客中,咱们要聊聊Moco测试框架。这个框架,可不是一般的小伙伴,它在模拟服务器响应这块儿,可是有不少看家本领。

首先,Moco是啥呢?简单说,Moco是一个用来模拟服务器行为的轻量级测试框架,尤其在处理HTTP和RESTful API测试方面表现出色。对于咱们这些程序员来说,测试是个既重要又头疼的活儿,特别是当你需要一个稳定、可控的测试环境时。这时候,Moco就像是一个救星,它能帮你模拟各种服务器响应,让测试变得简单又高效。

那为啥要用Moco而不是别的呢?主要有几个理由:首先,它超级简单易用。你不需要搭建复杂的测试环境,几行代码就能搞定。其次,它灵活多变,无论是静态响应还是动态逻辑,Moco都能轻松应对。

第2章:Moco的基本概念

接下来,咱们深入一下,聊聊Moco的基本概念和工作原理。理解了这些,用起Moco来会更得心应手。

Moco的核心理念是“模拟真实”,它通过提供一个虚拟的服务器环境,让你能在不依赖真实服务器的情况下进行各种测试。这听起来可能有点抽象,咱们用个例子来说明。

假设你正在开发一个需要调用第三方API的应用。在开发过程中,频繁地向真实的第三方服务器发送请求不仅效率低,而且可能因为网络问题或第三方服务器的不稳定性影响开发进度。这时,Moco就能发挥作用了。你可以用Moco来模拟这个第三方API的响应,这样在开发和测试阶段就不用依赖真实的第三方服务了。

import com.github.dreamhead.moco.HttpServer;
import com.github.dreamhead.moco.Runner;
import com.github.dreamhead.moco.Moco;

public class MocoDemo {
    public static void main(String[] args) {
        // 创建一个Moco的HTTP服务器,监听12306端口
        HttpServer server = Moco.httpServer(12306);
        // 当接收到对"/hello"路径的GET请求时,响应"Hello"
        server.get(Moco.path("/hello")).response

("Hello");

        // 启动服务器
        Runner runner = Runner.runner(server);
        runner.start();

        // 这里可以写测试代码,模拟发送请求到服务器
        // ...

        // 测试结束,停止服务器
        runner.stop();
    }
}

// 在这个例子中,咱们创建了一个Moco的HTTP服务器,它监听12306端口。
// 当有请求访问"/hello"这个路径时,服务器就会回应一句“Hello”。
// 这样,咱们就可以在本地测试这个响应,而不用依赖真实的服务器环境。

通过这个简单的例子,咱们可以看到Moco的基本使用方法。但这只是冰山一角,Moco还有很多高级功能等着咱们去挖掘。比如说,动态响应、条件响应、甚至模拟复杂的业务逻辑,Moco都能轻松搞定。

小黑偷偷告诉你一个生财信息差网站: 小黑的生财资料站

第3章:环境搭建与配置

Moco环境搭建

要使用Moco,你得有Java环境。因为Moco是用Java写的,所以必须安装Java Development Kit (JDK)。一般来说,安装最新的版本是最好的选择,这样能确保兼容性和安全性。

接着,咱们需要一个构建工具。Moco支持多种构建工具,比如Maven或Gradle。这里以Maven为例,展示怎么配置。

在你的项目的pom.xml文件中,加入Moco的依赖。这样,Maven就会在构建时自动下载和管理Moco库。下面是Moco依赖的例子:

<dependencies>
    <dependency>
        <groupId>com.github.dreamhead</groupId>
        <artifactId>moco-core</artifactId>
        <version>最新版本号</version>
    </dependency>
    <!-- 根据需要,可能还要加入其他依赖 -->
</dependencies>
基本配置

好了,环境搭建好了,咱们来看看怎么配置一个基本的Moco服务器。这里小黑用一个简单的例子,展示怎么启动一个HTTP服务器,并对一个请求做出响应。

import com.github.dreamhead.moco.HttpServer;
import com.github.dreamhead.moco.Runner;
import com.github.dreamhead.moco.Moco;

public class SimpleMocoServer {
    public static void main(String[] args) {
        // 创建一个Moco的HTTP服务器,监听8080端口
        HttpServer server = Moco.httpServer(8080);
        // 当接收到对"/test"路径的GET请求时,响应"测试成功"
        server.get(Moco.path("/test")).response("测试成功");

        // 启动服务器
        Runner runner = Runner.runner(server);
        runner.start();

        // 这里可以加入你的测试代码
        // ...

        // 记得测试完成后,要停止服务器
        runner.stop();
    }
}

这段代码创建了一个监听8080端口的HTTP服务器。当有请求访问/test路径时,服务器会回应一句“测试成功”。这样,你就可以在本地测试这个响应了。

小提示
  • 保证你的防火墙设置允许Moco使用指定的端口。
  • 测试时,用浏览器或者任何HTTP客户端工具,像Postman这样的,都能向你的Moco服务器发送请求。

这样一来,咱们就完成了Moco的环境搭建和基本配置。下一步,就是开始使用Moco来模拟各种各样的HTTP响应了。

第4章:使用Moco模拟HTTP响应

咱们已经准备好了Moco的环境和基本配置。现在,小黑要带大家深入一下,看看如何使用Moco模拟HTTP响应。这不仅仅是关于代码,更是一种模拟的艺术。

模拟简单的文本响应

让我们先从最基本的开始,模拟一个简单的文本响应。比如,当客户端请求某个路径时,我们让服务器返回一段简单的文本。

import com.github.dreamhead.moco.HttpServer;
import com.github.dreamhead.moco.Runner;
import com.github.dreamhead.moco.Moco;

public class TextResponseDemo {
    public static void main(String[] args) {
        // 创建HTTP服务器,监听12345端口
        HttpServer server = Moco.httpServer(12345);
        // 当访问"/text"时,返回文本"这是一段文本响应"
        server.get(Moco.path("/text")).response("这是一段文本响应");

        // 启动服务器
        Runner runner = Runner.runner(server);
        runner.start();

        // 在这里进行你的测试
        // ...

        // 测试结束后,不要忘记停止服务器
        runner.stop();
    }
}

这个例子很直白。当有请求访问/text这个路径时,服务器就会回应一段文本:“这是一段文本响应”。

模拟JSON响应

文本响应固然简单,但在实际开发中,我们更多时候会处理JSON格式的数据。Moco在这方面也很给力,可以轻松模拟JSON响应。

import com.github.dreamhead.moco.HttpServer;
import com.github.dreamhead.moco.Runner;
import com.github.dreamhead.moco.Moco;

import static com.github.dreamhead.moco.Moco.json;

public class JsonResponseDemo {
    public static void main(String[] args) {
        HttpServer server = Moco.httpServer(12345);
        // 模拟JSON响应
        server.get(Moco.path("/json")).response(
            json(
                Moco.map(
                    "message", "这是一个JSON响应",
                    "status", "成功"
                )
            )
        );

        Runner runner = Runner.runner(server);
        runner.start();

        // 进行你的测试
        // ...

        runner.stop();
    }
}

在这个例子中,当请求访问/json路径时,Moco服务器会返回一个JSON格式的响应。这个响应包含了两个字段:messagestatus,分别对应的值是“这是一个JSON响应”和“成功”。

处理不同类型的HTTP请求

在现实的HTTP通信中,不仅仅有GET请求。POST、PUT、DELETE这些HTTP方法同样重要。Moco能够模拟这些不同类型的请求。比如,咱们来看看如何模拟一个POST请求。

import com.github.dreamhead.moco.HttpServer;
import com.github.dreamhead.moco.Runner;
import com.github.dreamhead.moco.Moco;

public class PostRequestDemo {
    public static void main(String[] args) {
        HttpServer server = Moco.httpServer(12345);
        // 模拟POST请求
        server.post(Moco.path("/submit")).response("提交成功");

        Runner runner = Runner.runner(server);
        runner.start();

        // 在这里进行你的POST请求测试
        // ...

        runner.stop();
    }
}

在这个例子里,当服务器接收到对/submit路径的POST请求时,会返回“提交成功”的响应。

模拟请求参数和响应

现实场景中,请求通常会携带一些参数,Moco也可以模拟这样的情况。假设我们要模拟一个GET请求,这个请求带有一个查询参数,并且服务器根据这个参数返回不同的响应。

import com.github.dreamhead.moco.HttpServer;
import com.github.dreamhead.moco.Runner;
import com.github.dreamhead.moco.Moco;

public class RequestParamDemo {
    public static void main(String[] args) {
        HttpServer server = Moco.httpServer(12345);
        // 模拟带参数的请求
        server.get(Moco.path("/query"))
              .request(Moco.query("key"))
              .response("你查询的关键词是: " + Moco.var("key"));

        Runner runner = Runner.runner(server);
        runner.start();

        // 在这里进行你的参数测试
        // ...

        runner.stop();
    }
}

在这个例子中,当服务器收到对/query路径的GET请求,并且请求中包含了key这个查询参数时,服务器会返回一个包含该参数值的响应。

通过这些例子,你应该对如何使用Moco模拟不同类型的HTTP响应有了基本的了解。Moco的强大之处在于它的灵活性和易用性,让我们可以很方便地模拟出各种复杂的服务器行为。

第5章:使用Moco进行RESTful API测试:模拟与验证

小黑在这一章要带大家深入到Moco的另一个重要应用领域:RESTful API测试。在现代的Web应用开发中,RESTful API扮演着至关重要的角色。但测试它们往往不是一件轻松的事情。幸运的是,Moco在这方面也展现出了它的强大。

RESTful API的基本概念

RESTful API,简单来说,就是一种遵循REST(Representational State Transfer,表述性状态转移)原则的网络应用程序接口。这种类型的API通常使用标准的HTTP方法,比如GET、POST、PUT和DELETE,来进行数据的读取、创建、更新和删除操作。

模拟RESTful API

咱们来看看怎么用Moco来模拟一个简单的RESTful API。假设咱们有一个用户信息的API,它可以让你查询、创建和更新用户信息。

import com.github.dreamhead.moco.HttpServer;
import com.github.dreamhead.moco.Runner;
import com.github.dreamhead.moco.Moco;
import static com.github.dreamhead.moco.Moco.json;

public class RestfulApiDemo {
    public static void main(String[] args) {
        HttpServer server = Moco.httpServer(12345);

        // 模拟GET请求:获取用户信息
        server.get(Moco.path("/users/1"))
              .response(
                  json(
                      Moco.map(
                          "id", 1,
                          "name", "张三",
                          "email", "zhangsan@example.com"
                      )
                  )
              );

        // 模拟POST请求:创建新用户
        server.post(Moco.path("/users"))
              .response("用户创建成功");

        // 模拟PUT请求:更新用户信息
        server.put(Moco.path("/users/1"))
              .response("用户信息更新成功");

        Runner runner = Runner.runner(server);
        runner.start();

        // 这里可以进行你的API测试
        // ...

        runner.stop();
    }
}

在这个例子里,咱们设置了三个路由:一个用于获取用户信息(GET请求),一个用于创建新用户(POST请求),还有一个用于更新用户信息(PUT请求)。

验证RESTful API

模拟API只是第一步,验证它们的行为同样重要。Moco提供了一些功能,让我们能够验证API的行为是否符合预期。

// 示例:验证POST请求的响应
server.post(Moco.path("/users"))
      .request(Moco.and(
          Moco.with(Moco.jsonPath("$.name")),  // 请求体中包含name字段
          Moco.with(Moco.jsonPath("$.email"))  // 请求体中包含email字段
      ))
      .response("用户创建成功");

在这个例子中,当POST请求到/users路径时,Moco会验证请求体中是否包含nameemail字段。这样,咱们就能确保发送到这个API的数据是符合预期的。

通过上面的例子,你应该对如何使用Moco模拟和验证RESTful API有了一个基本的了解。Moco的这种灵活性和强大功能,使得它成为测试RESTful API的得力工具。

深入理解Moco的请求匹配和响应

在实际的应用场景中,你可能需要更精细的控制。比如,你想根据不同的请求内容返回不同的响应。Moco提供了强大的匹配器(Matcher),可以实现这一点。

// 示例:根据请求体中的内容返回不同的响应
server.post(Moco.path("/users"))
      .request(Moco.eq(Moco.jsonPath("$.type"), "admin"))
      .response(json(Moco.map("message", "管理员创建成功")));

server.post(Moco.path("/users"))
      .request(Moco.eq(Moco.jsonPath("$.type"), "user"))
      .response(json(Moco.map("message", "普通用户创建成功")));

这个例子展示了如何根据POST请求体中的type字段来决定返回的响应。如果type的值是admin,则返回“管理员创建成功”的消息;如果是user,则返回“普通用户创建成功”的消息。

完善的测试体验

Moco不仅仅是模拟响应那么简单,它还提供了一系列的工具来帮助你更好地测试你的API。比如,你可以记录和检查请求日志,或者使用Moco提供的断言来确保API的行为完全符合你的预期。

通过Moco模拟RESTful API,你可以在没有实际后端服务的情况下,对前端应用进行全面的测试。这不仅加快了开发过程,还提高了整体的质量和稳定性。

这样一来,咱们对使用Moco进行RESTful API的测试就有了一个清晰的认识。通过结合不同的请求类型、匹配条件和响应,你可以构建出几乎任何你需要的API测试场景。Moco在这里展示出了它的真正力量,让API测试变得既简单又高效。

第6章:高级功能:动态响应和条件模拟

这一章,咱们要探索Moco的一些高级功能:动态响应和条件模拟。这些功能在复杂的测试场景中特别有用,比如当响应需要根据请求的不同而变化时。来看看Moco怎么让这些复杂的任务变得简单。

动态响应的魅力

在实际开发中,服务器的响应往往需要根据请求的内容动态生成。Moco可以模拟这样的动态响应。比如,你可能想根据请求中的某个参数来定制响应。Moco可以轻松做到这一点。


java
import com.github.dreamhead.moco.HttpServer;
import com.github.dreamhead.moco.Runner;
import com.github.dreamhead.moco.Moco;

import static com.github.dreamhead.moco.Moco.by;
import static com.github.dreamhead.moco.Moco.text;

public class DynamicResponseDemo {
    public static void main(String[] args) {
        HttpServer server = Moco.httpServer(12345);

        // 模拟根据请求内容动态生成响应
        server.get(Moco.path("/dynamic"))
              .request(by(Moco.uri("/dynamic")))
              .response((request) -> {
                  String query = request.getUri().getQuery();
                  return text("你发送的查询参数是: " + query);
              });

        Runner runner = Runner.runner(server);
        runner.start();

        // 在这里进行你的动态响应测试
        // ...

        runner.stop();
    }
}

在这个例子中,当接收到对/dynamic的GET请求时,服务器会根据请求中的查询参数,动态生成响应内容。

条件模拟的实现

除了动态响应,Moco还能根据不同的条件来模拟不同的服务器行为。这在你需要模拟服务器在不同情况下的行为时特别有用。

import com.github.dreamhead.moco.HttpServer;
import com.github.dreamhead.moco.Runner;
import com.github.dreamhead.moco.Moco;

public class ConditionResponseDemo {
    public static void main(String[] args) {
        HttpServer server = Moco.httpServer(12345);

        // 当请求的header中包含特定值时,返回特定响应
        server.get(Moco.path("/condition"))
              .request(Moco.header("Authorization", "Bearer your_token"))
              .response("授权成功,访问允许");

        server.get(Moco.path("/condition"))
              .response("未授权,访问拒绝");

        Runner runner = Runner.runner(server);
        runner.start();

        // 进行条件响应的测试
        // ...

        runner.stop();
    }
}

在这个例子里,服务器会根据请求头中的Authorization字段来决定响应内容。如果请求头包含了正确的Authorization值,则返回“授权成功,访问允许”;否则,返回“未授权,访问拒绝”。

动态与条件相结合

Moco的真正强大之处在于,你可以将动态响应和条件模拟相结合,以适应更加复杂的测试场景。例如,你可以根据请求的不同,动态地选择不同的处理逻辑。

// 示例:根据请求类型动态选择处理逻辑
server.get(Moco.path("/combined"))
      .request(Moco.ajax())
      .response("这是一个Ajax请求");

server.get(Moco.path("/combined"))
      .response("这是一个普通请求");

在这个例子中,服务器会根据请求是否为Ajax请求来决定响应的内容。如果是Ajax请求,就返回“这是一个Ajax请求”;否则,返回“这是一个普通请求”。

小总结

通过这些例子,咱们可以看出,Moco在动态响应和条件模拟方面的能力是相当强大的。这些高级功能让Moco不仅仅是一个简单的模拟工具,而是一个能够应对复杂测试场景的强大助手。无论是需要根据请求内容动态生成响应,还是要根据不同的条件来模拟服务器的不同行为,Moco都能轻松搞定。

通过灵活运用Moco的这些高级特性,你可以构建出几乎任何你想要的测试场景,使得测试工作更加高效和准确。

第7章:集成与自动化测试:让Moco成为你的测试利器

嘿,各位朋友们,小黑又来和大家聊聊Moco的话题了。这一章,我们要讨论的是如何将Moco集成到你的项目中,并利用它实现自动化测试。这不仅能提高测试效率,还能确保你的应用质量更上一层楼。

Moco与Java项目的集成

首先,让我们看看如何将Moco集成到一个标准的Java项目中。这里假设你已经在项目中添加了Moco的依赖。接下来的关键是如何在项目的测试代码中启动和使用Moco。

import com.github.dreamhead.moco.HttpServer;
import com.github.dreamhead.moco.Runner;
import com.github.dreamhead.moco.Moco;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class MocoIntegrationTest {

    private Runner runner;
    private HttpServer server;

    @Before
    public void setup() {
        // 创建并配置Moco服务器
        server = Moco.httpServer(12345);
        server.get(Moco.path("/test")).response("这是一个测试响应");

        // 启动Moco服务器
        runner = Runner.runner(server);
        runner.start();
    }

    @Test
    public void testResponse() {
        // 在这里写你的测试代码,比如使用HttpClient来发送请求
        // ...
    }

    @After
    public void tearDown() {
        // 测试完成后停止Moco服务器
        runner.stop();
    }
}

在这个例子中,我们使用JUnit作为测试框架。在每个测试开始前,我们使用@Before注解来设置和启动Moco服务器;在测试结束后,使用@After注解来停止服务器。这样,你就可以在测试中使用Moco服务器了。

自动化测试流程

自动化测试是现代软件开发不可或缺的一部分。它可以帮助你快速地验证应用的功能,并确保代码更改不会引入新的错误。将Moco集成到你的自动化测试流程中,可以让你更轻松地测试那些依赖外部服务的部分。

比如,如果你的应用需要从某个API获取数据,你可以使用Moco来模拟这个API。这样,即使真实的API暂时不可用,你也能继续你的测试。

结合其他测试工具

Moco可以很好地与其他测试工具一起工作。比如,你可以结合JUnit和Mockito来进行更深入的测试。JUnit负责管理测试的生命周期,Mockito帮助你模拟那些复杂的依赖,而Moco则专注于模拟HTTP服务。

// 示例代码:结合JUnit和Mockito使用Moco
// 假设你有一个需要测试的类,这个类依赖于一个HTTP服务
public class MyService {
    // 这个类的逻辑...
}

public class MyServiceTest {

    private MyService service;

    @Before
    public void setup() {
        // 使用Moco创建一个模拟的HTTP服务
        // 使用Mockito创建其他的模拟对象
        // 初始化

你的测试类,注入这些模拟对象
        // ...
    }

    @Test
    public void testServiceLogic() {
        // 在这里进行具体的测试,验证MyService的行为
        // ...
    }

    @After
    public void tearDown() {
        // 清理操作
        // ...
    }
}

在这个例子中,我们假设MyService是一个依赖于HTTP服务的类。通过结合Moco、JUnit和Mockito,我们能够全面地测试这个类的行为,无论是依赖的外部服务还是内部逻辑。

自动化测试的最佳实践

要充分利用Moco进行自动化测试,有几个最佳实践你应该记住:

  1. 保持测试的独立性:每个测试应该独立于其他测试,确保不互相影响。
  2. 清晰的测试目标:每个测试应该有一个明确的目标,避免测试过于复杂或涵盖范围过广。
  3. 适当的模拟级别:使用Moco来模拟外部服务的行为,而用Mockito等工具来模拟内部依赖。
  4. 持续集成:将自动化测试集成到你的持续集成流程中,确保每次代码提交都能通过测试。

更多推荐

详解SpringCloud之远程方法调用神器Fegin

掌握Java Future模式及其灵活应用

小黑整的视頻会园优惠站

小黑整的生财资料站

使用Apache Commons Chain实现命令模式

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

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

相关文章

彻底搞懂回溯算法(例题详解)

目录 什么是回溯算法&#xff1a; 子集问题&#xff1a; 子集问题II(元素可重复但不可复选): 组合问题&#xff1a; 组合问题II(元素可重复但不可复选): 排列问题&#xff1a; 排列问题II(元素可重复但不可复选): 什么是回溯算法&#xff1a; 「回溯是递归的副产品&…

全球十大正规伦敦金交易平台app软件最新排名(综合版)

伦敦金作为当前国际市场中较为成熟、灵活的投资产品自然备受青睐&#xff0c;但投资者在选择交易软件时&#xff0c;应该尽量选择在行业内排名较高&#xff0c;口碑较好的平台&#xff0c;这样才能获得可靠的投资服务。刚开始不太懂得如何选择伦敦金软件的时候&#xff0c;投资…

SpringBoot原理-配置优先级(黑马学习笔记)

配置优先级 在我们前面的课程当中&#xff0c;我们已经讲解了SpringBoot项目当中支持的三类配置文件&#xff1a; ● application.properties ● application.yml ● application.yaml 在SpringBoot项目当中&#xff0c;我们要想配置一个属性&#xff0c;可以通过这三种方…

手写模拟器,解放双手!效果炸裂的生产工具

手写模拟器是一款基于Handright的仿手写图片生成软件&#xff0c;可以让你的电脑和手机也能写出漂亮的手写字&#xff0c;你只需要输入你想要写的内容&#xff0c;选择你喜欢的字体和背景&#xff0c;就可以生成一张高仿真的手写图片&#xff0c;用于各种场合&#xff0c;比如做…

搜索算法(算法竞赛、蓝桥杯)--双向BFS双向奔赴

1、B站视频链接&#xff1a;B18 双向BFS Nightmare_哔哩哔哩_bilibili 题目链接&#xff1a;Problem - 3085 #include <bits/stdc.h> using namespace std; const int N810; int n,m; #define x first #define y second char g[N][N]; //地图 int vis[N][N]; //2表示女…

3.2日学习打卡----初学FastDFS(二)

3.2日学习打卡 目录: 3.2日学习打卡SpringBoot整合FastDFS实战开发文件上传 FastDFS集成Nginx环境搭建 SpringBoot整合FastDFS 由GitHub大牛tobato在原作者YuQing与yuqih发布的JAVA客户端基础上进行了大量重构工作&#xff0c;并于GitHub上发布了FastDFS-Client1.26.5。 主要特…

Java字符串相关类的底层原理

Java字符串相关类的底层原理

MySQL(2/3)

select和别名的使用 主要是用以查询数据 语法&#xff1a;select 字段 from 库名 -- *代表全部字段 select * from student; -- 可以查询多个字段&#xff0c;并使用as起别名&#xff0c;as可以省略 select id as bbb ,name as hhh from student; -- 可以使用函数concat(a,b…

Matlab|【免费】基于合作博弈的综合能源系统利益分配优化调度

目录 主要内容 部分代码 结果一览 下载链接 主要内容 该程序实现的模型为综合能源系统利益分配优化调度&#xff0c;采用合作博弈方法&#xff0c;模型针对IES系统的P2G、电解槽、甲烷反应器、储氢罐、CHP和燃气锅炉等设备进行建模&#xff0c;实现基于合作博弈的…

Stable Cascade-ComfyUI中文生图、图生图、多图融合基础工作流分享

最近 ComfyUI对于Stable Cascade的支持越来越好了一些&#xff0c;官方也放出来一些工作流供参考。 这里简单分享几个比较常用的基础工作流。 &#xff08;如果还没有下载模型&#xff0c;可以先阅读上一篇Stable Cascade升级&#xff0c;现在只需要两个模型&#xff09; &a…

把Anaconda添加进环境变量的方法(解决pip识别不到环境的问题)

找到你的Anaconda的安装根目录 比如我的是在&#xff1a;C:\ProgramData\Anaconda3 那么只需要将以下目录添加进环境变量即可&#xff1a; C:\ProgramData\Anaconda3C:\ProgramData\Anaconda3\ScriptsC:\ProgramData\Anaconda3\Library\binC:\ProgramData\Anaconda3\condabin…

volatile 关键字 (一)

volatile 关键字 &#xff08;一&#xff09; 文章目录 volatile 关键字 &#xff08;一&#xff09;如何保证变量的可见性&#xff1f;如何禁止指令重排序&#xff1f; 文章来自Java Guide 用于学习如有侵权&#xff0c;立即删除 如何保证变量的可见性&#xff1f; 在 Java 中…

云时代【7】—— 存储卷

云时代【7】—— 存储卷 四、Docker&#xff08;四&#xff09;存储卷1. 存储卷&#xff08;1&#xff09;定义&#xff08;2&#xff09;分类 2. 相关指令&#xff08;1&#xff09;管理卷 VolumeA. 创建方式方式一&#xff1a;docker volume方式二&#xff1a;docker run -v …

NFT Insider #121:苏富比去年 NFT 和数字艺术品销售额超过 3000 万美元,较 2022 年增长 50%

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members &#xff08;https://twitter.com/WHALEMembers&#xff09;、BeepCrypto &#xff08;https://twitter.com/beep_crypto&#xff09;联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜…

【CSS】CSS简介,CSS基础选择器详解

目录 css简介 css语法规范 css代码风格&#xff1a; css选择器的作用 css基础选择器 标签选择器 类选择器 类选择器---多类名 id选择器 id选择器和类选择器的区别&#xff1a; 通配符选择器 总结 ⭐css简介 CSS 是层叠样式表 ( Cascading Style Sheets ) 的简称,也…

机器学习-4

文章目录 前言数组创建切片索引索引遍历切片编程练习 总结 前言 本篇将介绍数据处理 Numpy 库的一些基本使用技巧&#xff0c;主要内容包括 Numpy 数组的创建、切片与索引、基本运算、堆叠等等。 数组创建 在 Python 中创建数组有许多的方法&#xff0c;这里我们使用 Numpy 中…

使用 Docker 部署 Answer 问答平台

1&#xff09;介绍 GitHub&#xff1a;https://github.com/apache/incubator-answer Answer 问答社区是在线平台&#xff0c;让用户提出问题并获得回答。用户可以发布问题并得到其他用户的详细答案、建议或信息。回答可以投票或评分&#xff0c;有助于确定有用的内容。标签和分…

Redis 群集部署

1.关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型基础上&#xff0c;-般面向记录。它借助于集合代数等数学概念和方法来处理数据库中的数据。关系模型指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。现实世界中…

软件分层(数据结构/软件逻辑上分层+举例),相连节点的概念+如何相连,为什么是层状结构(软件分层,网络协议分层+梳理协议顺序),协议分层(打电话例子)

目录 软件分层 介绍 举例 类的继承 虚拟文件系统 线程接口封装 虚拟地址空间 总结 为什么是层状的 软件分层 网络协议 原因 梳理协议顺序 相连节点 协议分层 引入 示例 实际上 逻辑上 制定出协议 软件分层 介绍 通过将软件系统划分为不同的层次,每一层都有…

OpenHarmony、HarmonyOS打开编辑 PDF 等操作的三方组件使用教程

项目场景: 随着数字化时代的发展,PDF 文档成为广泛应用于各行业的重要文件格式。为了提高OpenHarmony/HarmonyOS生态系统的功能性和用户体验,我们需要一款支持打开、编辑PDF文件的应用程序。 使用户能够轻松打开、浏览和编辑PDF文件。该应用将充分利用OpenHarmony/HarmonyO…