Web自动化—Cypress 测试框架概述

news2024/11/15 3:57:37

🍅 视频学习:文末有免费的配套视频可观看

🍅 关注公众号:互联网杂货铺,回复1 ,免费获取软件测试全套资料,资料在手,薪资嘎嘎涨

Cypress 测试框架概述

1.1 Cypress 默认文件结构

    在Cypress安装完成后,其生成的默认文件目录如下所示:

1.1.1 Fixtures

    Fixture又称之为测试夹具,通常配合cy.fixture命令使用,主要用于存储测试用例的外部静态数据。其默认位置位于cypress\fixtures中,也可以根据需要配置到其他目录。 Fixtures里面的静态数据通常存储在json文件中,而这部分数据通常是某个网络请求对应的响应部分,如HTTP状态码和返回值等。Fixture的应用场景通常为,当测试需要对某些外部接口进行访问并依赖于其返回值时,可以使用fixture而无需访问这些接口。

1.1.2 测试文件

    测试文件就是对应的测试用例,一般位于cypress\integration中,也可以根据需要配置到另一个目录中,通常为js文件,在Cypress中其他命令格式为:fileName.spec.js,支持的文件类型如下所示:

  • .js
  • .jsx
  • .coffee
  • .cjsx

1.1.3 Plugins

    在Cypress中,测试代码是运行浏览器里面,提供了更加可靠的测试体验,但也存在明显的缺点,使得与浏览器之外进行通信更加困难。为解决这个问题,Cypress提供了一些插件,可以修改或扩展Cypress的内部行为。插件一般位于cypress\plugins,在每个测试文件运行之前,Cypress会自动加载该目录中的index.js文件。

1.1.4 Support

    支持文件一般位于目录cypress\support中,可以根据需要放置在其他目录中,其主要功能是放置可复用配置项,如底层通用方法、全局默认配置等。在每个测试文件运行前,Cypress会自动加载该目录中的index.js文件。

    使用方法也非常简单,仅需要在cypress\support\index.js文件中添加beforeEach()函数即可。示例如下所示:

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-javascript"><span style="color:#a6e22e">beforeEach</span>( <span style="color:#66d9ef">function</span> (){
  cy.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">`Current Enviroment is <span style="color:#f8f8f2">${<span style="color:#66d9ef">JSON</span>.stringfy(Cypress.env())}</span>`</span>)
 }
)
</code></span></span>

1.2 核心概念

1.2.1 核心参数配置

    在第一次打开Cypress Test Runner后,cypress.json将会创建,目录与Cypress同级。该文件主要用于保存所有支持的自定义配置,在配置了录制和测试项目后,则projectId将会被保存至cypress.json文件中。

用户可以通过参数来定义所使用的配置文件,参数为--config-file

1.2.1.1 全局配置项

    以下为Cypress支持的常用自定义的全局配置及其默认值,如下所示:

配置项默认值描述
baseUrlnullURL前缀,通常与命令cy.visit()/cy.request()结合使用
clientCertificates[]客户端证书选项数组
env{}环境变量设置选项,任何支持的值均可
numTestsKeptInMemory50在内存中保存的快照和命令数据等数量,在运行测试时,若内存占用太高,可以减少该值
portnullCypress使用的端口号,默认随机产生
redirectionLimit20在出现错误前,允许应用程序在测试运行时重定向的数量
reporterspec在Cypress运行时使用的的reporter
reporterOptionsnullreporter支持的配置选项
watchForFileChangestrue用于监测文件变化,若有变化,则自动重新运行该用例

1.2.1.2 超时

    超时是Cypress中的核心概念,所以必须了解,常见的超时参数如下所示:

