《微服务架构实战》读书笔记 微服务测试

背景:

相比单体应用,微服务进行变更时,仅需更新应用程序的单个组件。但同时面临着以下挑战:

  1. 系统依赖性增加:微服务架构需要更多的隔离组件,给系统带来更多的依赖,导致接口数量增多,更新时需要测试的接口也就增多。
  2. 并行开发:接口数量增加,不同服务可能由不同团队进行维护。一个接口变动,会导致连锁反应。
  3. 与传统测试的冲突
  4. 更多潜在的故障:大量的独立故障点
  5. 更多的团队交互

微服务测试

微服务测试从传统的三层测试金字塔扩展到五层:

同三层测试金字塔基本原则相同:

  • 越往上,越接近业务/最终用户; 月往下,越接近开发
  • 越往上,测试用例越少
  • 越往上,测试成本越高(越耗时,失败时的信息越模糊,越南跟踪)。
  • 越往上,测试的实现和维护成本就越高,测试的速度也越慢

具体描述如下:

  1. UI/UE测试:功能测试、兼容性测试、安装卸载测试等。界面风格、文字等界面友好性测试。掺杂测试人员主管意念

  2. 端对端测试:除了测试服务,测试者还需要确保无论使用何种架构构建,应用都必须实现业务目标,同时,还需要测试继承系统运行的完整性。还要确保架构重构时业务功能不会受到影响(找到覆盖缺口)

  3. API测试:API测试同UI功能测试,在已经知道输入内容和期望结果的前提下,使用这个功能/调用这个API并且验证是否返回期望的结果。主要使用工具/软件调用待测API,验证是否返回期望的output

  4. 组件接口测试:测试各个模块之间能够正确交互,并测试其作为子系统的交互性以查看接口的缺陷。通过集成测试来完成。

    • 集成测试:通过集成模块检查路径畅通与否,来确认模块与外部组件的交互情况。
  5. 单元测试:局限在服务内部,围绕一组相关联的按理编写。是指对软件中最小可测试单元进行检查和验证。比如测试一个类、一个类的方法……

单元测试

单元测试的三个步骤:

  • 准备测试环境和数据
  • 执行目标方法
  • 验证执行结果

在做单元测试时,代码负载率常常被拿来作为衡量测试好坏的指标,甚至用代码覆盖率考核测试完成情况。

代码覆盖率包含如下指标:

  • 行覆盖率
  • 分支覆盖率
  • 路径覆盖率
  • 条件覆盖率
  • 状态机覆盖率
单元测试工具1—— JUnit

JUnit:java单元测试框架。

JUnit的基本注释如下:

  • @BeforeClass: 所有测试方法签执行一次,一般写在整体初始化的代码
  • @AfterClass: 所有测试方法后执行一次,一般在其中写上销毁和释放资源的代码
  • @Before:在每个测试方法前执行,一般用来初始化方法。
  • @After:在每个测试方法后执行,在方法执行后要完成的事情
  • @Test(timeout = 1000):测试方法执行超过1000毫秒后算超时,测试将失败
  • @Test(excepted = Exception.class):测试方法期望得到的异常类,如果方法执行没有抛出指定的异常,则测试失败。
  • @Ignore(“not ready yet”):执行测试时忽略掉此方法,如果用于修饰类,则忽略整个类。
  • @RunWith:选择JUnit中的Runner,如果做简单测试,不涉及spring,可以省略@Runwith注解,此时系统使用默认注解。
单元测试工具2——Spring boot单元测试

@SpringBootTest是Spring Boot项目测试的和兴注解,标识该测试类以Spring Boot方式运行。

单元测试工具3 —— Mockito

Mockito是一个基于MIT协议的开源java测试框架。Mockito区别于其他模拟框架的地方主要在于允许开发者在没有建立“预期”时验证被测系统的行为。对mock对象的一个批评是被测代码与测试系统高度耦合,由于Mickito试图通过移除“期望规范”来去除expect-run-verify模式(期望-运行-验证),因此使耦合度降到最低。由此简化代码,使代码更容易阅读和修改。

