测试开发体系介绍——测试体系介绍-L3

目录:

  1. 测试框架体系TDDDDTBDDATDD介绍
    1. 测试框架是什么?
    2. 测试框架的价值:
    3. 测试框架的收益:
    4. 常见测试框架类型:
    5. TDD
    6. BDDBehaviorDrivenDevelopment
    7. ATDDAcceptanceTestDrivenDevelopment
    8. MBTModelBasedTesting
    9. DDTDataDrivenTesting:
  2. 持续交付与DevOps体系
    1. 传统开发流程:
    2. 敏捷开发体系:
    3. 持续集成:
    4. GitLabCI流程:
    5. 自动化测试持续集成:
    6. 持续交付介绍:
    7. 持续集成与持续交付:
    8. 持续交付流水线:
    9. 流水线构建
    10. GitLabCD流程:
    11. 持续部署:
    12. 持续集成、持续交付、持续部署:
    13. DevOps体系:
    14. DevOps相关技能示例:
    15. DevOps中的左移与右移:
  3. 测试左移体系
    1. 为什么要做测试左移?
    2. 微软的左移实践:
    3. 测试左移主要实践:
    4. 代码审查CodeReview
    5. 开发人员收益
    6. CodeReview可以发现哪些问题
    7. GerritCodeReview
    8. GitlabMergeRequestCodeReview
    9. 代码审计平台SonarQube
    10. SonarQube项目分析案例
    11. 覆盖率集成
    12. 典型bug案例
    13. SonarQube
  4. 测试右移体系
    1. 测试右移定义:
    2. 测试右移主要实践:
    3. 测试右移案例百度前端性能监控:
    4. 测试右移案例App崩溃监控:
    5. 为什么要搭建监控系统
    6. 常用架构ELKElasticStack
    7. ELKElasticStack应用
    8. 全流程质量监控
    9. 移动端监控
    10. 插桩技术
    11. 常见质量维度的监控类型
    12. 常见数据存储平台
    13. 数据检索
    14. 数据分析
    15. 测试执行分析
    16. 漏测分析
    17. 关联分析
    18. 更多数据收集
    19. 业务建模
  5. 精准测试体系
    1. 什么是精准测试?
    2. 阿里云效精准测试实施案例
    3. 精准测试案例
    4. 精准测试的应用价值
    5. 行业经典案例
    6. 关键技术点
  6. 测试开发体系讲解
    1. 腾讯与阿里的质量保证服务参考:
    2. 测试开发技术体系

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

    @Testvoid 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 {@BeforeClasspublic 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 + 1def test_answer():assert inc(3) == 5
import unittestclass 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 stringwith 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 cheeseGiven I am on the Google search pageWhen 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 forelement.sendKeys(query);// Now submit the form. WebDriver will find the form for us from the elementelement.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 secondsnew 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 LoginOpen Browser To Login PageInput Username    demoInput Password    modeSubmit CredentialsWelcome Page Should Be Open[Teardown]    Close Browser*** Keywords ***
Open Browser To Login PageOpen Browser    ${LOGIN URL}    ${BROWSER}Title Should Be    Login PageInput Username[Arguments]    ${username}Input Text    username_field    ${username}Input Password[Arguments]    ${password}Input Text    password_field    ${password}Submit CredentialsClick Button    login_buttonWelcome Page Should Be OpenTitle 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 LoginGiven login page is openWhen valid username and password are insertedand credentials are submittedThen welcome page should be open

 ATDD VS BDD:

                TDD                         ATDD                        BDD

受众         开发                        开发 测试 客户          开发 测试 客户

过程         代码                        DSL                           行为

目标         代码调用功能         验收测试需求             需求

MBT Model Based Testing 
  • 基于模型的测试
  • GraphWalker,一个开源的基于模型的测试工具

edge 代表步骤:

  • 一条边代表一个动作,一个过渡。 操作可以是 API 调用、按钮单击、超时等。任何将您的被测系统移动到您想要验证的新状态的任何事情。但请记住,边缘没有进行验证。这只发生在顶点。 

 vertex 代表断言:

  • 一个顶点代表验证,一个断言。 验证是您的代码中有断言的地方。在这里,您可以验证 API 调用是否返回正确的值、按钮单击是否确实关闭了对话框,或者在应该发生超时时,被测系统触发了预期的事件。

graph 代表测试用例集:

  • 模型是一个图,它是一组顶点和边 从模型中,GrapWalker 将生成一条通过它的路径。一个模型有一个起始元素,一个规则如何生成路径的生成器,以及告诉 GraphWalker 何时停止生成路径的相关停止条件。 

测试用例样板生成:

 @Overridepublic void v_Pet() {$(By.tagName("h2")).shouldHave(text("Pet"));}@Overridepublic 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();}@Overridepublic 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_bar1foo2: config_bar2expect_foo1: config_bar1expect_foo2: config_bar2base_url: "https://postman-echo.com"verify: Falseexport: ["foo3"]teststeps:- name: get with paramsvariables:foo1: bar11foo2: bar21sum_v: "${sum_two(1, 2)}"request:method: GETurl: /getparams:foo1: $foo1foo2: $foo2sum_v: $sum_vheaders: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 textvariables:foo1: "bar12"foo3: "bar32"request:method: POSTurl: /postheaders: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 datavariables:foo2: bar23request:method: POSTurl: /postheaders: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
    • 测试框架 测试平台
    • 测试左移 精准测试
    • 测试右移 质量监控

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/295498.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot + EasyUI 全屏布局(二)