配置项默认值描述
defaultCommandTimeout4000命令默认超时时间,单位为ms
execTimeout60000在cy.exec()执行期间,等待系统命令完成执行的超时时间,单位为ms
taskTimeout60000在cy.task()执行期间,等待任务完成执行的超时时间,单位为ms
pageLoadTimeout60000在等待页面加载或cy.visit()/cy.go()/cy.reload()等命令触发其他页面加载事件的超时时间,单位为ms,网络请求受限于操作系统
requestTimeout5000在执行cy.wait()命令时,请求超时时间,单位为ms
responseTimeout30000在执行命令cy.request()/cy.wait()/cy.fixture()/cy.getCookie()/cy.getCookies()/cy.setCookie()/ cy.clearCookie()/ cy.clearCookies/cy.screenshot()时的响应超时时间,单位为ms
slowTestThreshold10000 | 250在Cypress run期间,运行较慢的测试用例在reporter中将会以桔黄色显示,通过该参数可进行单独设置E2E和组件测试超时时间,E2E默认超时时间为 10000ms,而组件测试为250ms,单位为ms

1.2.1.3 目录和文件

    Cypress支持自定义目录和文件,如下所示:

配置项默认值描述
downloadsFoldercypress/downloads在测试期间,默认的文件下载目录
fileServerFolderroot project folder向服务器发送的应用程序文件目录
fixturesFoldercypress/fixturesfixture默认目录,可更改默认值为false来禁用
ignoreTestFiles*.hot-update.js在运行期间,需要忽略的测试用例
integrationFoldercypress/integration测试用例所在目录
pluginsFilecypress/plugins/index.jsPlugins所在目录,可更改默认值为false来禁用
screenshotsFoldercypress/screenshots在测试用例运行失败或cy.screenshot()命令触发截图,用于保存这些截图的目录
supportFilecypress/support/index.js在测试加载之前要加载的文件
testFiles**/.要加载的测试文件
videosFoldercypress/videos在Cypress run运行期间,用于保存video的目录

1.2.1.4 截图

配置项默认值描述
screenshotOnRunFailuretrue测试用例运行失败后将进行截图
screenshotsFoldercypress/screenshots在测试用例运行失败或cy.screenshot()命令触发截图,用于保存这些截图的目录

1.2.1.5 视频

配置项默认值描述
videoCompression32设置视频的压缩比,设置为false关闭压缩或0~51,数字越低,视频质量越好,文件越大
videosFoldercypress/videos在Cypress run运行期间,用于保存video的目录
videotrue是否启用视频功能
videoUploadOnPassestrue是否启用在用例运行通过后,上传视频至Dashboard,仅适用于录制项目,如果关闭该功能,则仅上传运行失败的视频

1.2.1.6 视图

配置项默认值描述
viewportHeight660测试视图下待测试应用程序的默认高度,单位为pixels,可使用cy.viewport()命令覆盖
viewportWidth1000测试视图下待测试应用程序的默认宽度,单位为pixels,可使用cy.viewport()命令覆盖

更多自定义选项,可查阅官方文档,地址为:Configuration | Cypress Documentation

1.2.1.7 命令行

    除了使用配置文件进行配置以外,也可以使用命令行进行设置以下各个参数,如下所示:

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-kotlin">cypress <span style="color:#66d9ef">open</span> --config pageLoadTimeout=<span style="color:#ae81ff">30000</span>,baseUrl=https:<span style="color:#75715e">//www.surpass.com</span>
cypress run --config integrationFolder=tests,videoUploadOnPasses=<span style="color:#ae81ff">false</span>
</code></span></span>

