软件测试开发体系

构建现代化的软件测试体系

自动化测试 智能化测试 敏捷测试 持续交付 DevOps

目录

  • 互联网技术体系
  • 分层测试策略
  • 自动化测试策略
  • 持续交付与 DevOps 体系
  • 测试左移体系
  • 测试右移体系
  • 精准测试体系
  • 测试开发工程师进阶路线

互联网技术体系

系统架构类型

单体架构
微服务架构
事件驱动架构
服务网格
云原生架构

经典技术架构

  • 网关产品 Nginx Apache Httpd
  • Web 应用开发 Vue.js React
  • 移动应用开发 Android iOS RN Flutter
  • 后端应用开发 Java(Spring Boot)
  • 底层引擎:C/C++ Go Rust
  • 消息管道 Kafka RabbitMQ
  • 缓存系统 Redis MemCached
  • 数据监控 Logstash ElasticSearch Kibana
  • 性能监控 Prometheus Grafana
  • 大数据处理 Hadoop Spark Flink
  • 人工智能深度学习 TensorFlow Pytorch

智能家居技术架构

阿里云经典业务架构

阿里云物联网平台技术架构

企业服务钉钉技术架构

企业服务飞书技术架构

电子商城 Mall 开源项目技术架构

复杂业务的测试管理体系

测试用例管理平台

  • 数据驱动管理方式 yaml xml json
  • 文档管理方式 Excel
  • 平台管理方式:Jira Gitlab 禅道
  • 在线管理方式:腾讯 TAPD

gitlab testcase

成千上万的测试用例无法维护?

  • 测试用例常见维护方式
    • Excel
    • 禅道
    • Jira
  • 问题
    • 测试用例无法很好的复用
    • 测试用例无法继承
    • 参数化测试用例无法生成与统计

基于模型的维护方式

  • 模型:
    • 思维导图 UML 图
    • 有限状态机
    • 约束性编程 Page Object
    • Domain Model
  • 测试用例动态生成
    • 测试用例生成
    • 测试执行的覆盖分析

复杂业务流程测试不充分?复杂业务测试的建模技术

  • 利用有向图与图数据库 Neo4J
  • 利用约束性编程 Page Object、Domain Object
  • 利用领域 DSL:GraphWalker

思维导图还要手画?测试用例生成与可视化技术

生成用例执行树图

某系统流程图 算法系统流程图

百度Image搜索系统建模 百度 Image 搜索系统建模

测试策略

质量保证提升策略

  • 领域建模分析
    • 需求分析
    • 设计分析
    • 用户场景分析
    • ...
  • 质量标准规范
    • 质量标准
    • 准入准出
    • 质量门禁
    • ...
  • 测试用例
    • 测试用例编写
    • 测试用例评审
    • 测试流程验证
    • ...

业务逻辑覆盖率度量

  • 界面覆盖率、UI 控件覆盖率
  • 接口覆盖率、接口参数组合覆盖率
  • 代码覆盖率、行/条件/分支覆盖率。。。

效率提升策略

  • 分层测试体系
  • Mock 与数据工厂
  • 持续集成/持续交付/Devops
  • UI 自动化测试
  • 接口自动化测试
  • 自动遍历测试

大部分公司测试体系的痛点

  1. 研发提测质量低?
  2. 提测流程周期长。
  3. 回归测试耗时耗力。
  4. Bug 发现晚,修复流程长。

Applied Software Measurement, Capers Jones(卡珀斯·琼斯), 1996

金字塔分层测试体系

金字塔模型

反模式

反模式-沙漏模型

反模式-倒三角模型

利用解耦提高可测性

用户端自动化测试体系

用户端自动化测试在企业中的实践 - 有赞

  • 有赞: 前端重用户交互,单纯的接口测试、单元测试不能真实反映用户的操作路径 ,并且从以往的经验中总结得出,因为各种不可控因素导致核心场景的不可用时有出现,所以每次发布一个应用前,都会将此应用提供的核心功能执行一遍,那随着业务的不断积累,需要回归的测试场景也越来越多,导致回归的工作量巨大。为了降低人力成本,我们亟需通过自动化手段释放劳动力,所以将核心流程回归的 UI 自动化提到了最核心地位

