测试开发体系介绍——测试体系介绍-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.mzph.cn/news/241391.shtml

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

相关文章

案例147:基于微信小程序的酒店管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

MFC 视图窗口

目录 视图窗口概述 视图窗口的使用 视图窗口创建流程 命令消息 WM_COMMAND 处理顺序 对象关系 视图窗口概述 作用&#xff1a;提供了一个用于显示数据的窗口 关于视图窗口 视图类是用来展示用户&#xff0c;文档类是用来存储和管理数据视图窗口是覆盖掉框架窗口的客户区…

详解Vue3中的插槽(slot)

本文主要介绍Vue3中的插槽&#xff08;slot&#xff09;。 目录 一、在普通写法中使用插槽&#xff08;slot&#xff09;作用域插槽默认插槽 二、在setup写法中使用插槽&#xff1a;注意事项 在Vue3中&#xff0c;插槽&#xff08;slot&#xff09;是一种用于在父组件中向子组件…

Unity矩阵平移旋转缩放Matrix4x4

Unity矩阵平移旋转缩放Matrix4x4 Unity中的矩阵&#xff08;Matrix4x4&#xff09;创建自定义模型平移矩阵缩放矩阵旋转矩阵 Unity中的矩阵&#xff08;Matrix4x4&#xff09; 最近在研究帧同步定点数物理系统中需要自定义定点数矩阵&#xff0c;所以在这里分享下基础的矩阵案…

蓝牙物联网在智能家居中的应用前景

物联网智能家居系统是应用物联网技术&#xff0c;在传统家居环境下将各种零散无序的电器整合成统一整体&#xff0c;实现家电的全程自动控制&#xff0c;满足用户高效管理需求的一种新型家居模式。 其主要的子系统有家居感知系统、家庭网络系统、智能家居控制管理系统等&#x…

使用教程之【SkyWant.[2304]】路由器操作系统,破解移动【Netkeeper】校园网【小白篇】

许多高校目前饱受Netkeeper认证的痛苦&#xff0c;普通路由器无法使用&#xff0c; 教你利用SkyWant的Netkeeper认证软件来使你的SkyWant路由器顺利认证上网&#xff0c;全宿舍又可以合作共赢了&#xff01; 步骤一&#xff1a;正确连接网线&#xff0c;插电开机 正确连接网…

分布式Session使用步骤

目录 1. 为什么用分布式Session2. Spring-Session使用步骤2-1. 添加依赖2-2. yml配置 1. 为什么用分布式Session 将一个项目部署到多台服务器上时&#xff0c;多台服务器的Tomcat的Session不共享。那么就有可能造成Session数据不一致情况&#xff0c;所以此时就需要使用分布式…

Gateway API

Gateway API 目录 原文链接 https://onedayxyy.cn/docs/GatewayAPI 本节实战 实战名称&#x1f6a9; 实战&#xff1a;Gateway API在istio里的安装及测试-2023.12.23(测试失败) 前言 Gateway API 是由 SIG-NETWORK 社区管理的开源项目&#xff0c;项目地址&#xff1a;http…

nodejs+vue+ElementUi洗衣店订单管理系统4691l

衣服但是找订单的时间太长&#xff0c;体验非常的差。而且对于店家这也很头疼&#xff0c;麻烦的查找订单的方式&#xff0c;让他总是重复着繁琐的步骤&#xff0c;记录的时候也很容易出问题&#xff0c;容易把衣服弄错&#xff0c;再然后就是对于收来的衣服也很麻烦&#xff0…

初识QT(上篇):What Qt

初识QT&#xff08;上篇&#xff09;&#xff1a;What Qt 前言 & 说明前言说明 初识QT1.1 QT的what1. 介绍2. 发展历程3. QT架构的主要内容4.QT的常用模块 1.2 QT的 why1. QT的核心机制 下篇笔记链接 前言 & 说明 前言 前言&#xff1a; 之前说要share的qt相关知识&am…

【AI提示词人物篇】创新艺术未来,让科技改变想象空间