1.2.1.8 Cypress.config()

    除了直接在cypress.json文件中更改配置之外,也可以通过Cypress.config()去获取或覆盖某些配置项。其基本使用方法如下所示:

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-scss"><span style="color:#75715e">// 获取所有config信息</span>
Cypress<span style="color:#a6e22e">.config</span>()
<span style="color:#75715e">// 获取指定config信息</span>
Cypress<span style="color:#a6e22e">.config</span>(name)
<span style="color:#75715e">// 更改指定config信息</span>
Cypress<span style="color:#a6e22e">.config</span>(name,value)
<span style="color:#75715e">// 设置多个config项</span>
Cypress<span style="color:#a6e22e">.config</span>(object)
</code></span></span>

    示例代码如下所示:

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-javascript"><span style="color:#a6e22e">describe</span>(<span style="color:#e6db74">"测试Cypress.config"</span>,<span style="color:#66d9ef">function</span>(){
   <span style="color:#a6e22e">it</span>(<span style="color:#e6db74">"获取defaultCommandTimeout"</span>,<span style="color:#66d9ef">function</span>(){
       cy.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">`defaultCommandTimeout value is:<span style="color:#f8f8f2">${Cypress.config(<span style="color:#e6db74">"defaultCommandTimeout"</span>)}</span>`</span>)
       <span style="color:#75715e">// 设置参数选项值</span>
       <span style="color:#a6e22e">Cypress</span>.<span style="color:#a6e22e">config</span>(<span style="color:#e6db74">"defaultCommandTimeout"</span>,<span style="color:#ae81ff">99999</span>)
       cy.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">`defaultCommandTimeout value is:<span style="color:#f8f8f2">${Cypress.config(<span style="color:#e6db74">"defaultCommandTimeout"</span>)}</span>`</span>)
   })
})
</code></span></span>

    运行结果如下所示:

1.2.2 用例结构

    Cypress是建立在MochaChai之上,因此同时支持Chai的BDDTDD两种风格。如果你熟悉JavaScript风格的代码,那么在Cypress中写测试用例是很容易上手的。

Mocha是一款适用于Node.js和浏览器的测试框架,可使用异步测试变得简单灵活。

    Cypress的测试风格继承于Mocha,提供了describe()context()it()specify()四个关键字,对于一条可执行的测试而言,必须包含以下两个组成部分:

  • describe()context()等效,均表示一个测试套件或测试集
  • it()specify()等效,均表示一个测试用例

    示例如下所示:

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-javascript"><span style="color:#a6e22e">describe</span>(<span style="color:#e6db74">'我是一个测试集'</span>, () => {
    <span style="color:#a6e22e">it</span>(<span style="color:#e6db74">'测试用例-1'</span>, () => {
        <span style="color:#a6e22e">expect</span>(<span style="color:#ae81ff">1</span>+<span style="color:#ae81ff">2</span>).to.<span style="color:#a6e22e">eq</span>(<span style="color:#ae81ff">3</span>)
    });
    <span style="color:#a6e22e">it</span>(<span style="color:#e6db74">'测试用例-2'</span>, () => {
        <span style="color:#a6e22e">expect</span>(<span style="color:#ae81ff">3</span>-<span style="color:#ae81ff">2</span>).to.<span style="color:#a6e22e">eq</span>(<span style="color:#ae81ff">1</span>)
    });
    <span style="color:#a6e22e">it</span>(<span style="color:#e6db74">'测试用例-3'</span>, () => {
        <span style="color:#a6e22e">expect</span>(<span style="color:#ae81ff">3</span>*<span style="color:#ae81ff">2</span>).to.<span style="color:#a6e22e">eq</span>(<span style="color:#ae81ff">5</span>)
    });
});
</code></span></span>

    最终的运行结果如下所示:

更多测试用例的组织和编写会在后续详细讲解

1.2.3 重试机制

    重试是Cypress一个非常重要的功能,在了解重试的概念后,有助于写出更加健壮的测试。

1.2.3.1 命令和断言

    命令断言是两种在Cypress中测试常用的两种方法,示例如下所示:

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-javascript"><span style="color:#75715e">/// <reference types="cypress" /></span>

