目录:
- 测试框架体系TDDDDTBDDATDD介绍
- 测试框架是什么?
- 测试框架的价值:
- 测试框架的收益:
- 常见测试框架类型:
- TDD
- BDDBehaviorDrivenDevelopment
- ATDDAcceptanceTestDrivenDevelopment
- MBTModelBasedTesting
- DDTDataDrivenTesting:
- 持续交付与DevOps体系
- 传统开发流程:
- 敏捷开发体系:
- 持续集成:
- GitLabCI流程:
- 自动化测试持续集成:
- 持续交付介绍:
- 持续集成与持续交付:
- 持续交付流水线:
- 流水线构建
- GitLabCD流程:
- 持续部署:
- 持续集成、持续交付、持续部署:
- DevOps体系:
- DevOps相关技能示例:
- DevOps中的左移与右移:
- 测试左移体系
- 为什么要做测试左移?
- 微软的左移实践:
- 测试左移主要实践:
- 代码审查CodeReview
- 开发人员收益
- CodeReview可以发现哪些问题
- GerritCodeReview
- GitlabMergeRequestCodeReview
- 代码审计平台SonarQube
- SonarQube项目分析案例
- 覆盖率集成
- 典型bug案例
- SonarQube
- 测试右移体系
- 测试右移定义:
- 测试右移主要实践:
- 测试右移案例百度前端性能监控:
- 测试右移案例App崩溃监控:
- 为什么要搭建监控系统
- 常用架构ELKElasticStack
- ELKElasticStack应用
- 全流程质量监控
- 移动端监控
- 插桩技术
- 常见质量维度的监控类型
- 常见数据存储平台
- 数据检索
- 数据分析
- 测试执行分析
- 漏测分析
- 关联分析
- 更多数据收集
- 业务建模
- 精准测试体系
- 什么是精准测试?
- 阿里云效精准测试实施案例
- 精准测试案例
- 精准测试的应用价值
- 行业经典案例
- 关键技术点
- 测试开发体系讲解
- 腾讯与阿里的质量保证服务参考:
- 测试开发技术体系
1.测试框架体系 TDD DDT BDD ATDD 介绍
测试框架是什么?
- 测试框架是一组用于创建和设计测试用例的指南或规则。框架由旨在帮助 QA 专业人员更有效地测试的实践和工具的组合组成。 这些指南可能包括编码标准、测试数据处理方法、对象存储库、存储测试结果的过程或有关如何访问外部资源的信息。
测试框架的价值:
- 测试框架是任何成功的自动化测试过程的重要组成部分。它们可以降低维护成本和测试工作,并为寻求优化其敏捷流程的 QA 团队提供更高的投资回报率 (ROI)。
测试框架的收益:
- Improved test efficiency 提高测试效率
- Lower maintenance costs 降低维护成本
- Minimal manual intervention 最少的人工干预
- Maximum test coverage 最大测试覆盖率
- Reusability of code 代码的可重用性
常见测试框架类型:
框架 说明
TDD 代码风格
DDT 数据驱动风格
ATDD 验收测试驱动开发
BDD 行为驱动开发 (Behavior-driven development)
MBT Model Based Testing 基于模型的测试
TDD
TDD 定义:
- 测试驱动开发(TDD)是一个软件开发过程,在软件完全开发之前,将软件需求转换为测试用例,并通过针对所有测试用例重复测试软件来跟踪所有软件开发。这与首先 开发软件和稍后创建测试用例相反
TDD 流程:
- 单元测试
- 重构
- 覆盖率
- 可测性提升
- 模型驱动设计
代表作 JUnit TestNG
@Test
void standardAssertions() {
assertEquals(2, calculator.add(1, 1));
assertEquals(4, calculator.multiply(2, 2),
"The optional failure message is now the last parameter");
assertTrue('a' < 'b', () -> "Assertion messages can be lazily evaluated -- "
+ "to avoid constructing complex messages unnecessarily.");
}
TestNG:
package example1;
import org.testng.annotations.*;
public class SimpleTest {
@BeforeClass
public void setUp() {
// code that will be invoked when this test is instantiated
}
@Test(groups = { "fast" })
public void aFastTest() {
System.out.println("Fast test");
}
@Test(groups = { "slow" })
public void aSlowTest() {
System.out.println("Slow test");
}
}
代表作 Pytest UnitTest
# content of test_sample.py
def inc(x):
return x + 1
def test_answer():
assert inc(3) == 5
import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
BDD Behavior Driven Development
- 在软件工程中,行为驱动开发 (BDD) 是一种敏捷软件开发过程,它鼓励软件项目中的开发人员、质量保证专家和客户代表之间进行协作。它鼓励团队使用对话和具体示例来形成对应用程序应该如何运行的共同理解。它源于测试驱动开发 (TDD)。行为驱动开发将 TDD 的通用技术和原则与领域驱动设计和对象的思想相结合面向分析和设计,为软件开发和管理团队提供共享工具和共享流程,以便在软件开发方面进行协作。
BDD VS TDD:
BDD:
BDD 与 TDD
BDD 相关框架:
- JBehave
- Cucumber
- Mspec
- Specflow
Cucumber:
Cucumber 测试用例 Scenario 场景:
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"
Cucumber 测试用例步骤定义:
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();
}
}
cucumber 项目结构:
ATDD Acceptance Test Driven Development
ATDD 定义:
- 验收测试驱动开发 (ATDD) 是一种基于业务客户、开发人员和测试人员之间沟通的开发方法。ATDD 包含许多与示例规范 (SBE)、行为驱动开发 (BDD)、示例驱动开发 (EDD)、和支持驱动开发(也称为故事测试驱动开发(SDD)。所有这些流程都有助于开发人员和测试人员在实施之前了解客户的需求,并使客户能够使用他们自己的领域语言进行交流。
ATDD 相关工具:
- FitNesse:完全集成的独立wiki和验收测试框架
- Robot Framework是一个基于python的、可扩展的关键字驱动的自动化框架,用于验收测试、验收测试驱动开发(ATDD)、行为驱动开发(BDD)和机器人过程自动化(RPA)。
Robotframework:
Robotframework 介绍:
- Robot Framework是一个通用的开源自动化框架。它可以用于测试自动化和机器人过程自动化(RPA)。Robot Framework有一个简单的语法,使用人类可读的关键字。它的功能可以通过使用Python、Java或许多其他编程语言实现的库来扩展。Robot Framework有一个丰富的生态系统,包括作为独立项目开发的库和工具。
Robotframework 测试用例:
*** 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
数据驱动风格:
*** Settings ***
Test Template Login with invalid credentials should fail
*** Test Cases *** USERNAME PASSWORD
Invalid User Name invalid ${VALID PASSWORD}
Invalid Password ${VALID USER} invalid
Invalid User Name and Password invalid invalid
Empty User Name ${EMPTY} ${VALID PASSWORD}
Empty Password ${VALID USER} ${EMPTY}
Empty User Name and Password ${EMPTY} ${EMPTY}
BDD 风格:
*** Test Cases ***
Valid Login
Given login page is open
When valid username and password are inserted
and credentials are submitted
Then welcome page should be open
ATDD VS BDD:
TDD ATDD BDD
受众 开发 开发 测试 客户 开发 测试 客户
过程 代码 DSL 行为
目标 代码调用功能 验收测试需求 需求
MBT Model Based Testing
- 基于模型的测试
- GraphWalker,一个开源的基于模型的测试工具
edge 代表步骤:
- 一条边代表一个动作,一个过渡。 操作可以是 API 调用、按钮单击、超时等。任何将您的被测系统移动到您想要验证的新状态的任何事情。但请记住,边缘没有进行验证。这只发生在顶点。
vertex 代表断言:
- 一个顶点代表验证,一个断言。 验证是您的代码中有断言的地方。在这里,您可以验证 API 调用是否返回正确的值、按钮单击是否确实关闭了对话框,或者在应该发生超时时,被测系统触发了预期的事件。
graph 代表测试用例集:
- 模型是一个图,它是一组顶点和边 从模型中,GrapWalker 将生成一条通过它的路径。一个模型有一个起始元素,一个规则如何生成路径的生成器,以及告诉 GraphWalker 何时停止生成路径的相关停止条件。
测试用例样板生成:
@Override
public void v_Pet() {
$(By.tagName("h2")).shouldHave(text("Pet"));
}
@Override
public void e_AddPetFailed() {
$(By.id("name")).clear();
$(By.id("birthDate")).clear();
$(By.id("birthDate")).sendKeys("2015/02/05" + Keys.ENTER);
$(By.id("ui-datepicker-div")).shouldBe(not(visible));
$(By.id("type")).selectOption("dog");
$("button[type=\"submit\"]").click();
}
@Override
public void e_VisitAddedFailed() {
$(By.id("description")).clear();
$("button[type=\"submit\"]").click();
}
}
DDT Data Driven Testing:
DDT:
- 数据驱动测试(DDT),也称为表驱动测试或参数化测试,是一种软件测试方法,用于计算机软件的测试,用于描述使用条件表直接作为测试输入和可验证输出完成的测试以及测试环境设置和控制没有硬编码的过程
DDT 相关工具:
- DDT 是一种实践,可以跟很多框架结合
- 单元测试结合 DDT:JUnit4 JUnit5 TestNG
- RobotFramework DDT
- YAML JSON CSV 驱动 HttpRunner
数据驱动应用案例
- HttpRunner 可以根据代理抓包自动生成测试用例
- YAPI、Swagger 等工具可以根据数据自动生成测试用例代码
- JVM-Sandbox-Repeater Gor 录制工具可以把请求保存为测试用例并重放以实现快速回归测试
HttpRunner测试框架:
HttpRunner 测试用例:
config:
name: "request methods testcase with functions"
variables:
foo1: config_bar1
foo2: config_bar2
expect_foo1: config_bar1
expect_foo2: config_bar2
base_url: "https://postman-echo.com"
verify: False
export: ["foo3"]
teststeps:
- name: get with params
variables:
foo1: bar11
foo2: bar21
sum_v: "${sum_two(1, 2)}"
request:
method: GET
url: /get
params:
foo1: $foo1
foo2: $foo2
sum_v: $sum_v
headers:
User-Agent: HttpRunner/${get_httprunner_version()}
extract:
foo3: "body.args.foo2"
validate:
- eq: ["status_code", 200]
- eq: ["body.args.foo1", "bar11"]
- eq: ["body.args.sum_v", "3"]
- eq: ["body.args.foo2", "bar21"]
- name: post raw text
variables:
foo1: "bar12"
foo3: "bar32"
request:
method: POST
url: /post
headers:
User-Agent: HttpRunner/${get_httprunner_version()}
Content-Type: "text/plain"
data: "This is expected to be sent back as part of response body: $foo1-$foo2-$foo3."
validate:
- eq: ["status_code", 200]
- eq:
[
"body.data",
"This is expected to be sent back as part of response body: bar12-$expect_foo2-bar32.",
]
- name: post form data
variables:
foo2: bar23
request:
method: POST
url: /post
headers:
User-Agent: HttpRunner/${get_httprunner_version()}
Content-Type: "application/x-www-form-urlencoded"
data: "foo1=$foo1&foo2=$foo2&foo3=$foo3"
validate:
- eq: ["status_code", 200]
- eq: ["body.form.foo1", "$expect_foo1"]
- eq: ["body.form.foo2", "bar23"]
- eq: ["body.form.foo3", "bar21"]
数据驱动风格为什么广受欢迎
- 维护成本最低,录制回放技术越来越成熟,可以与数据驱动很好的结合。低代码、用例生成技术的流行,会让数据驱动风格更受欢迎。
2.持续交付与 DevOps 体系
传统开发流程:
敏捷开发体系:
持续集成:
- 持续集成是一种 DevOps 软件开发实践。采用持续集成时,开发人员会定期将代码变更合并到一个中央存储库中,之后系统会自动运行构建和测试操作。持续集成通常是指软件发布流程的构建或集成阶段,需要用到自动化组件(例如 CI 或构建服务)和文化组件(例如学习频繁地集成)。持续集成的主要目标是更快发现并解决缺陷,提高软件质量,并减少验证和发布新软件更新所需的时间。
GitLab CI 流程:
自动化测试持续集成:
持续交付介绍:
- 持续交付是一种软件开发实践,通过持续交付,系统可以自动为将代码更改发布到生产环境做好准备。 现代应用程序开发的支柱,持续交付通过在构建阶段后将所有代码变更部署到测试环境和/或生产环境中,实现对持续集成的扩展。在正确实施时,开发人员将始终拥有已通过标准化测试流程的部署就绪构建构件 。 采用持续交付时,开发人员可以自动执行单元测试以外的测试,这样他们就可以在部署到客户环境前跨多个维度对应用程序更新进行验证。这些测试可能包括 UI 测试、负载测试、集成测试、API 可靠性测试等。这有助于开发人员更全面地验证更新并抢先发现其中的问题。
持续集成与持续交付:
持续交付流水线:
流水线构建
GitLab CD 流程:
持续部署:
- 通过持续部署,可自动完成从代码提交到生产的全过程。开发与交付阶段之间的触发器是自动的,因此,在代码更改获得验证并通过所有测试后,就会立即发布。这意味着在改进功能可用后客户便可立即获得这些功能。
持续集成、持续交付、持续部署:
DevOps 体系:
- 持续集成
- 持续交付
- 微服务
- 基础设施即代码
- 监控和日志记录
- 沟通与合作
DevOps 相关技能示例:
DevOps 中的左移与右移:
3.测试左移体系
为什么要做测试左移?
微软的左移实践:
测试左移主要实践:
- 需求分析与评审{class=column}
- 代码评审{class=column}
- 代码审计、代码静态分析{class=column}
- 自动化测试左移{class=column}
- 单元测试{class=column}
- 覆盖率统计{class=column}
- 应用监控{class=column}
- 测试用例生成{class=column} {class=“ui grid three column”}
代码审查 Code Review
- 代码审查是指对计算机源代码系统化地审查,常用软件同行评审的方式进行,其目的是在找出及修正在软件开发初期未发现的错误,提升软件质量及开发者的技术。代码审查常以不同的形式进行,例如结对编程、非正式的看过整个代码,或是正式的软件检查。
开发人员收益
- 工作认真且始终如一
- 向其他开发人员学习最佳实践和新技术
- 在代码库中实现一致性和质量
Code Review 可以发现哪些问题
- 设计:代码是否经过精心设计并适合代码库?
- 功能:代码是否按预期以对用户有益的方式执行?
- 复杂性:其他开发人员能否理解和使用代码?
- 命名:代码是否包含变量、类和方法等元素的清晰名称?
- 注释:注释是否具体且完整?
Gerrit Code Review
Gitlab Merge Request Code Review
代码审计平台 SonarQube
SonarQube 项目分析案例
覆盖率集成
典型 bug 案例
SonarQube
总结
- 测试左移可以让我们更早更快的发现研发阶段引入的 bug,从而可以更好的保障产品质量,降低项目沟通成本,提高研发效率。
4.测试右移体系
测试右移定义:
- 右移是在实际条件下在生产中执行测试、质量和性能评估的做法。右移方法确保在生产中运行的应用程序可以承受真实的用户负载,同时确保同样高水平的质量。 通过右移,DevOps 团队测试构建的应用程序以确保性能、弹性和软件可靠性。目标是检测和修复在开发环境中难以预料的问题。
测试右移主要实践:
- 应用监控
- 综合监控 质量监控 Continuous Quality Monitoring
- A/B 测试
- 金丝雀部署 Canary releases
- TIP 线上测试
- 故障注入 混沌工程 Chaos testing
测试右移案例 百度前端性能监控:
测试右移案例 App崩溃监控:
为什么要搭建监控系统
- 测试数据收集
- 测试数据分析
- 测试数据可视化与分析
常用架构 ELK ElasticStack
ELK ElasticStack 应用
全流程质量监控
- 研发自测
- 内部测试
- 公测
- 线上监控
- 监控分析测试覆盖度
- 定位问题
- 监控使用人数
- 监控使用深度
移动端监控
- 移动端插桩
- 埋点:硬编码
- AOP 编程:AspectJ
- 插桩框架:ASM、JavaAssist
- 数据收集回传
- logstash
- kafka
- filebeat
插桩技术
- 基于编译插桩,需要植入 sdk,NewRelic
- 基于 dex 插桩:Appetizer
- Hook:XPosed、Frida
常见质量维度的监控类型
- app 崩溃监控(Bugly)
- 应用性能监控(APM)
- 业务监控(TalkingData、友盟)
- 质量监控(缺位)
- 精准化测试平台
常见数据存储平台
- 数据同步:logstash、flume
- 数据存储:elasticsearch、influxdb、prometheus
- 前端展现:kibana、grafana
数据检索
数据统计
数据分析
测试执行分析
漏测分析
关联分析
更多数据收集
- 用户反馈分析:
- 核心用户在产品内的反馈
- 应用商店评论
- 进行汇总分析
- 产品反馈
- 外部平台:Bugly 友盟 Flurry
业务建模
- 建模
- UI 模型
- 接口模型
- 性能数据
- 代码流模型
- 分析
- 基于规则
- diff 算法
- 机器学习+AI
5.精准测试体系
什么是精准测试?
- 百度百科:精准测试是一套计算机测试辅助分析系统。精准测试的核心组件包含的软件测试示波器、用例和代码的双向追溯、智能回归测试用例选取、覆盖率分析、缺陷定位、测试用例聚类分析、测试用例自动生成系统,这些功能完整的构成了精准测试技术体系。
- 阿里:通过建立测试用例与业务方法的关联关系,在代码发生变化时,精准的推荐出需要运行的用例,进行测试执行与结果反馈。通过精准的圈定测试范围,可以带来效率和速度的双重收益。
- Thoughtworks:利用技术手段对测试过程产生的数据进行采集存储,计算,汇总,可视化最终帮助团队提升软件测试的效率、并对项目整体质量进行改进和优化的这一系列操作。
- 网易:精准测试是一套计算机测试辅助分析系统。使用用例和代码两个关键因子,进行质量综合考量和分析的创新测试理论方法体系,核心组件包含软件测试示波器、用例和代码的双向追溯、智能回归测试用例选取、覆盖率分析、缺陷定位、测试用例聚类分析、测试用例自动生成系统,这些功能完整的构成了精准测试技术体系。
阿里云效精准测试实施案例
精准测试案例
精准测试的应用价值
基于测试用例与代码的关联数据分析,实现测试覆盖改进的方法:
- 根据代码变更定位测试用例范围
- 根据代码覆盖精准改进测试用例
- 测试用例漏测精准定位
- 基于大数据反推有效测试用例
行业经典案例
- 百度利用覆盖率增量从回归数据中提取有效覆盖
- 精准定位用例数据与覆盖率关系
- 代码行为流建模
- 星云测试
- 有赞集成测试覆盖率统计实践
- 蚂蚁金服的代码实时染色
- 有赞精准测试实践
- 网易精准测试
- 阿里云效
- …
关键技术点
- 静态分析
- 语法树分析 javaparser antlr
- 代码变更 git diff
- 字节码分析 ASM
- 动态分析
- 覆盖率 JaCoCo
- 插桩 JVM-SANDBOX ByteBuddy
- 流程追踪 debug trace
6.测试开发体系讲解
腾讯与阿里的质量保证服务参考:
阿里云效测试能力与架构
腾讯 WeTest 测试能力全景图:
测试开发技术体系
- 用户端测试
- Web/App 测试
- Web/App 自动化测试
- 用户端专项测试
- 用户端安全测试
- 服务端测试
- 接口协议与 Mock
- 接口自动化测试
- 服务端性能测试
- 服务端安全测试
- 持续交付
- 容器技术 Docker
- 自动化系统 Jenkins
- 持续集成
- 持续交付
- 测试开发
- 持续部署 DevOps
- 测试框架 测试平台
- 测试左移 精准测试
- 测试右移 质量监控