API测试

  • Postman,基于工具测试,发送http请求,支持get/put/post/delete及许多其他http方法。
  • Jmeter:一款专门用于功能测试和压力测试的轻量级测试开发平台。
  • 压力测试:使用Hitchhiker,进入Stress模块,点击“create stress test”,设置并发数、qps、timeout、keeplive等参数。

A/B测试

https://www.zhihu.com/question/20045543

A/B测试又叫做分离测试,类似于客户焦点团体,将一系列内容变化在一定基准内进行比较。A/B测试来自邮件宣传,发信这将同一目的的内容的不同版本邮寄到目标群体中,测量回应率。根据这些数据,商家可以对以后的只有的内容做相应修改,想更多回应率的版本改进。

核心思想:

  • 多个方案并行测试
  • 每个方案只有一个变量不同
  • 以某种规则优胜劣汰

A/B测试需要一个分流的环节以将不同的版本展现给不同的用户。可以在服务器端多分流,也可以在客户端做分流,传统的一般在服务器端做分流,基于微服务架构,可以用网关做分流。

冒烟和回归测试

冒烟测试: 在测试中发现问题,找到一个bug,然后开发人员修复这个bug。

冒烟测试的对象是每一个新编译的需要正式测试的软件版本,目的是确认软件基本功能正常,可以进行后续的正式测试工作。冒烟测试的执行者是版本编译人员。

回归测试:修改了旧代码以后,重新进行测试以确认修改有没有引入新的错误或导致其他代码产生错误。

回归测试自动化测试:

  1. 使用Postman编写微服务接口的测试用例,并导出JSON文件
  2. 使用Jenkins创建测试项目,使用newman来执行测试脚本,生成测试报告
  3. 将测试项目与工程构建项目关联,使之在构建发布到测试环境后触发执行。

静态代码分析

常用的静态代码分析工具包括Checkstyle、findBugs、PMD等,这三种工具简介如下表。

SonarQube质量监控

Sonar(SonarQube)是一个开源平台,用于管理代码的质量。其不止是一个质量数据报告工具,更是代码质量管理平台。通过插件机制,其可以集成不同的测试工具、代码分析工具、以及集成工具。

Sonar与持续集成工具不同,它并不是简单的把不同代码检查工具结果直接显示到web页面,而是通过不同插件对这些结果再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。

对ide支持,也对大量的集成工具提供接口支持,同时,除了java还支持PHP、C#、C、Cobol、PL/SQL、Flex等

Sonar可以从对个维度检测代码质量,包括以下维度:

  1. 复杂度分布(comolexity):代码复杂度过高将难以理解、难以维护
  2. 重复代码(duplications):程序中包含大量复制粘贴的代码是质量低下的表现
  3. 单元测试(unit tests):统计并展示单元测试覆盖率
  4. 编码规范(coding rules):通过FindBugs、PMD、checkStyle等规范代码编写
  5. 注释(comments):少了可读性差,多了看起来费劲
  6. 潜在的Bug(potential bugs):通过FindBugs、PMD、checkStyle等检测潜在的Bug
  7. 结构与设计(architecture & design):依赖,耦合等。

Sonar运行流程:

  1. 从SVN或git代码仓库获取静态代码
  2. 对静态代码进行扫描分析,根据事先定义好的规则扫描代码中可能存在的漏洞
  3. 把扫描的结果数据存储到数据库中。使用可视化界面进行分析和展示。

测试的真正价值在于提高代码质量和产品的持续交付能力。自动化测试可以节省测试和质量管理人员的成本,提高整体软件构建的速度。

#测试##笔记##读书笔记#
全部评论

相关推荐

点赞 10 评论
分享
牛客网
牛客企业服务