<span style="color:#a6e22e">describe</span>(<span style="color:#e6db74">''</span>, () => {
    <span style="color:#66d9ef">let</span> baseUrl=<span style="color:#e6db74">"https://example.cypress.io/todo"</span>
    <span style="color:#a6e22e">it</span>(<span style="color:#e6db74">'测试用例-1'</span>, () => {
        <span style="color:#75715e">// 一个命令 visit</span>
       cy.<span style="color:#a6e22e">visit</span>(baseUrl);
       <span style="color:#75715e">// 一个命令 get,一个断言 should</span>
       cy.<span style="color:#a6e22e">get</span>(<span style="color:#e6db74">".header input"</span>).<span style="color:#a6e22e">should</span>(<span style="color:#e6db74">"have.class"</span>,<span style="color:#e6db74">"new-todo"</span>);
       <span style="color:#75715e">// 三个命令 get 和 type</span>
       cy.<span style="color:#a6e22e">get</span>(<span style="color:#e6db74">'.new-todo'</span>).<span style="color:#a6e22e">type</span>(<span style="color:#e6db74">'todo A{enter}'</span>).<span style="color:#a6e22e">type</span>(<span style="color:#e6db74">'todo B{enter}'</span>);
        <span style="color:#75715e">// 一个命令 get,一个断言 should</span>
       cy.<span style="color:#a6e22e">get</span>(<span style="color:#e6db74">'.todo-list li'</span>).<span style="color:#a6e22e">should</span>(<span style="color:#e6db74">'have.length'</span>, <span style="color:#ae81ff">4</span>);
    });

});
</code></span></span>

    最终的运行结果如下所示:

    让我们一起来看看最后一行的命令和断言,如下所示:

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-javascript"> cy.<span style="color:#a6e22e">get</span>(<span style="color:#e6db74">'.todo-list li'</span>).<span style="color:#a6e22e">should</span>(<span style="color:#e6db74">'have.length'</span>, <span style="color:#ae81ff">4</span>);
</code></span></span>

    以上命令和断言,是通过cy.get()命令查找页面的DOM,在找到与选择器匹配的元素,然后进行断言尝试,而现在很多WEB应用几乎都是异步的。以最后一行代码为例,Cypress不能在查询DOM元素(todo-list)的同时又去检查其元素个数是否为4个。因此在出现以下情况,就会出现问题,如下所示:

  • 1.当运行命令或断言时,应用程序没有更新DOM时,怎么办?
  • 2.当运行命令或断言时,应用程序正在等待后端返回响应,而页面暂时没有结果时,怎么办?
  • 3.当运行命令或断言时,应用程序正在进行密集计算,而导致页面显示未及时更新时,怎么办?

    以上几种情况,在测试过程中非常常见,一般处理办法在断言前,设置一个等待时间,但这个等待时间,在不同环境中还不能完全统一,还是会导致经常出错。而Cypress处理这种问题,则非常智能,如下所示:

在实际运行时,如果cy.get()命令之后的断言通过,则认为该命令成功执行。如果失败,则cy.get()命令将重新查询应用程序的DOM,再进行断言。如果失败,则再次执行cy.get()命令查询DOM,再进行断言。依此类推,直至断言成功或cy.get()命令超时为止。

    正是因为Cypress的这种自动重试功能避免了在测试代码中出现硬编码的等待。使测试代码更加健壮。

1.2.3.2 多重断言

    在日常测试中,有时候需要对一个数据进行多次断言,Cypress提供一种方法叫多重断言,其定义为:单个命令后跟多个断言。在断言时,Cypress将按顺序重试每个命令,即当第一个断言通过后,在进行第二个断言时仍会重试第一个断言。当第一和第二个断言都通过后,在进行第三个断言,仍然会重试第一和第二个断言,依此类推。来看看以下示例:

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-javascript"><span style="color:#75715e">/// <reference types="cypress" /></span>

