技术分享 | 跨平台API对接(Java)

时间:2024-11-16 14:14:03

深入了解测试过程中被测系统的架构与数据流,有助于理解业务逻辑,梳理业务用例以及促进部门协同。
更深的理解业务逻辑是指要分析公司是做什么的,公司的重要的商务决策是什么,公司内部数据流是怎么运行的,有哪些常见的业务场景。这也能考验对公司业务的负责程度,可以更好的去服务业务部门,为公司创造价值。

本章介绍基于 Jenkins API 调用的跨平台 API 对接。

基于Jenkins实现跨平台API对接

Jenkins 提供了远程访问应用编程接口(Remote Access API),能够通过 Http 协议远程调用相关命令操作 Jenkins 进行 Jenkins 视图、任务、插件、构建信息、任务日志信息、统计信息等,非常容易与其配合更好的完成 CI/CD 工作。
Jenkins API 总共有三种格式,分别为:

  • XML API
  • 可以使用 xml 方式进行 API 的使用,这种方式的优势在于可以使用强大的 xpath 特性进行相关的访问控制。如我们下文将要介绍的 Jenkins 客户端底层就是基于 XML API 实现的。
    • JSON API
  • 使用 JSON 方式进行操作,因为 json 基本上已经是应用之间数据交换的准标准格式之一,这种方式比较方便 Javascript 或者和其他应用的集成。
    • Python API 可以通过 python-jenkins 库对 Jenkins 进行控制操作。此库对 Jenkins 的 API 进行了进一步的包装,使用起来更加方便,但是一般需要安装 python-jenkins,并通过 python 脚本的执行来达到集成的方式。

为什么基于Jenkins API对接

  • 频繁创建 Job 时,降低手工错误的概率
  • 在工作中,如果需要创建的 Jenkins 的 Job 非常多,而大多又呈现有规律的方式时,Job 的创建成为了一个繁琐而又需要频繁操作的任务。在这种场景下,使用 API 结合脚本进行自动化可以提高效率,降低手工错误的几率。
    • 满足特定条件时自动触发 Jenkins
  • 如果需要动态的创建 Jenkins Job ,如根据中间结果在某个触发点自动生成,再如生成的 Job 需要使用的参数也是动态运行阶段才能取到值的场景下。
    • 基于 Jenkins 自研产品或工具
  • 如果产品或工具相关的功能,需要基于 Jenkins 进行研发,而且不希望用户直接使用 Jenkins,仅将 Jenkins 作为背后的执行引擎的场景,这种情况下也需要使用 Jenkins API 才能完成。

快速开始

下面我们通过实战学习下如何将 Spring Boot 和 Jenkins 进行集成,实现跨平台 API 对接。

<dependency>
    <groupId></groupId>
        <artifactId>jenkins-client</artifactId>
            <version>0.3.8</version>
            </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