有赞

用户端自动化测试在企业中的实践 - 美团

  • 对于不同的用户,美团 App 页面的呈现方式其实多种多样, 如果要在 1 天时间内完成开发、测试、上线流程,研发团队也面临着很大的挑战。所以测试工程师就需要重度依赖自动化测试来形成快速的验收机制。

用户端测试体系与技术架构

业务价值层
业务测试
用户体验测试
性能测试
安全测试
业务知识图谱
测试体系层
自动化测试框架
自动化测试平台
智能探索爬虫
测试自动化智能体
UI Diff测试
用户体验监控系统
知识图谱
持续交付体系
技术架构层
Selenium
Playwright
Langchain
OWASP
Jenkins
MySQL
Redis
Docker
K8S

用户端测试策略

  • 端到端全流程 UI 测试与接口测试
  • 集成级别的接口测试体系
  • 测试左移提升研发阶段的代码质量

测试金字塔模型

用户端功能测试体系

自动化测试

构建全流程测试体系,用于全量回归测试

人工测试

支持项目的日常测试体系,重点进行新功能的测试。

人工智能测试

使用多角色AI Agent进行无人值守的智能探索测试

智能探索爬虫

利用爬虫对系统自动进行探索式测试,提高测试的广度覆盖

用户端体验测试

用户端性能
健壮性测试
兼容性测试
安全测试
合规测试
国际化测试

自动化测试框架架构

业务价值层
业务测试
用户体验测试
业务知识图谱
测试体系层
自动化测试框架
智能探索爬虫
测试自动化智能体
知识图谱
技术架构层
Selenium
Playwright
Langchain
OWASP
Jenkins

Web 自动化测试技术选型 Selenium

  • 跨语言:Java、Python 等
  • 跨平台:Windows、Mac
  • 底层多引擎可切换
  • 生态丰富,社区强大

selenium

Web 自动化测试技术选型 Playwright

Playwright 为现代网络应用程序提供可靠的端到端测试。Playwright 可以跟踪包含测试执行截屏视频、实时 DOM 快照等资源

playwright

自动化测试框架

  • 强化测试用例规范
  • 提高自动化实施效率
  • 增强业务知识图谱分析

page object

neo4j

测试报告示例

allure

allure

智能探索爬虫

通过爬虫技术,对网站的所有页面进行智能化的探索,以获取整个系统的业务流程与页面数据。可以实现自动化测试、页面性能分析、新老版本 diff 测试。

智能遍历工具

  • 百度 SmartMonkey
  • 腾讯 NewMonkey
  • 头条 fastbot
  • Google App Crawler
  • 霍格沃兹测试开发学社 AppCrawler
  • OWASP-ZAP Web 漏洞自动探测

OWASP Web/接口爬虫

Agent 智能体

  • LLM 大语言模型 chatgpt qwen llama
  • Planning:规划 路由 ReAct
  • Parser:结构化输出解析 json
  • Tools:工具集合与调用能力 tool function
  • Memory:记忆 短期 长期

agent

测试自动化智能体

利用人工智能智能体实现基于人类语言的自动化。可以实现基于特定意图的自动化,可以实现让手工测试直接转成自动化执行,可大幅降低自动化成本。

业务知识图谱

随着业务的复杂性提高,我们需要更全面的分析业务流程与测试场景。结合知识图谱可以让我们更加细致的了解业务全貌并提高业务场景的测试覆盖。

多维度测试执行数据的领域建模

  • 人工测试行为
  • 智能探索测试行为
  • 人工智能体测试行为
  • 接口日志

neo4j

UI Diff 测试

精准对比新老版本之间的差异,快速发现业务变更带来的潜在问题

自动化测试完善方向

方向 方案 价值
质量保障 质量保障与业务测试 保障业务、性能、用户体验
业务模型驱动测试 业务知识图谱建设 高质量 高覆盖度
丰富测试能力 引入前沿测试技术与工具
效能提升 自动化测试框架 降低自动化成本,提高测试效率
AI 测试能力落地 利用 AI 增强测试能力 降低成本
持续集成持续交付 增强研发、测试协同