<span style="color:#a6e22e">describe</span>(<span style="color:#e6db74">'多重断言示例'</span>, () => {
    <span style="color:#66d9ef">let</span> baseUrl=<span style="color:#e6db74">"https://example.cypress.io/todo"</span>;
    <span style="color:#a6e22e">it</span>(<span style="color:#e6db74">'演示用例-1'</span>, () => {
        cy.<span style="color:#a6e22e">visit</span>(baseUrl);
        cy.<span style="color:#a6e22e">get</span>(<span style="color:#e6db74">'.new-todo'</span>).<span style="color:#a6e22e">type</span>(<span style="color:#e6db74">'todo A{enter}'</span>).<span style="color:#a6e22e">type</span>(<span style="color:#e6db74">'todo B{enter}'</span>);
        cy.<span style="color:#a6e22e">get</span>(<span style="color:#e6db74">'.todo-list li'</span>)
        .<span style="color:#a6e22e">should</span>(<span style="color:#e6db74">'have.length'</span>,<span style="color:#ae81ff">4</span>)
        .<span style="color:#a6e22e">and</span>((<span style="color:#f8f8f2">$li</span>) => {
            <span style="color:#a6e22e">expect</span>($li.<span style="color:#a6e22e">get</span>(<span style="color:#ae81ff">2</span>).textContent,<span style="color:#e6db74">'first item'</span>).to.<span style="color:#a6e22e">equal</span>(<span style="color:#e6db74">'todo A'</span>)
            <span style="color:#a6e22e">expect</span>($li.<span style="color:#a6e22e">get</span>(<span style="color:#ae81ff">3</span>).textContent,<span style="color:#e6db74">'second item'</span>).to.<span style="color:#a6e22e">equal</span>(<span style="color:#e6db74">'todo B'</span>)
           });
    });
});
</code></span></span>

.and()断言是.should()的别名,它是.should()的自定义回调函数,包含两个expect()断言。

    最终的运行结果如下所示:

    上面代码共有三个断言,分别是should和两个expect。在测试过程中,如果第二个断言失败了,则第三个断言不会执行,如果第二个断言执行通过,整个命令还未超时,在执行第三个断言前,会再次重试第一个和第二个断言。

    修改代码使得第二个断言出现失败,代码如下所示:

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-javascript"><span style="color:#75715e">/// <reference types="cypress" /></span>

<span style="color:#a6e22e">describe</span>(<span style="color:#e6db74">'多重断言示例'</span>, () => {
    <span style="color:#66d9ef">let</span> baseUrl=<span style="color:#e6db74">"https://example.cypress.io/todo"</span>;
    <span style="color:#a6e22e">it</span>(<span style="color:#e6db74">'演示用例-1'</span>, () => {
        cy.<span style="color:#a6e22e">visit</span>(baseUrl);
        cy.<span style="color:#a6e22e">get</span>(<span style="color:#e6db74">'.new-todo'</span>).<span style="color:#a6e22e">type</span>(<span style="color:#e6db74">'todo A{enter}'</span>).<span style="color:#a6e22e">type</span>(<span style="color:#e6db74">'todo B{enter}'</span>);
        cy.<span style="color:#a6e22e">get</span>(<span style="color:#e6db74">'.todo-list li'</span>)
        .<span style="color:#a6e22e">should</span>(<span style="color:#e6db74">'have.length'</span>,<span style="color:#ae81ff">4</span>)
        .<span style="color:#a6e22e">and</span>((<span style="color:#f8f8f2">$li</span>) => {
            <span style="color:#a6e22e">expect</span>($li.<span style="color:#a6e22e">get</span>(<span style="color:#ae81ff">2</span>).textContent,<span style="color:#e6db74">'first item'</span>).to.<span style="color:#a6e22e">equal</span>(<span style="color:#e6db74">'toda A'</span>)
            <span style="color:#a6e22e">expect</span>($li.<span style="color:#a6e22e">get</span>(<span style="color:#ae81ff">3</span>).textContent,<span style="color:#e6db74">'second item'</span>).to.<span style="color:#a6e22e">equal</span>(<span style="color:#e6db74">'todo B'</span>)
           });
    });
});
</code></span></span>

    在第二个断言运行失败后,第三个断言则不会被执行。在执行命令超时后,会在运行页面显示第一个断言执行成功,第二个断言执行失败,如下图所示:

