如何给微服务架构的项目做验收测试?

软件工程领域验收测试的流程优化建议 验收测试作为软件交付前的关键质量关卡,其流程效率与有效性直接决定产品能否满足业务需求与用户期望。本文系统分析了传统验收测试流程的结构性缺陷,提出了一套融合理论深度与实践可行性的优化框架。通过整合第一性原理分析与实证研究,我们构建了包含需求精确化、测试自动化、持续反馈与智能决策的四维度优化模型。该框架不仅解决了传统方法中存在的滞后性、主观性与效率低下问题,还引入了预测性测试分析与自适应测试生成等创新元素。 阅读详情

在验收测试阶段,基于微服务架构的应用相对于单体架构的应用而言,具有以下挑战:

  1. 复数的服务增加了测试环境搭建的难度

  2. 各种异常情况的模拟变得困难,基于 Mock 的测试方式无法对整个调用链路作异常模拟,进而使得对整体架构的健壮性测试变得困难

  3. 基于成本和效率的原因,测试工作已经不适合通过人工完成

我们认为对基于微服务架构的应用,其验收测试应该具有以下特征:

  1. 自动化、可重复、易于集成CI工具

  2. 能够在测试运行时修改服务的行为

下面我们通过一个 Demo 来介绍如何利用 Docker、Cucumber、Byteman、Fabric8 docker-maven-plugin、Spotify dockerfile-maven-plugin达成以上目标。

 

01 Demo 实践

一共有两个服务:

  • Product Service(商品服务)
  • Product Price Service(商品价格服务)

Product Service 提供了一个查询接口用于获得商品信息及其价格信息的组合结果,这相当于跨服务的 SQL JOIN。

Product 的 Schema:

{

  "id": "<string>",

  "name": "<string>",

  "description": "<string>"

}

ProductPrice的Schema:

{

  "id": "<string>",

  "price": "<number>"

}

Product Service返回的Schema则是:

{

  "products": [

    {

      "id": "<string>",

      "name": "<string>",

      "description": "<string>",

      "price": <number>

    }

  ]

}

该接口的实现逻辑是:

  1. Product Service 本地查询得到 Product List

  2. Product Service 调用 Product Price Service 接口得到 ProductPrice List

  3. 拼装结果

此外还有一个要求,当 Product Price Service 出现异常时,Product Service 依然要能够返回结果,只不过 price 字段为 null,即无论如何 Product Service 都要能够返回结果。

 

02 实现步骤

构建 Docker Image

为了能够便利地搭建测试环境,我们需要先为Product Servcie和Product Price Service构建 Docker Image。利用 Spotify dockerfile-maven-plugin 可以很方便地做到这一点,它没有引入额外的概念,只要你会写 Dockerfile 就行。我们在 Product Service 和 Producer Price Service 的 pom.xml 中添加类似以下的配置:

<plugin>

  <groupId>com.spotify</groupId>

  <artifactId>dockerfile-maven-plugin</artifactId>

  <version>${dockerfile-maven-plugin.version}</version>

  <configuration>

    <repository>msat-${project.artifactId}</repository>

    <tag>${project.version}</tag>

    <buildArgs>

      <JAR_FILE>${project.build.finalName}-exec.${project.packaging}</JAR_FILE>

    </buildArgs>

  </configuration>

  <executions>

    <execution>

      <id>build</id>

      <phase>package</phase>

      <goals>

        <goal>build</goal>

      </goals>

    </execution>

  </executions>

</plugin>

并且提供了 Dockerfile:

FROM openjdk:8-jre-alpine

ARG JAR_FILE

ENV JAR_FILE=${JAR_FILE}

RUN mkdir /maven

COPY target/${JAR_FILE} /maven

COPY target/lib/byteman.jar /maven

ENTRYPOINT java $JAVA_OPTS -jar /maven/$JAR_FILE

EXPOSE 8080

 

注意我们在 Image 中添加了 byteman.jar,利用它我们可以在运行时修改程序。

编写验收测试脚本

我们新建一个验收测试的Maven项目,然后使用 Cucumber 编写了以下两个场景的验收测试脚本:

正常情况:

Feature: List product information with price



  Scenario: Everything is good

    Given Product Service is up and running

    And Product Price Service is up and running



    When User query product list



    Then Get following products



      | id       | name | description            | price |

      | animal-1 | dog  | woof woof              | 1000  |

      | animal-2 | duck | quack quack            | 40    |

      | animal-3 | fox  | what does the fox say? | 5000  |

 