AI 绘画学习难度和练习技巧 学习绘画的技巧 学习能难度&#xff1a; 外貌特征&#xff1a;AI需要学习识别和理解各种外貌特征&#xff0c;如发型、肤色、眼睛颜色等。这可能需要大量的训练数据和复杂的模型架构。 镜头提示&#xff1a;AI需要学习理解不同镜头提示的含义&…

论文笔记--Learning Political Polarization on Social Media Using Neural Networks

论文笔记--Learning Political Polarization on Social Media Using Neural Networks 1. 文章简介2. 文章概括3. 相关工作4. 文章重点技术4.1 Collection of posts4.1.1 数据下载4.1.2 数据预处理4.1.3 统计显著性分析 4.2 Classification of Posts4.3 Polarization of users 5…

SpringMVC:Ajax、拦截器、文件上传、文件下载

文章目录 SpringMVC - 06一、Ajax1. 概述2. Ajax 异步加载数据1. 单个数据2. 对象 3. 实践4. 总结 二、拦截器1. 概述2. 实现3. 实践4. 总结 三、文件上传&#xff1a;Upload1. 准备工作2. 步骤3. 效果 四、文件下载&#xff1a;Download1. 步骤2. 效果3. 总结 注意&#xff1a…

mac m1芯片 pytorch安装及gpu性能测试

pytorch 使用mac的m1芯片进行模型训练。 #小结&#xff1a;在数据量小和模型参数少&#xff0c;batch_size小时&#xff0c;cpu训练更快&#xff08;原因&#xff1a;每次训练时数据需要放入GPU中&#xff0c;由于batch_size小。数据放入gpu比模型计算时间还长&#xff09; 在…

【SPI和API有什么区别】

✅什么是SPI&#xff0c;和API有什么区别 ✅典型解析&#x1f7e2;拓展知识仓&#x1f7e2;如何定义一个SPI&#x1f7e2;SPI的实现原理 ✅SPI的应用场景SpringDubbo ✅典型解析 Java 中区分 API和 SPI&#xff0c;通俗的进: API和 SPI 都是相对的概念&#xff0c;他们的差别只…

优化模型:MATLAB整数规划

一、整数规划介绍 1.1 整数规划的定义 若规划模型的所有决策变量只能取整数时&#xff0c;称为整数规划。若在线性规划模型中&#xff0c;变量限制为整数&#xff0c;则称为整数线性规划。 1.2 整数规划的分类 整数规划模型大致可分为两类&#xff1a; &#xff08;1&…

SQL进阶理论篇(二十):什么是SQL注入

文章目录 简介SQL注入的原理SQL注入的实例搭建sqli-labs注入环境实例一&#xff1a;猜测where条件判断查询语句的字段数获取当前数据库和用户信息获取MySQL中的所有数据库名称查询wucai数据库中的所有数据表查询heros数据表中的所有字段参考文献 简介 这节是纯兴趣篇了。 web…

less 查看文本时,提示may be a binary file.See it anyway?

解决办法 首先使用echo $LESSCHARSET查看less的编码 看情况设置less的编码格式(我的服务器上使用utf-8查看中文) 还要特别注意一下&#xff0c;Linux中存在的文本文件的编码一定要是utf - 8;&#xff08;这一步很关键&#xff09; 例如&#xff1a;要保证windows上传到Linux的…

Linux Shell 001-Bash简介

Linux Shell 001-Bash简介 本节关键字&#xff1a;Linux、Bash Shell、shell分类 相关指令&#xff1a;bash、sh、cat Shell的介绍 计算机只能认识&#xff08;识别&#xff09;机器语言(0和1)&#xff0c;如&#xff08;11000000 这种&#xff09;。但是&#xff0c;我们的…

力扣(leetcode)1148和1179题(MySQL)

1148.文章浏览I 题目链接&#xff1a;1148.文章浏览I 解答 # Write your MySQL query statement below select distinct author_id as id from Views where author_idviewer_id order by id;1179.重新格式化部门表 题目链接&#xff1a;1179.重新格式化部门表 解答 …