1.2.3.3 重试条件

    Cypress并不会重试所有命令。当命令可能改变待测应用程序的状态时,则将不会进行重试操作(例如.click()命令)。Cypress仅会重试查询DOM的命令,例如cy.get()、.find()、.contains()等等。

如果需要查询更多重试的命令,可查阅API文档中Assertions文档https://docs.cypress.io/guides/references/assertions

    重试的超时时间默认为4s,也可通过defaultCommandTimeout进行设置。

1.2.3.3.1 增加超时时间

    我们也可以通过修改所有命令的超时时间,例如,将全局的默认超时时间设置为10s,如下所示:

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-lua">cypress run <span style="color:#75715e">--config defaultCommandTimeout=10000</span>
</code></span></span>

    以上这种方式可以修改全局的超时时间,但不推荐。相反,我们可以通过设置单个命令的超时时间{ timeout: ms },而更加灵活的控制各个命令的超时时间,示例如下所示:

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-javascript"><span style="color:#75715e">/// <reference types="cypress" /></span>

<span style="color:#a6e22e">describe</span>(<span style="color:#e6db74">'多重断言示例'</span>, () => {
    <span style="color:#66d9ef">let</span> baseUrl=<span style="color:#e6db74">"https://example.cypress.io/todo"</span>;
    <span style="color:#a6e22e">it</span>(<span style="color:#e6db74">'演示用例-1'</span>, () => {
        cy.<span style="color:#a6e22e">visit</span>(baseUrl,{<span style="color:#f92672">timeout</span>:<span style="color:#ae81ff">1000</span>});
        cy.<span style="color:#a6e22e">get</span>(<span style="color:#e6db74">'.new-todo'</span>).<span style="color:#a6e22e">type</span>(<span style="color:#e6db74">'todo A{enter}'</span>).<span style="color:#a6e22e">type</span>(<span style="color:#e6db74">'todo B{enter}'</span>);
        cy.<span style="color:#a6e22e">get</span>(<span style="color:#e6db74">'.todo-list li'</span>)
        .<span style="color:#a6e22e">should</span>(<span style="color:#e6db74">'have.length'</span>,<span style="color:#ae81ff">4</span>)
        .<span style="color:#a6e22e">and</span>((<span style="color:#f8f8f2">$li</span>) => {
            <span style="color:#a6e22e">expect</span>($li.<span style="color:#a6e22e">get</span>(<span style="color:#ae81ff">2</span>).textContent,<span style="color:#e6db74">'first item'</span>).to.<span style="color:#a6e22e">equal</span>(<span style="color:#e6db74">'toda A'</span>)
            <span style="color:#a6e22e">expect</span>($li.<span style="color:#a6e22e">get</span>(<span style="color:#ae81ff">3</span>).textContent,<span style="color:#e6db74">'second item'</span>).to.<span style="color:#a6e22e">equal</span>(<span style="color:#e6db74">'todo B'</span>)
           });
    });
});
</code></span></span>

    以上代码,设置访问网站的超时时间为1s,运行结果如下所示:

1.2.3.3.2 禁用重试

 如果将超时时间设置为0,其本质上是禁用重试机制,示例如下所示:

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-javascript">cy.<span style="color:#a6e22e">get</span>(<span style="color:#e6db74">'.new-todo'</span>,,{<span style="color:#f92672">timeout</span>:<span style="color:#ae81ff">0</span>}).<span style="color:#a6e22e">type</span>(<span style="color:#e6db74">'todo A{enter}'</span>).<span style="color:#a6e22e">type</span>(<span style="color:#e6db74">'todo B{enter}'</span>);</code></span></span>

在这我为大家准备了一份软件测试视频教程(含面试、接口、自动化、性能测试等),就在下方,需要的可以直接去观看,也可以直接【点击文末小卡片免费领取资料文档】

【2024最新版】Python自动化测试15天从入门到精通,10个项目实战,允许白嫖。。。

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

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

相关文章