自动化测试平台

  • 领域模型管理
  • 测试用例管理
  • 测试数据管理
  • 测试执行分析
  • 测试结果分析
  • 测试能力管理

AI 测试平台

服务端自动化测试

后端链路调用架构图

淘宝

使用 Mock 技术解耦与提高测试覆盖

Mock 示例 自由构造数据

接口测试框架

  • Python:Requests
  • Java:RestAssured
  • 简约的接口测试 DSL
  • 支持结构化解析 XML JSON 等

接口自动化测试用例自动生成

  • 静态生成:
    • 基于文档 Swagger YAPI
    • 基于代码分析语法树
  • 动态生成、录制、生成、回放:
    • 基于 Proxy 生成用例
    • 基于插桩框架生成用例 JVM-SandBox ByteBuddy

测试用例自动生成技术例子 Swagger

JVM-Sandbox-Repeater 录制回放工具

接口重构与 diff 测试

Twitter diffy diff 测试算法

流量回放

GoRplay 技术架构

性能测试

压测工具

  • JMeter 全能型压测工具
  • LoadRunner 全能型压测工具
  • Gatling 性能强悍的压测工具,性能是 JMter 的 N 倍
  • Locust 基于 python 的压测工具
  • nGrinder 分布式
  • ab http 协议压测

LR 与 JMeter 趋势比较

性能监控价值

  • 性能监控是什么
    • 对应用的多样化性能指标进行持续性收集、存储、分析和可视化。
  • 性能监控价值
    • 提升性能分析能力
    • 可以快速发现性能瓶颈
    • 辅助针对性的解决问题
    • 提高实时反馈与响应能力

性能监控指标分析

  • 压测工具 TPS Latency
  • 系统指标 CPU MEM IO NETWORK
  • 应用指标 Nginx JVM MySQL Redis Kafka
  • 内核指标 native funtion C/C++

Prometheus

Prometheus 是一个开源系统监控和警报工具包 从指标到洞察力使用领先的开源监控解决方案为您的指标和警报提供支持

Grafana 数据可视化平台

Grafana 允许您查询、可视化、提醒和了解您的指标,无论它们存储在哪里。与您的团队创建、探索和共享漂亮的仪表板,并培养数据驱动的文化。

SkyWalking

分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。

SkyWalking Trace

SkyWalking 数据库性能分析

用户端性能监控技术

SkyWalking 前端性能监控

SkyWalking 性能剖析 Profiling

性能监控介绍总结

  • 性能监控已经在行业里得到了大规模的应用,成为很多公司做性能分析的重要手段。 掌握性能监控平台的构建能力可以帮助公司及时的发现性能问题、提高响应能力,提升公司整体产品体验。
  • 掌握性能监控平台的构建和使用也是性能测试工作者的核心能力

用例管理体系

大纲

  • 测试用例:版本化管理、测试数据组合、测试流程
  • 测试框架:TDD(测试驱动开发)、DDT(数据驱动测试)、ATDD(验收测试驱动开发/关键字驱动开发)、BDD(行为驱动开发)
  • 测试平台:自研平台、Jenkins 平台

测试框架设计

测试框架的核心

  • 领域建模
  • 自动化
  • 结果分析

测试框架分类

  • TDD:使用 TDD 框架结合领域 DSL 描述测试,Requests、RestAssured、Selenium、Appium
  • DDT :数据驱动测试,代表作 HttpRunner
  • ATDD:验收测试驱动开发,代表作 RobotFramework
  • BDD:行为驱动开发,代表作 Cucumber RobotFramework

非 PO 风格的 TDD 风格

def test_ceshiren_search():
    web = SeleniumFramework()
    web.start()
    web.open('https://ceshiren.com')
    web.click('#search-button')
    web.click('.show-advanced-search')
    web.click('.search-query')
    web.keys('人工智能')
    web.click('.search-cta')
    r = web.find('.topic-title')
    assert '人工智能' in r

PO 风格的 TDD 测试用例

class IndexPage:
    def __init__(self):
        self.web = SeleniumFramework()

    def search(self, keyword):
        self.web.start()
        self.web.open('https://ceshiren.com')
        self.web.click('#search-button')
        self.web.click('.show-advanced-search')
        self.web.click('.search-query')
        self.web.keys('人工智能')
        self.web.click('.search-cta')
        r = self.web.find('.topic-title')
        return r