一、创建一个Spring Boot EasyUI项目 Spring Boot EasyUI 创建第一个项目&#xff08;一&#xff09;_springboot整合easyui-CSDN博客 二、相关知识点总结 布局&#xff08;layout&#xff09;是有五个区域&#xff08;北区 north、南区 south、东区 east、西区 west 和中区…

Kafka集群架构原理(待完善)

kafka在zookeeper数据结构 controller选举 客户端同时往zookeeper写入, 第一个写入成功(临时节点), 成为leader, 当leader挂掉, 临时节点被移除, 监听机制监听下线,重新竞争leader, 客户端也能监听最新leader leader partition自平衡 leader不均匀时, 造成某个节点压力过大, …

data数据响应式

data数据响应式 所有在实例上挂载的属性&#xff0c;都可以在视图中直接使用 data中的数据&#xff0c;是经过“数据劫持”的&#xff0c;是“响应式数据” 响应式&#xff1a;修改数据&#xff0c;视图会自动更新 MV原理&#xff1a;其中一条线的原理&#xff0c;data响应式的…

关于redis单线程和IO多路复用的理解

首先&#xff0c;Redis是一个高性能的分布式缓存中间件。其复杂性不言而喻&#xff0c;对于Redis整体而言肯定不是只有一个线程。 我们常说的Redis 是单线程&#xff0c;主要是指 Redis 在网络 IO和键值对读写是采用一个线程来完成的&#xff0c;这也是 Redis 对外提供键值存储…

Android App程序应用未校验签名证书——————《风险等级高》

目录 应用签名未校验风险1、检测目的2、风险等级3、检测依据4、风险描述5、检测步骤6、结果描述7、解决方案7.1、Android 检验 APK 是否签名的代码7.2、检验APK签名 8、结尾 应用签名未校验风险 1、检测目的 检测App程序启动时是否校验签名证书。 防止App的盗版率。未进行签…

Python3 迭代器与生成器

迭代器 迭代是Python最强大的功能之一&#xff0c;是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问&#xff0c;直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法&#xff1a;iter…

C/C++ 基础函数

memcpy&#xff1a;C/C语言中的一个用于内存复制的函数&#xff0c;声明在 string.h 中&#xff08;C是 cstring&#xff09; void *memcpy(void *destin, void *source, unsigned n);作用是&#xff1a;以source指向的地址为起点&#xff0c;将连续的n个字节数据&#xff0c;…

微服务之配置中心与服务跟踪

zookeeper 配置中心 实现的架构图如下所示&#xff0c;采取数据加载到内存方式解决高效获取的问题&#xff0c;借助 zookeeper 的节点监听机制来实现实时感知。 配置中心数据分类 事件调度&#xff08;kafka&#xff09; 消息服务和事件的统一调度&#xff0c;常用用 kafka …

基于阻塞队列下的生产者消费者模型(多线程)

目录 一、生产者消费者模型1.1 为何要使用生产者消费者模型1.2 生产者消费者模型优点1.3 基于BlockingQueue的生产者消费者模型1.4 C用queue模拟阻塞队列的生产消费模型1.4.1 makefile1.4.2 BlockQueue.hpp1.4.3 LockGuard.hpp1.4.4 Task.hpp1.4.5 main.cc 二、Linux多线程内容…

1854_bash中利用管道进行批量参数传递以及由此实现简单的代码行数统计

Grey 全部学习内容汇总&#xff1a; GreyZhang/bash_basic: my learning note about bash shell. (github.com) 1854_bash中的参数传递以及利用bash进行简单的代码行数统计 有时候需要处理多个文件&#xff0c;把每一个文件作为参数传递给某一个程序。这时候可以用到 xargs&…

XSKY星辰天合星海架构荣获 IT168 “2023 年度技术卓越奖”

近日&#xff0c;"2023 年度技术卓越奖"获奖名单公布&#xff0c;XSKY 星辰天合的星海架构&#xff08;XSEA&#xff0c;极速全共享架构&#xff09;获得行业 CIO/CTO 大咖、技术专家及 IT 媒体三方认可&#xff0c;成功入选&#xff01; “技术卓越奖”评选由国内著…

KMP入门级别算法详解--终于解决了(next数组详解)

对于正常的字符串模式匹配&#xff0c;主串长度为m&#xff0c;子串为n&#xff0c;时间复杂度会到达O&#xff08;m*n&#xff09;&#xff0c;而如果用KMP算法&#xff0c;复杂度将会减少线型时间O&#xff08;mn&#xff09;。 设主串为ptr"ababaaababaa";&#…