Gunicorn性能优化:提升Python Web应用的服务效率

在Python Web开发中&#xff0c;Gunicorn作为WSGI HTTP服务器&#xff0c;常常作为Web应用&#xff08;如Django或Flask&#xff09;与反向代理或负载均衡器之间的桥梁。为了充分发挥其性能&#xff0c;本文将提供一些实用的Gunicorn配置建议。 Gunicorn架构 Gunicorn采用了预…

hcip---ospf综合实验

一&#xff1a;实验要求 1、R4为ISP&#xff0c;其上只能配置IP地址&#xff0c;R4与其所有直连设备间均使用公有IP 2、R3-R5/6/7为MGRE环境&#xff0c;R3为中心站点 3、整个OSPF环境IP基于R4的环回 4、所有设备均可访问R4的环回 5、减少LSA的更新量&#xff0c;加快收敛…

Prometheus配置与管理

1 配置文件 Prometheus通过命令行和配置文件进行配置&#xff0c;命令行配置不能修改的系统参数&#xff08;例如存储位置&#xff0c;要保留在磁盘和内存中的数据量等&#xff09;&#xff0c;但配置文件定义了与抓取作业及其实例相关的所有内容&#xff0c;以及哪些规则文件…

orcad原理图按页码标注器件位号-allegro

rCAD多页原理图器件按页编号的设置方法 OrCAD Capture作为当今世界最流行的原理图输入工具&#xff0c;它具有简单直观的用户设计界面。orCAD Capture提供层次式电路和平坦式电路两种原理图绘制方式&#xff0c;设计师可以更快、更简捷、更直观地完成原理图设计与绘制。但随着电…

SELINUX导致的网络服务问题解决

第一&#xff1a;开启相关服务&#xff0c;监控SELINUX 相关服务&#xff1a;setroubleshoot,auditd,大多数都是以se开头的 如果没有此服务&#xff0c;先yum下&#xff0c;然后查看状态 这里关于auditd说明&#xff0c;centos7不可以用systemctl重启auditd服务&#xff0c;…

使用PowerBI 基于Adventure Works案例分析

Adventure Works案例分析 前言 数据时代来临&#xff0c;但一个人要顺应时代的发展是真理。 数据分析的核心要素 那数分到底是什么&#xff1f; 显然DT 并不等同于 IT&#xff0c;我们需要的不仅仅是更快的服务器、更多的数据、更好用的工具。这些都是重要的组成部分&…

我在代码随想录|写代码Day20之二叉树-700. 二叉搜索树中的搜索,98. 验证二叉搜索树,530.二叉搜索树的最小绝对差

学习目标&#xff1a; 博主介绍: 27dCnc 专题 : 数据结构帮助小白快速入门 &#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d; ☆*: .&#xff61;. o(≧▽≦)…

springboot整合日志处理Logback

引言 ​ springboot框架 集成日志 logback 日志 ​ Logback是由log4j创始人设计的又一个开源日志组件。目前&#xff0c;logback分为三个模块&#xff1a;logback-core&#xff0c;logback-classic和logback-access。是对log4j日志展示进一步改进! 日志的级别 All < Trace…

秋招面试—CSS篇

2021 CSS面试题 1.CSS可继承属性有哪些&#xff1f; 文字相关&#xff1a;font-famliy 、font-weight 、font-size 、font-style文本相关&#xff1a;text-indent&#xff08;首行缩进&#xff09; 、text-align&#xff08;水平对齐&#xff09; 、line-height 、text-trans…

[RK-Linux] 移植Linux-5.10到RK3399(十一)| 检查Nor FLASH(XM25QH128A)配置

ROC-RK3399-PC Pro 使用 SPI1 与 XM25QH128A FLASH芯片进行通讯: SPI1 网络: SPI 控制器介绍: SPI 是一种高速、全双工、同步的串行通信接口。在 RK3399 上,SPI 接口通常用于连接外部设备,如闪存、传感器或其他需要高速数据传输的设备。RK3399 提供了多个 SPI 主控接口,每…