def test_po():
    index_page = IndexPage()
    r = index_page.search('人工智能')
    assert '人工智能' in r

数据驱动 DDT 示例

test_search:
  - framework: web
  - open: https://ceshiren.com
  - click: [id, search-button]
  - click:
      by: css selector
      value: .show-advanced-search
  - click: { by: css selector, value: .search-query }
  - send_keys: 人工智能
  - click: .search-cta
  - find: .topic-title
  - assert: |
      "人工智能" in _

ATDD 风格

*** Settings ***
Documentation     Simple example using SeleniumLibrary.
Library           SeleniumLibrary

*** Variables ***
${LOGIN URL}      http://localhost:7272
${BROWSER}        Chrome

*** Test Cases ***
Valid Login
    Open Browser To Login Page
    Input Username    demo
    Input Password    mode
    Submit Credentials
    Welcome Page Should Be Open
    [Teardown]    Close Browser

*** Keywords ***
Open Browser To Login Page
    Open Browser    ${LOGIN URL}    ${BROWSER}
    Title Should Be    Login Page

Input Username
    [Arguments]    ${username}
    Input Text    username_field    ${username}

Input Password
    [Arguments]    ${password}
    Input Text    password_field    ${password}

Submit Credentials
    Click Button    login_button

Welcome Page Should Be Open
    Title Should Be    Welcome Page

BDD 风格

Scenario: Finding some cheese
   Given I am on the Google search page
   When I search for "Cheese!"
   Then the page title should start with "cheese"

package com.example;

import io.cucumber.java.After;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;

public class ExampleSteps {

    private final WebDriver driver = new FirefoxDriver();

    @Given("I am on the Google search page")
    public void I_visit_google() {
        driver.get("https://www.google.com");
    }

    @When("I search for {string}")
    public void search_for(String query) {
        WebElement element = driver.findElement(By.name("q"));
        // Enter something to search for
        element.sendKeys(query);
        // Now submit the form. WebDriver will find the form for us from the element
        element.submit();
   }

   @Then("the page title should start with {string}")
   public void checkTitle(String titleStartsWith) {
       // Google's search is rendered dynamically with JavaScript
       // Wait for the page to load timeout after ten seconds
       new WebDriverWait(driver,10L).until(new ExpectedCondition<Boolean>() {
           public Boolean apply(WebDriver d) {
               return d.getTitle().toLowerCase().startsWith(titleStartsWith);
           }
       });
   }

   @After()
   public void closeBrowser() {
       driver.quit();
   }
}

测试平台

  • 市场需求:测试平台的开发目前是测试行业中的一个热门的技术
  • 公司需求:
    • 能为团队带来市场价值,比如 wetest
    • 高效的平台做调度中心
  • 例子:
    • DevOps 平台
    • 精准化测试平台
    • 质量监控平台等等

腾讯测试平台示例

测吧 AI 测试平台示例

持续交付 DevOps 体系

持续交付与 DevOps 体系

传统开发流程

V 模型

微软某产品测试流程

微软

W 模型

敏捷测试体系

敏捷开发体系

敏捷

敏捷是一个术语,描述软件开发方法,强调增量交付、团队协作、持续规划和持续学习。 敏捷术语于 2001 年在敏捷宣言中创造。 宣言旨在制定原则,指导更好的软件开发方法。 宣言的核心是声明四个值语句,这些语句表示敏捷运动的基础。 如书面所述,宣言指出:

敏捷宣言

  • 个体和互动 高于 流程和工具
  • 工作的软件 高于 详尽的文档
  • 客户合作 高于 合同谈判
  • 响应变化 高于 遵循计划

宣言并不意味着这些语句右侧的项并不重要或不需要。 相反,左侧的项目更重视。

敏捷开发

敏捷开发 是一个术语,用于描述迭代软件开发。 迭代软件开发通过以短增量完成工作(通常称为 冲刺)缩短 DevOps 生命周期。 冲刺通常长达一到四周。 敏捷开发通常与传统或瀑布式开发形成鲜明对比,后者预先计划大型项目,并根据计划完成它们。