这个脚本的大致意思是在 Product Service 和 Product Price Service 都启动的情况下,当用户查询 Product 信息时,我们会得到上述表格中的结果。

Product Price Service 异常情况:

Feature: List product information with price



  Scenario: Product Price Service throws exception when being queried

    Given Product Service is up and running

    And Product Price Service is up and running



    Given Install the byteman script product_price_exception.btm to Product Price Service



    When User query product list



    Then Get following products



      | id       | name | description            | price |

      | animal-1 | dog  | woof woof              |       |

      | animal-2 | duck | quack quack            |       |

      | animal-3 | fox  | what does the fox say? |       |

 

我们在这里使用了 Byteman 给 Product Price Service 注入了异常情况:

Given Install the byteman script product_price_exception.btm to Product Price Service

product_price_exception.btm 的内容是这样的:

RULE throw exception

CLASS me.chanjar.msat.productprice.FakeProductPriceRepository

METHOD listAll

AT ENTRY

IF TRUE

DO debug("throw RuntimeException here"),

   throw new RuntimeException("Product Repository Error!")

ENDRULE

意思是在调用 FakeProductPriceRepository.listAll 方法时抛出异常,注意这样做并没有修改 Product Price Service 的源码,而是在运行时修改了它的逻辑。

接下来我们为上面的验收测试脚本实现逻辑(下面代码与实际上有所不同,这是为了尽量使得代码篇幅精简):

public class Stepdefs {



  private List<Map<String, String>> answer;



  @Given("^Product Service is up and running$")

  public void productServiceIsUpAndRunning() {

    probe("Product Service", PRODUCT_ADDRESS);

  }



  @And("^Product Price Service is up and running$")

  public void productPriceServiceIsUpAndRunning() {

    probe("Product Price Service", PRODUCT_PRICE_ADDRESS);

    clearBytemanScript();

  }



  @When("^User query product list$")

  public void queryProductList() {

    answer = given()

      .when()

      .get(PRODUCT_ADDRESS + "/products")

      .then()

      .statusCode(is(200))

      .extract()

      .body()

      .jsonPath()

      .getList("products", Map.class);

  }



  @Given("^Install the byteman script ([A-Za-z0-9_\\.]+) to Product Price Service$")

  public void injectExceptionIntoProductPriceService(String bytemanScript) throws Exception {

    injectBytemanScript("target/test-classes/" + bytemanScript);

  }



  @Then("^Get following products$")

  public void compareResult(List<Map<String, String>> expected) {

    assertThat(answer).containsExactlyInAnyOrderElementsOf(expected);

  }

}

关于 Cucumber 和 Byteman 的更详细的介绍可以见 ServiceComb Saga 使用 Cucumber 做验收测试源码分析。

自动化搭建测试环境

我们希望能够在 Maven 的 integration-test 阶段搭建测试环境、执行上述验收测试脚本。在 pom.xml 中添加到 Fabric8 docker-maven-plugin:

<plugin>

  <groupId>io.fabric8</groupId>

  <artifactId>docker-maven-plugin</artifactId>

  <configuration>

    <showLogs>true</showLogs>

    <images>

      <image>

        <name>msat-product:${project.version}</name>

        <alias>msat-product</alias>

        <run>

          <wait>

            <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>

            <time>120000</time>

          </wait>

          <links>

            <link>msat-product-price:msat-product-price</link>

          </links>

          <ports>

            <port>product.port:8080</port>

          </ports>

        </run>

      </image>

      <image>

        <name>msat-product-price:${project.version}</name>

        <alias>msat-product-price</alias>

        <run>

          <env>

            <JAVA_OPTS>

              -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true

              -javaagent:/maven/byteman.jar=port:9091,address:0.0.0.0,listener:true

            </JAVA_OPTS>

          </env>

          <wait>

            <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>

            <time>120000</time>

          </wait>

          <ports>

            <port>product-price.port:8080</port>

            <port>product-price.byteman.port:9091</port>

          </ports>

        </run>

      </image>

    </images>

  </configuration>

  <executions>

    <execution>

      <id>start</id>

      <phase>pre-integration-test</phase>

      <goals>

        <goal>start</goal>

      </goals>

    </execution>

    <execution>

      <id>stop</id>

      <phase>post-integration-test</phase>

      <goals>

        <goal>stop</goal>

      </goals>

    </execution>

  </executions>

</plugin>

 

这样一来就能够在 pre-integration-test 阶段启动容器,也能在 post-integration-test 阶段销毁容器了。

Take a run