Java核心卷一笔记03

C++ Virtual 是含义及使用 在 C++ 中,virtual 是一个关键字,用于声明虚函数。虚函数是一种特殊的成员函数,它允许在派生类中重写基类中的同名函数,并通过基类指针或引用调用派生类中的函数。 使用 virtual 关键字声明的函数被称为虚函数。在基类中声明虚函数时,可以使用…

OpenCV 8 - 模糊处理(均值滤波,高斯滤波,中值滤波,双边滤波)

模糊处理原理: Blur是图像处理中最简单和常用的操作之一,使用该操作的原因为了给图像预处理时候减低噪声使用,Blur操作其背后是数学的卷积计算, 通常这些卷积算子计算都是线性操作,所以又出线性虑波。 假设有6x6的图像像素点矩阵。卷积过程:6x6上面是个3x3的窗口,从左向右,…

【开源】SpringBoot框架开发天然气工程业务管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四、数据库设计4.1 用户表4.2 分公司表4.3 角色表4.4 数据字典表4.5 工程项目表4.6 使用材料表4.7 使用材料领用表4.8 整体E-R图 五、系统展示六、核心代码6.1 查询工程项目6.2 工程物资…

C语言——文件操作(看这一篇就够了)

1、为什么使用文件&#xff1f; 我们前面学习结构体&#xff0c;在写通讯录的时候会发现一个问题&#xff0c;我们向通讯录里面录入数据&#xff0c;当程序退出的时候&#xff0c;记录的数据也随之没有了&#xff0c;等下次我们在再调用通讯录时&#xff0c;又得重新录入数据&…

【保驾护航】HarmonyOS应用开发者基础认证-题库-2024

通过系统化的课程学习&#xff0c;熟练掌握DevEco Studio&#xff0c;ArkTS&#xff0c;ArkUI&#xff0c;预览器&#xff0c;模拟器&#xff0c;SDK等HarmonyOS应用开发的关键概念&#xff0c;具备基础的应用开发能力。 考试说明 1、考试需实名认证&#xff0c;请在考前于个…

【Java反序列化】Shiro-550漏洞分析笔记

目录 前言 一、漏洞原理 二、Shiro环境搭建 三、Shiro-550漏洞分析 解密分析 加密分析 四、URLDNS 链 前言 shiro-550反序列化漏洞大约在2016年就被披露了&#xff0c;在上学时期也分析过&#xff0c;最近在学CC链时有用到这个漏洞&#xff0c;重新分析下并做个笔记&…

basicPython-1

元组 """ 目录: 1.创建元组 2.元组的拼接 3.元组的解压赋值 4.元组的切片 5.元组的元素的索引 6.元组的嵌套 7.统计某个元素的个数 """"""创建元组(元组不可变)""" # 1.强制:tuple() # 2.普通 tuple_0 (1,) tup…

无人机路径优化(八):五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划(提供MATLAB代码)

一、五种算法&#xff08;DBO、LO、SWO、COA、GRO&#xff09;简介 1、蜣螂优化算法DBO 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为的启发…

抵御.360勒索病毒威胁:解密文件的有效方法与预防措施

导言&#xff1a; 近来&#xff0c;网络犯罪的一种新型形式——.360勒索病毒&#xff0c;备受关注。这种病毒通过加密用户文件&#xff0c;要求支付赎金以获取解密密钥。本文91数据恢复将深入介绍.360勒索病毒的特点&#xff0c;同时提供一些有效的恢复方法&#xff0c;并分享…

沁恒微WCH32V003定时器中断

最近在做一个项目&#xff0c;用到的主控芯片是沁恒微的WCH32v003&#xff0c;其中一个功能是定时器中断&#xff0c;在编写代码的时候想找官方的库函数文件&#xff0c;但是找了很久都没有找到&#xff0c;官网只有一个数据手册和应用手册&#xff0c;而应用手册一般是分为库函…