每次冲刺交付生产质量代码都需要敏捷开发团队加快速度。 所有的编码、测试和质量验证都必须在每一次冲刺 (sprint) 中完成。 除非团队已正确设置,否则结果可能低于预期。 虽然这些失望提供了很好的学习机会,但开始之前,学习一些关键教训很有帮助。

常见敏捷开发体系

  • Scrum
  • XP
  • KanBan
  • CI/CD

Scrum

Scrum 是团队用来管理其工作的框架。 Scrum 将 敏捷 原则作为一组具体的项目、做法和角色来实现

KanBan

极限编程 XP

极限编程(ExtremeProgramming,简称 XP)是由 KentBeck 在 1996 年提出的,是一种软件工程方法学,是敏捷软件开发中可能是最富有成效的几种方法学之一。如同其他敏捷方法学,极限编程和传统方法学的本质不同在于它更强调可适应性能性以及面临的困难。1996 年三月,Kent 终于在为 DaimlerChrysler 所做的一个项目中引入了新的软件开发观念——XP。适用于小团队开发。

持续集成

持续集成是一种 DevOps 软件开发实践。采用持续集成时,开发人员会定期将代码变更合并到一个中央存储库中,之后系统会自动运行构建和测试操作。持续集成通常是指软件发布流程的构建或集成阶段,需要用到自动化组件(例如 CI 或构建服务)和文化组件(例如学习频繁地集成)。持续集成的主要目标是更快发现并解决缺陷,提高软件质量,并减少验证和发布新软件更新所需的时间。

@亚马逊

持续集成

GitLab CI 流程

自动化测试持续集成

持续交付

持续交付介绍

持续交付是一种软件开发实践,通过持续交付,系统可以自动为将代码更改发布到生产环境做好准备。​ 现代应用程序开发的支柱,持续交付通过在构建阶段后将所有代码变更部署到测试环境和/或生产环境中,实现对持续集成的扩展。在正确实施时,开发人员将始终拥有已通过标准化测试流程的部署就绪构建构件 ​。 采用持续交付时,开发人员可以自动执行单元测试以外的测试,这样他们就可以在部署到客户环境前跨多个维度对应用程序更新进行验证。这些测试可能包括 UI 测试、负载测试、集成测试、API 可靠性测试等。这有助于开发人员更全面地验证更新并抢先发现其中的问题。
@亚马逊

持续交付

持续集成与持续交付

持续交付流水线

流水线构建

GitLab CD 流程

阿里云持续交付流程

持续部署

通过持续部署,可自动完成从代码提交到生产的全过程。开发与交付阶段之间的触发器是自动的,因此,在代码更改获得验证并通过所有测试后,就会立即发布。这意味着在改进功能可用后客户便可立即获得这些功能。

@microsoft

持续部署

持续集成、持续交付、持续部署

DevOps 体系

  • 持续集成
  • 持续交付
  • 微服务
  • 基础设施即代码
  • 监控和日志记录
  • 沟通与合作

Atlassian

DevOps 相关技能示例

阿里云 DevOps 流程

DevOps 中的左移与右移

Q&A

测试左移体系

为什么要做测试左移

Applied Software Measurement, Capers Jones(卡珀斯·琼斯), 1996

微软的左移实践

微软

测试左移主要实践

  • 需求分析与评审
  • 代码评审
  • 代码审计、代码静态分析
  • 自动化测试左移
  • 单元测试
  • 覆盖率统计
  • 应用监控
  • 测试用例生成

代码审查 Code Review

代码审查是指对计算机源代码系统化地审查,常用软件同行评审的方式进行,其目的是在找出及修正在软件开发初期未发现的错误,提升软件质量及开发者的技术。代码审查常以不同的形式进行,例如结对编程、非正式的看过整个代码,或是正式的软件检查。

开发人员收益

  • 工作认真且始终如一
  • 向其他开发人员学习最佳实践和新技术
  • 在代码库中实现一致性和质量