我们先引入 Jenkins-client 用于和 Jenkins 进行交互。而 Jenkins-client 的底层实现其实就是调用 Jenkins XML API 来完成操作 Jenkins 的,如下表部分示例所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K6RmJC8o-1650007164295)(/uploads/default/original/3X/3/7/)]

  • JenkinsHttpClient:封装了调用 JenkinsAPI 的底层方法JenkinsHttpClient(URI uri, String username, String password)
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wZ9yHps8-1650007165831)(/uploads/default/original/3X/b/0/)]

  • JenkinsServer:封装了调用 JenkinsAPI 的语义级别的方法,其本质调用的是 JenkinsHttpClient 类中的方法,只是根据操作 Jenkins 的功能进行了语义级别的封装JenkinsServer(JenkinsHttpConnection client)
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k6Ameflh-1650007168270)(/uploads/default/original/3X/c/7/)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KLzbpFG8-1650007169548)(/uploads/default/original/3X/0/2/)]

  • Job:Jenkins 中 job 对应的实体类,有很多实用的语义级别的方法,如构建等。

  • Job(String name, String url)
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VPWPldzM-1650007170952)(/uploads/default/original/3X/2/f/)]

  • 创建新 Job

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kIpDHfwq-1650007172044)(/uploads/default/original/3X/a/f/)]

    • 进入 Job 配置
    • 将 Job/Job 名称/ Configure 改为 Job/Job 名称/ 并回车
  • 在 resources 目录下,jenkinsDir ,并添加 hogwarts_test_mini_start_test.xml 文件,此时我们为了测试命令可以正常被执行,需要在测试命令前加 eval 关键字,并将${testCommand}放在英文双引号括内部,如图中红框部分。

    • JenkinsUtil 示例代码
    • import ;

    • import ;

    • import ;

    • import ;
      import ;
      import ;
      import ;
      import ;
      import ;
      import ;

    /**

    • @Author tlibn
      • @Date 2020/8/11 15:21
    • **/
    • public class JenkinsUtil {
      //调试使用
      public static void main(String[] args) throws IOException, URISyntaxException {
      build(“hogwarts_test_mini_start_test_100”,“12”,“token”,“pwd”);
      }
      public static void build(String jobName, String userId, String remark,String testCommand) throws IOException, URISyntaxException {
      ("========== 执行开始 =");
      // 1. 通过 ClassPathResource 获取 Jenkins 的 JenkinsJob 请求参数数据
      ClassPathResource classPathResource = new ClassPathResource(“JenkinsConfigDir/hogwarts_jenkins_test_start.xml”);
      InputStream inputStream = ();
      String jobConfigXml = (inputStream);
      // 2. 获取 Jenkins 信息
      String baseUrl = ;
      String userName = ;
      String password = ;
      // 3. 根据 Jenkins 信息创建 JenkinsHttpClient 对象
      JenkinsHttpClient jenkinsHttpClient = new JenkinsHttpClient(new URI(baseUrl),userName,password);
      // 4. 根据 Jenkins 客户端创建 JenkinsServer 对象
      JenkinsServer jenkinsServer = new JenkinsServer(jenkinsHttpClient);
      // 5. 创建 Job,如果Job已经存在,可以改为更新 Job 方法
      (jobName,jobConfigXml,true);
      // 6. 获取 Jenkins 服务器中所有的 Job 信息
      Map<String, Job> jobMap = ();
      // 7. 获取 Jenkins 服务器中我们创建的单个 Job 信息
      Job job = (jobName);
      // 8. 组装 Jenkins 服务器的构建参数
      Map<String,String> map = new HashMap<>();
      (“userId”,userId);
      (“remark”,remark);
      (“testCommand”,testCommand);
      // 9. 构建 Jenkins Job
      (map,true);
      ("
      执行完毕 ===========");
      }
      }
    
    
    - 创建新 Job 并构建成功
    - - 构建参数页面查看参数数据
    - - 构建日志页面查看 pwd 命令执行情况
    - ![](/uploads/default/original/3X/c/e/)
    - 数据持久化技术就先讲到这里啦,下面留两个思考给大家,希望大家能用心练习一下哦~
    - 1.尝试更新 Jenkins Job 配置信息,并在构建参数中新增用户名称字段
    - 2.将 Jenkins API 调用和 Spring Boot 结合在一起,通过 postman 发送以下数据进行 Jenkins Job 的创建和更新操作
    - ```
    - {
    -   "jobName": "hogwarts_test_mini_start_test_100",
    -   "testCommand": "pwd",
    -   "remark": "token",
    -   "userId": "12"
    - }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    原文链接

    更多技术文章分享
    需求分析是开始测试工作的第一步,产品会先产出一个需求文档,然后会组织需求宣讲,在需求宣讲中分析需求中是否存在问题,然后宣讲结束后,通过需求文档分析测试点并且预估排期。所以对于需求的理解非常重要。

    需求文档

    产品经理在做完用户需求调查之后,会根据用户需求输出一份需求文档,在文档中会详细描述用户所需的功能和功能实现的效果。文档生成之后,产品经理会和开发测试一起开一个需求宣讲会,讲解需求中的内容,并且会对需求中可能存在的问题进行讨论。

    需求评审

    在需求宣讲的过程中,其实也需要对需求本身进行评审。需求评审可以从以下角度去进行考虑。
    1.站在使用者的角度,考虑用户会遇到的各种情况,反观各种情况在需求中是否都能找对对应描述,即用户故事
    2.根据用户故事应该能构建出简单的流程图,各种路径之间的约束关系,执行条件是否有明确合理的定义,即业务流程图
    3.数据约束是否全面、合理
    4.存在分支的逻辑、描述是否覆盖所有路径
    5.多状态流程,状态流转描述是否合理且完整
    6.权限描述是否明确
    在评审的时候,可以从这几个角度进行考虑,检查产品写的需求是否完善。若需求中有不完善的地方,要提出问题并和产品开发一起进行讨论。最终的目标是让需求更合理完整。

    需求分析

    等产品经理把需求最终完善好之后,就可以详细的去分析需求文档。需求分析简单来讲就是把不直观的需求文档简化为直观的需求。
    7.明确测试范围:把测试活动的边界确定好,因为很多模块都是有关联关系的,在分析需求文档的时候,需要看要加的功能和之前的功能耦合性高不高,需要不需要对关联的功能模块也进行测试。
    8.明确功能点:把需求文档中的功能点列出来。
    9.明确业务流程:根据业务流程图梳理。
    10.明确输出结果:方便验证。
    11.分析异常流程:提高系统的容错性。
    12.预估测试需要的时间和资源:为测试计划的编写做好准备。
    为了提高需求分析能力,就需要深入的理解需求。

    如何提高需求理解能力

    13.熟悉业务,了解系统。任何系统都有大的业务背景,只要熟悉了业务知识才能更有效的使用系统。任何系统在使用过程中,都有一个熟悉的过程,对系统越熟悉,越容易发现系统问题和业务问题。
    14.用客观的思考方式站在用户的角度分析。在满足客户要求的基础上,站在业务或者系统现有实现的角度,给需求和开发人员一些设计上的建议。
    15.善于总结,乐于分享。把经常见到的用例设计的误区和一些好的需求分析实例和需求分析习惯分享给周围的人,这样可以集众人之所长,不断提升需求分析能力。

    原文链接

    更多技术文章分享

    开源项目litemall系统架构

    下面以开源项目 litemall 为例,分析一下这个项目中的系统架构。
    litemall 这款产品是一个小的商城,以 SpringBoot 作为后端,Vue 管理员结合微信小程序作为前端,Vue 用户作为移动端。
    litemall 的系统架构如图所示:

    litemall 的技术架构如图所示:

    开源项目Mall的系统架构

    Mall 项目是一套电商系统,包括前台商城系统及后台管理系统,基于 SpringBoot + MyBatis 实现,采用 Docker 容器化部署。前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。
    系统架构
    Mall 的系统架构如图所示:


    业务架构
    Mall 的业务架构如图所示:

    公司架构组成

    通过 litemall 和 mall 两个开源项目可以看出,为了更好的服务公司,需要了解公司的架构,公司架构一般分为业务架构和系统架构。
    1.商业模式:也是目前大家最关心的问题,公司怎样使得收益最大化。例如抖音的盈利模式以及其中裂变系统是怎样参与的,这就需要了解你身处的业务部门的业务模式以及技术栈,以及公司的发展模式与未来趋势。
    2.业务数据:了解角色、资源和数据。例如公司的账户管理中心中的角色有管理员、用户等,而这些角色又可以分为输出内容的人和消费内容的人,除了角色,还需要了解公司平台上的核心资源的种类以及数据信息。
    3.业务流程:了解业务数据中角色,角色的行为以及数据之间的集成关系。
    系统架构就是要把业务架构进行落地实施,实现其中的商业模式与业务流程。
    4.架构角色与技术栈:架构角色基本不会变,而技术栈会随着技术的发展而不断变化。其中的具体实现有:

    • 网关:Apache/Nginx/F5
      • 应用开发:SpringBoot/SpringCloud
      • 通讯协议:Dubbo/HTTP/PB
      • 数据处理:Hadoop/Spark/Flink
      • 数据存储:Redis/MySQL/Oracle/ES
      • 文档存储:MongoDB/HBase/Neo4j
    • 5.部署架构:架构角色的集成关系,对应业务架构中的业务流程。
    • 建模语言UML

    • 为快速了解公司的架构,可以使用统一的建模语言 UML 来分析公司架构。常用的编译语言工具有:
      • plantuml(推荐)
      • yed
      • processon
      • visio (不常用)
    • 以 plantuml 工具为例,可以设计以下图模型分析公司架构:
      • 用例图:用来描述商业模式、业务角色
      • 时序图:用来描述业务流程、调用关系
      • 部署图:用来描述系统架构与集成关系
      • 活动图:用来分析业务逻辑
      • @startuml
      • left to right direction
      • actor User as user
      • actor Admin as admin
      • package 商品 {
      • usecase “发布商品”
      • usecase “浏览商品”
      • usecase “购买商品”
      • usecase “下架商品”
      • }
      • package 订单 {
      • usecase “结算订单”
      • usecase “查询订单”
      • usecase “退款”
      • usecase “管理订单”
      • }
      • admin -up-> 发布商品
      • admin -up-> 下架商品
      • admin -up-> 管理订单
      • user --> 浏览商品
      • user --> 购买商品
      • user --> 结算订单
      • user --> 结算订单
      • user --> 查询订单
      • user --> 退款
      • @enduml
      
      
      ![](/img_convert/)
      
      • 1
      • 2
      • 3

      @startmindmap
      scale 380 height

      • <&flag>Debian
      • ** <&globe>Ubuntu
      • *** Linux Mint
      • *** Kubuntu
      • *** Lubuntu
      • *** KDE Neon
      • ** <&graph>LMDE
      • ** <&pulse>SolydXK
      • ** <&people>SteamOS
      • ** <&star>Raspbian with a very long name
      • *** Raspmbc => OSMC
      • *** Raspyfi => Volumio
      • legend right
      • Short
      • legend
      • endlegend
      • @endmindmap
      
      
      ![](/img_convert/)
      
      • 1
      • 2
      • 3

      scale 300 height
      用户 -> 认证中心: 登录操作
      认证中心 -> 缓存: 存放(key=token+ip,value=token)token

      用户 <- 认证中心 : 认证成功返回token
      用户 -> 认证中心: 下次访问头部携带token认证
      认证中心 <- 缓存: key=token+ip获取token
      其他服务 <- 认证中心: 存在且校验成功则跳转到用户请求的其他服务
      其他服务 -> 用户: 信息

      
      
      ![](/img_convert/)
      
      • 1
      • 2
      • 3

      @startuml
      scale 580 height
      start
      repeat
      :Test something;
      if (Something went wrong?) then (no)
      #palegreen:OK;
      break
      endif
      ->NOK;
      :Alert “Error with long text”;
      repeat while (Something went wrong with long text?) is (yes) not (no)
      ->//merged step//;
      :Alert “Success”;
      stop
      @enduml

      
      
      ![](/img_convert/)
      
      梳理好业务用例的本质是在测试过程中,更全面的测试公司的业务。例如复杂的电商系统或者保险行业的管理系统,内部涉及的业务流以及用户的种类都很复杂多样,不理解其中的业务逻辑和数据,就很难编写一个覆盖完善的业务用例。
      
      更好的与研发运维进行跨部门协同是指当产品出现问题时,研发和运维都会排查。作为测试,要去了解出现的问题并帮助研发运维去解决,这样可以加快部门协同进度。
      [原文链接](/s?__biz=MzU3NDM4ODEzMg==&mid=2247501515&idx=1&sn=f55bc460e1ed3089a51f064c0d4f82bf&chksm=fd31a400ca462d16e4a72cef4140076fc7ea8e0aa2199cd745f0509777ac88da0f226f79eeb8#rd) 
      
      [更多技术文章分享](/link?name=article&project_id=qrcode&from=bokeyuan&timestamp=1650006957)
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11