接下来只需要 mvn clean install 它就会:

  1. 构建:

    1. 构建 Product Service 项目,并为其构建 Docker Image

    2. 构建 Product Price Service 项目,并为其构建 Docker Image

  2. 验收测试:

    1. 启动 Product Service 和 Product Price Service 的容器

    2. 执行验收测试脚本

    3. 销毁上述创建的容器

如果你想自己试试可以下载本项目源码。

欢迎开发者朋友们加入 ServiceComb 社区,一起做些有意思的事情。加入Servicecomb社区 

第04课:怎么针对微服务架构做集成测试? 在上一课中,我们讲解了怎么进行单元测试。虽然单独测试微服务内部的各个单元非常重要,但是,测试微服务的模块或者子系统能否正确地与外界交互也同样重要,这项工作可以通过集成测试来完成。这节课,我们将分别探讨在微服务架构下,集成测试的概念和实现方法,并分别以几个实例来说明。 集成测试(Integration Test)的定义有很多。简单来说,集成测试(也叫组装测试、联合测试)是单元测试的逻辑扩展,即把两个... 阅读详情

相关推荐

微服务架构的测试策略

这篇文章讲解微服务架构下的一些测试建议。

极客星云-优快云博客 2081

微服务架构的应用如何测试?

最近几年,微服务架构越来越火爆,逐渐被企业所采用。随着软件架构的变化,对应的软件测试策略需要作何调整呢?本文将介绍微服务架构下的测试策略,并结合分享在业务和架构演变过程中,一个历经九年的项目测试策略的演进。   关于微服务 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,每个服务运行在其独立的进程中,服务间采用轻量级通信机制互相沟通(通常是基于HTTP协议的RESTful ...

zhusongziye的博客 4874

WEB自动化测试-RobotFramework验收测试框架搭建

WEB自动化测试-RobotFramework验收测试框架搭建,内含ATDD思想介绍,实例运行,验收测试框架搭建

超全,看完这份微服务架构与实践文档,微服务不再难

1. 为什么需要微服务架构.2.传统应用架构的问题3. 微服务架构是什么。

m0_73311735的博客 711

基于VUE的智慧园区可视化平台(开题报告+源码)

本系统(程序源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景: 随着城市化进程的加速,园区作为城市发展的重要组成部分,其管理和运营效率直接影响到城市的经济发展和居民生活质量。传统的园区管理方式已经难以满足现代城市对于高效率、智能化的需求。因此,利用先进的信息技术构建一个智慧园区可视化平台显得尤为重要。Vue.js作为一个高效的前端框架,能够帮助开发一个动态的、用户友好的智慧园区可视化平台,实现园区管理的数字化和智能化。

liu10611的博客 1183

大开眼界的十大开源人工智能项目

这是一个强大的开源工具,能让你在不同框架之间自由切换,无需重写代码。它是一个开源工具,能用简单的SQL语言同时处理数据和AI模型,让一切变得有序而高效。Rasa是我开发智能聊天机器人时的首选,它让你轻松掌控机器人对话的每个细节。我经常用它快速验证模型在不同框架下的表现,省去了大量烦躁的调试过程。最近发现的Vapi是一个以API方式提供的语音AI工具,开发者友好程度超乎想象。KNIME是一个以拖拽方式构建数据分析流程的开源工具,仿佛是数据界的乐高积木。它像个忠诚的守门员,确保你的模型始终健康运行。

wjianwei666的专栏 1108

微服务架构-测试理解

微服务架构-测试理解

qq_34782203的博客 1740

SAP高级外币评估_FINS_FXV_S4 2022 OP

摘要:S/4HANA 2022 On-Premise中的高级外币评估(FINS_FXV)取代了经典外币估值(FAGL_FCV),提供更优化的财务结算功能。主要创新包括:增量发布逻辑、简化账户配置、行项目级估值可见性等。该功能支持IFRS9等会计准则,通过会计原则(Accounting Principle)进行配置,需完成财务报表版本定义、语义标记分配等必要设置。系统演示展示了从汇率维护(FB60/MIRO)、测试运行到最终过账(FB03)的完整流程,能自动计算并过账汇率差异。高级外币评估简化了期末结算操作,

yanzibing99的博客 1261

微服务测试怎么做,看看这篇文章就懂了

单元测试:测试服务的一小部分,例如类。组件测试:验证单个服务的行为。集成测试:通过测试服务的适配器来验证服务是否可以与基础设施服务(例如数据库和其他应用程序服务)进行交互。注意:某些版本的测试金字塔会切换组件测试和集成测试的顺序。端到端测试:验证整个应用程序的行为。结合多种微服务测试策略可以提高测试覆盖率和对软件的信心,同时也。

2401_83014899的博客 1427

Windows系统的Mamba环境配置详细教程(状态空间模型)

causal_conv1d也是安装mamba的依赖必须库。安装完成后,通过pip list可以查看到安装的库。Triton是安装mamba的依赖,需要先安装。上述工作准备好后,按下面步骤安装。直接根据离线文件安装即可。是自己的虚拟环境名字。

2301_77831163的博客 3677

OpenCV轮廓匹配实战:5分钟搞定Hu矩形状识别(附完整代码)

本文详细介绍了使用OpenCV进行轮廓匹配的实战技术,重点讲解了Hu矩形状识别在工业质检等领域的应用。通过完整的代码示例和参数调优技巧,帮助开发者在5分钟内实现高效的形状识别,提升工业检测的准确性和效率。

nnn11的博客 676

十分钟自动执行一次_「自动化测试」微服务自动化测试简介

什么是微服务?微服务 - 也称为微服务架构 - 是一种构建方式,它将应用程序构建为松散耦合服务的集合,具有完整的业务功能。微服务架构允许连续交付/部署大型复杂应用程序。本文将概述自动微服务测试工具和最佳实践。它还使组织能够发展其技术堆栈。微服务逐渐用于创建更大,更复杂的应用程序,这些应用程序作为较小服务的组合得到更好的开发和管理,这些服务可以协同工作以实现更重要的应用程序范围的功能。大而复杂的应用...

weixin_39673471的博客 491

Unity开发抖音小游戏存储的几种方法分析

前段时间写小游戏为了省事一直就没有研究抖音小游戏的存储方案,一直使用的是unity中的PlayerPrefs去做的存储,但是后来发现官方会一直提醒让使用抖音sdk中的新文件存储系统,从而降低内存占用。

类人_猿的博客 2538

imageJ 如何下载plugin_如何给微服务架构的项目做验收测试?

在验收测试阶段,基于微服务架构的应用相对于单体架构的应用而言,具有以下挑战:复数的服务增加了测试环境搭建的难度各种异常情况的模拟变得困难,基于Mock的测试方式无法对整个调用链路作异常模拟,进而使得对整体架构的健壮性测试变得困难基于成本和效率的原因,测试工作已经不适合通过人工完成我们认为对基于微服务架构的应用,其验收测试应该具有以下特征:自动化、可重复、易于集成CI工具能够在测试运行时...

weixin_39640372的博客 120

PX4实战(四):PX4 uorb模块详解

本节主要讲解PX4中的uorb消息,主要包括uorb的基本概念使用、PX4内重要的uorb消息、如何自定义uorb消息以及使用uorb消息的注意点等,其中讲解重要uorb消息是为了对PX4内重要数据结构有初步的了解,有助于后期算法理解。uORB(micro Object Request Broker)是PX4中用于模块间通信的轻量级发布-订阅(Publish/Subscribe)机制。模块之间可以通过uORB传递消息,无需直接调用对方函数;提高系统模块化与解耦性;

PX4-SLAM-PNC 1933

2025.06.06【Ribo-seq】|RiboCode:基于Ribo-seq数据的全基因组翻译ORF检测工具详解与实战流程

大家好!今天我们要学习的是RiboCode——一个专为Ribo-seq(核糖体足迹测序)数据设计的高质量翻译ORF(开放阅读框)检测工具。RiboCode能够帮助我们在全基因组范围内精准识别翻译事件,发掘经典CDS之外的uORF、dORF、重叠ORF等新型翻译本,极大拓展了我们对转录本翻译潜能的认知。RiboCode 是由清华大学杨学睿课题组开发的开源软件,支持Linux/Mac平台,采用Python实现。自动化流程:一条命令即可完成注释准备、P-site定位、ORF预测。高灵敏度与特异性。

1861

jq项目如何启服务_如何给微服务架构的项目做验收测试?

作者 | 钱嘉​在验收测试阶段,基于微服务架构的应用相对于单体架构的应用而言,具有以下挑战:复数的服务增加了测试环境搭建的难度各种异常情况的模拟变得困难,基于Mock 的测试方式无法对整个调用链路作异常模拟,进而使得对整体架构的健壮性测试变得困难基于成本和效率的原因,测试工作已经不适合通过人工完成我们认为对基于微服务架构的应用,其验收测试应该具有以下特征:自动化、可重复、易于集成CI工具能够在测试...

weixin_33511258的博客 122

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

‌微服务架构蓝绿部署验收测试:测试从业者的实战指南

本文探讨了蓝绿部署与微服务架构的结合应用,重点分析了验收测试在其中的关键作用。蓝绿部署通过并行运行新旧版本实现零停机发布,但微服务的分布式特性增加了测试复杂性。文章系统性地提出了验收测试的三个阶段流程:预切换测试验证基础功能、流量切换测试监控系统行为、后切换验证确保稳定性,并针对微服务特有的测试挑战提供了解决方案。最后推荐了自动化工具链和最佳实践,强调测试应从质量保障升级为业务赋能,为软件测试团队在蓝绿部署场景下的工作提供了全面指导。

2501_94480392的博客 822

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

微服务架构蓝绿部署验收测试:测试从业者的实战指南

摘要: 蓝绿部署与微服务结合可实现零停机发布,通过并行运行新旧版本环境(蓝/绿)降低风险,但要求严格的验收测试。测试需分三阶段:预切换验证核心功能与API兼容性,流量切换时结合金丝雀发布与混沌工程监控性能,后切换阶段运行全量回归测试。微服务架构的分布式特性带来数据一致性、环境差异等挑战,需通过合约测试、IaC工具及数据快照解决。推荐工具链包括Selenium、Prometheus等,最佳实践强调自动化覆盖、渐进切换及持续优化。测试团队需构建韧性体系,将验收测试升级为业务赋能的关键环节。

2501_94480392的博客 907

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

第04节:怎么针对微服务架构做集成测试?

在上一节中,我们讲解了怎么进行单元测试。虽然单独测试微服务内部的各个单元非常重要,但是,测试微服务的模块或者子系统能否正确地与外界交互也同样重要,这项工作可以通过集成测试来完成。这节课,我们将分别探讨在微服务架构下,集成测试的概念和实现方法,并分别以几个实例来说明。 集成测试(Integration Test)的定义有很多。简单来说,集成测试(也叫组装测试、联合测试)是单元测试的逻辑扩展,即把两...

weixin_41918841的博客 856

微服务的独立部署意味着什么(https://microservices.io/post/architecture/2022/05/04/microservice-architecture-essen)

微服务的独立部署意味着什么

weixin_45594127的博客 983

创新项目验收测试:方法论与实战陷阱解析

验收测试是验证技术创新项目可行性的关键环节,其核心在于通过系统化测试验证技术方案的业务价值、环境适应性和经济可行性。从技术原理看,验收测试需要构建真实场景下的测试用例,覆盖常规与异常工况,避免实验室环境与真实场景的差异。在工程实践中,常见的数据失真、环境差异和人机交互等问题可能成为项目落地的致命陷阱。通过四象限评估法、全链路追踪工具(如OpenTelemetry+Jaeger)和自动化验收流水线(如Robot Framework),可以有效提升测试覆盖率和效率。对于智能仓储、AI质检等创新项目,科学的验收测

weixin_34200628的博客 679

《微服务架构设计模式》读书笔记 | 第9章 微服务架构中的测试策略(上)

第9章 微服务架构中的测试策略(上)前言1. 微服务架构中的测试策略概述2. 为服务编写单元测试3. 本章小结最后 前言 这是一本关于微服务架构设计方面的书,这是本人阅读的学习笔记。以下对一些符号做些说明: ()为补充,一般是书本里的内容; []符号为笔者笔注; 1. 微服务架构中的测试策略概述 2. 为服务编写单元测试 3. 本章小结 最后 新人制作,如有错误,欢迎指出,感激不尽! 欢迎关注公众号,会分享一些更日常的东西! 如需转载,请标注出处! ...

多氯环己烷的博客 527

不同类型的微服务测试

针对单个微服务的最小功能单元进行测试,通常使用Mock对象或虚拟环境进行隔离测试,保证每个微服务的功能和逻辑的正确性。首先,在订单服务中查询一个已存在的订单,并使用商品服务查询该订单中的商品信息,验证订单和商品信息是否能够正确查询。用户服务负责用户的注册和登录功能,商品服务负责商品的添加和查询功能,订单服务负责生成和管理订单。例如,测试系统是否容易受到常见的漏洞攻击,并提供相应的修复措施。检测和评估微服务的安全性,包括身份验证、授权、数据保护等方面的测试,以确保系统对潜在的安全威胁具有适当的防范措施。

qq_31532979的贺公子之数据科学与艺术博客,致力于科技向善,拥抱开源,要用技术的影响力来领导团队,而不是威权和职位! 1256
上一篇: 基于ServiceComb开发微服务如何解决跨域CORS问题
下一篇: 【大咖连载】微服务与Serverless
looook
博客等级 码龄20年 145粉丝 195原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值