Code Review 可以发现哪些问题

  • 设计:代码是否经过精心设计并适合代码库?
  • 功能:代码是否按预期以对用户有益的方式执行?
  • 复杂性:其他开发人员能否理解和使用代码?
  • 命名:代码是否包含变量、类和方法等元素的清晰名称?
  • 注释:注释是否具体且完整?

Gerrit Code Review

Gitlab Merge Request Code Review

代码审计平台 SonarQube

SonarQube 项目分析案例

覆盖率集成

典型 bug 案例

学社 SonarQube 演练环境体验

总结

测试左移可以让我们更早更快的发现研发阶段引入的 bug,从而可以更好的保障产品质量,降低项目沟通成本,提高研发效率。

测试右移体系

测试右移主要实践

  • 应用监控
  • 综合监控 质量监控 Continuous Quality Monitoring
  • A/B 测试
  • 金丝雀部署 Canary releases
  • TIP 线上测试
  • 故障注入 混沌工程 Chaos testing

测试右移-线上监控

  • 闭环的线上问题反馈-检查-解决-更新流程
  • 更便捷的日志查看、回传服务
  • 丰富有效的 log,便于问题的快速定位
  • 丰富的监控指标(例如业务异常点指标)
  • 业务监控(例如短信发送等)
  • 关键指标每日监控(服务器指标)
  • 生产数据监控(警报)

精准测试体系

什么是精准测试

百度百科:精准测试是一套计算机测试辅助分析系统。精准测试的核心组件包含的软件测试示波器、用例和代码的双向追溯、智能回归测试用例选取、覆盖率分析、缺陷定位、测试用例聚类分析、测试用例自动生成系统,这些功能完整的构成了精准测试技术体系。

阿里:通过建立测试用例与业务方法的关联关系,在代码发生变化时,精准的推荐出需要运行的用例,进行测试执行与结果反馈。通过精准的圈定测试范围,可以带来效率和速度的双重收益。

Thoughtworks:利用技术手段对测试过程产生的数据进行采集存储,计算,汇总,可视化最终帮助团队提升软件测试的效率、并对项目整体质量进行改进和优化的这一系列操作。

网易:精准测试是一套计算机测试辅助分析系统。使用用例和代码两个关键因子,进行质量综合考量和分析的创新测试理论方法体系,核心组件包含软件测试示波器、用例和代码的双向追溯、智能回归测试用例选取、覆盖率分析、缺陷定位、测试用例聚类分析、测试用例自动生成系统,这些功能完整的构成了精准测试技术体系。

阿里云效精准测试实施案例

阿里

阿里

精准测试案例

Thoughtworks

精准测试的应用价值

基于测试用例与代码的关联数据分析,实现测试覆盖改进的方法

  • 根据代码变更定位测试用例范围
  • 根据代码覆盖精准改进测试用例
  • 测试用例漏测精准定位
  • 基于大数据反推有效测试用例

行业经典案例

  • 百度利用覆盖率增量从回归数据中提取有效覆盖
  • 精准定位用例数据与覆盖率关系
  • 代码行为流建模
  • 星云测试
  • 有赞集成测试覆盖率统计实践
  • 蚂蚁金服的代码实时染色
  • 有赞精准测试实践
  • 网易精准测试
  • 阿里云效
  • ...

精准测试实现技术

关键技术点

  • 静态分析
    • 语法树分析 javaparser antlr
    • 代码变更 git diff
    • 字节码分析 ASM
  • 动态分析
    • 覆盖率 JaCoCo
    • 插桩 JVM-SANDBOX ByteBuddy
    • 流程追踪 debug trace hook
  • 测试用例
    • 手工用例
    • 自动化用例 JUnit pytest

uml diagram

测试开发技术体系

  • 用户端测试
    • Web/App 测试
    • Web/App 自动化测试
    • 用户端专项测试
    • 用户端安全测试
  • 服务端测试
    • 接口协议与 Mock
    • 接口自动化测试
    • 服务端性能测试
    • 服务端安全测试
  • 持续交付
    • 容器技术 Docker
    • 自动化系统 Jenkins
    • 持续集成
    • 持续交付
  • 测试开发
    • 持续部署 DevOps
    • 测试框架 测试平台
    • 测试左移 精准测试
    • 测试右移 质量监控

测试能力架构图

测试能力架构图

Q&A