HttpRunner 3.x接口自动化: 全面讲解如何落地实战

2023-11-17

今天,我们来一起学习下HttpRunner3。主要讲解如何使用、应用技巧、基本知识点总结和需要注意事项。一篇文章没法面面俱到,如果有重要的地方没写到,可以给我留言,咱们接着补充。

整体概览

概述介绍

HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。

官方文档

文档中的内容更详细,使用过程遇到问题多来看看吧。

https://github.com/httprunner/httprunner
https://httprunner.com/httprunner/

大佬翻译的版本:

https://ontheway-cool.gitee.io/httprunner3doc_cn/

设计理念

相比于其它 API 测试工具,HttpRunner 最大的不同在于设计理念。
约定大于配置:测试用例是标准结构化的,格式统一,方便协作和维护
充分复用优秀的开源项目,不追求重复造轮子,而是将强大的轮子组装成战车
追求投入产出比,一份投入即可实现多种测试需求

关键特性

✅ Inherit all powerful features of [ requests][requests], just have fun to handle HTTP(S) in human way.
✅ Define testcase in YAML or JSON format, run with [ pytest][pytest] in concise and elegant manner.
✅ Record and generate testcases with [ HAR][HAR] support.
✅ Supports variables/ extract/ validate/ hooks mechanisms to create extremely complex test scenarios.
✅ With debugtalk.py plugin, any function can be used in any part of your testcase.
✅ With [ jmespath][jmespath], extract and validate json response has never been easier.
✅ With [ pytest][pytest], hundreds of plugins are readily available.
✅ With [ allure][allure], test report can be pretty nice and powerful.
✅ With reuse of [ locust][locust], you can run performance test without extra work.
✅ CLI command supported, perfect combination with CI/CD.

简单的总结下:

  1. HttpRunner继承了所有requests的强大功能,可以用YAML或JSON格式编写测试用例,以pytest方式运行。

  1. 支持HAR 格式的录制文件生成测试用例,支持variables/ extract/ validate/hooks机制,能够创建非常复杂的测试方案。

  1. 可以借助debugtalk.py强大的插件功能助力编写测试用例,提取和验证json响应使用jmespath

核心概念

测试用例(testcase)应该是完整且独立的,每条测试用例应该是都可以独立运行的
测试用例是测试步骤(teststep)的 有序 集合,每一个测试步骤对应一个 API 的请求描述
测试用例集(testsuite)是测试用例的 无序 集合,集合中的测试用例应该都是相互独立,不存在先后依赖关系的;如果确实存在先后依赖关系,那就需要在测试用例中完成依赖的处理

测试步骤(teststep)

测试用例是测试步骤的 有序 集合,而对于接口测试来说,每一个测试步骤应该就对应一个 API 的请求描述。

测试用例(TestCase)

从 2.0 版本开始,HttpRunner 开始对测试用例的定义进行进一步的明确:
一条测试用例(testcase)应该是为了测试某个特定的功能逻辑而精心设计的,并且至少包含如下几点:
明确的输入(inputs)
明确的运行环境(execution conditions)
明确的测试步骤描述(testing procedure)
明确的预期结果(expected results)
对应地,HttpRunner 的测试用例描述方式进行如下设计:
测试用例应该是完整且独立的,每条测试用例应该是都可以独立运行的
在 HttpRunner 中,每个 YAML/JSON/pytest/go test 文件对应一条测试用例
HttpRunner 以 TestCase 为核心,将任意测试场景抽象为 有序步骤的集合
包含且仅有两部分:
Config:测试用例的公共配置部分,包括用例名称、base_url、参数化数据源、是否开启 SSL 校验等
TestSteps:有序步骤的集合;采用了 go interface 的设计理念,支持进行任意协议和测试类型的拓展;步骤内容统一在 Run 方法中进行实现。

测试用例集(testsuite)

测试用例集 是 测试用例 的 无序 集合,集合中的测试用例应该都是相互独立,不存在先后依赖关系的。

测试场景

测试场景 和 测试用例集 是同一概念,都是 测试用例 的 无序 集合。
接口
测试用例集
参数
变量
测试脚本(YAML/JSON)
debugtalk.py
环境变量

项目根目录

项目根目录以 debugtalk.py为锚, 测试用例中的相对路径(例如引用测试用例或CSV文件)都基于此根路径。

变量优先级

理解起来就是:局部优先于全局,离得越近,越优先。

测试用例变量(testcase variables) > export variables > testsuite config variables > 被引用用例配置变量(referenced testcase config variables)
优先级可能会令人困惑。 避免混淆的最好方法是使用不同的变量名。 但是,如果必须使用相同的变量名,则应该了解优先级策略。

版本对比

注意点:

Httprunner2 的用例目录是三级:api/case/suitHttprunner3 的用例目录是:case/suit,但是生成的目录没有suit,需要的可以自己加。你可以将API定义为只有一个请求步骤的测试用例。


环境准备

测试环境python3.9,httprunner版本为3.1.11

安装指定版本

如果不指定版本号,默认会安装最新的4+版本。

安装

pip install httprunner==3.1.11

验证

httprunner -Vhrun -V

查看帮助信息

httprunner -h
usage: httprunner [-h] [-V] {run,startproject,har2case,make} ...One-stop solution for HTTP(S) testing.positional arguments:  {run,startproject,har2case,make}                        sub-command help    run                 Make HttpRunner testcases and run with pytest.    startproject        Create a new project with template structure.    har2case            Convert HAR(HTTP Archive) to YAML/JSON testcases for                        HttpRunner.    make                Convert YAML/JSON testcases to pytest cases.optional arguments:  -h, --help            show this help message and exit  -V, --version         show version

脚手架建项目

httprunner  startproject  HttpRunnerThreeDemo

目录说明

debugtalk.py(可选):存储项目中逻辑运算辅助函数
该文件存在时,将作为项目根目录定位标记,其所在目录即被视为项目工程根目录
该文件不存在时,运行测试的所在路径(CWD)将被视为项目工程根目录
测试用例文件中的相对路径(例如.csv)均需基于项目工程根目录
运行测试后,测试报告文件夹(reports)会生成在项目工程根目录
YAML/JSON/Python(必须):测试用例文件,存储接口测试相关信息
.env(可选):存储项目环境变量,通常用于存储项目敏感信息
reports:默认生成测试报告的存储文件夹
testcases: 测试用例存放目录
har 可以存放录制导出的文件

演练网站

本次依旧使用pity作为我们的测试网站,建议优先本地部署,方便调试以及后续的各种练习。用例中的接口我们采用F12的方式获得。

pity是一款专注于api自动化的工具,采用Python+FastApi+React开发。

项目实战

HttpRunner-小试牛刀

编写用例

# demo_testcase_login_test.py
config:    
  name: "request methods testcase: reference testcase"
teststeps:    
   - name: pity登录        
      request:            
           url: http://127.0.0.1:7777/auth/login            
           method: POST            
           headers:  Content-Type: "application/json"            
           json:                  
           "username": "tester"                  
           "password": "tester"        
      extract:            
           - code: "json.code"        
      validate:           
          - eq: ["$code", 0]

运行用例

hrun  demo_testcase_login.yml

通过上面,我们看到httprunner执行用例的时候会先生成py文件的测试用例,再以 pytest的方式运行测试用例。

生成用例

执行完 yml文件会自动生成 py文件的用例。
# NOTE: Generated By HttpRunner v3.1.11# FROM: testcases/demo_testcase_login.ymlfrom httprunner import HttpRunner, Config, Step, RunRequest, RunTestCaseclass TestCaseDemoTestcaseLogin(HttpRunner):    
config = Config("request methods testcase: reference testcase")    
teststeps = [        Step(            RunRequest("pity登录")            .post("http://127.0.0.1:7777/auth/login")            .with_headers(**{"Content-Type": "application/json"})            .with_json({"username": "tester", "password": "tester"})            .extract()            .with_jmespath("body.code", "code")            .validate()            .assert_equal("$code", 0)        ),    ]
  if __name__ == "__main__":    TestCaseDemoTestcaseLogin().test_start()

同样的,我们可以直接执行刚刚生成的.py用例:

python demo_testcase_login_test.py 

HttpRunner-用例转换

以后会搞个小小的专题,专门分析一下市面上的用例录制,转换,回放等工具的用法及对比,敬请期待。

HttpRunner-数据驱动

用例优先级遵循如下规则:
step variables > extracted variables, e.g. step 2, varA="step2A"
parameter variables > config variables, e.g. step 1, varB="paramB1"
extracted variables > parameter variables > config variables, e.g. step 2, varB="extractVarB"
config variables are in the lowest priority, e.g. step 1/2, varC="configC"

【注】step-步骤,parameter-参数,valuables-全局定义的。

config:    
   name: xxx    
   variables:              # config variables       
      varA: "configA"        
      varB: "configB"        
      varC: "configC"    
   parameters:             # parameter variables        
      varA: ["paramA1"]        
      varB: ["paramB1"]
teststeps:
    -    name: step 1    
         variables:              # step variables        
              varA: "step1A"    
         request:        
              url: /$varA/$varB/$varC # varA="step1A", varB="paramB1", varC="configC"        
              method: GET    
          extract:                # extracted variables        
              varA: body.data.A   # suppose varA="extractVarA"        
               varB: body.data.B   # suppose varB="extractVarB"
     -    name: step 2    
           varialbes:        
               varA: "step2A"    
           request:        
               url: /$varA/$varB/$varC # varA="step2A", varB="extractVarB", varC="configC"        
           method: GET

下面对上面的参数化方式进行举例,验证(为了讲解方便,未使用环境变量的参数化方式)。

HttpRunner-参数化1

configvariables中编写测试数据,测试步骤中引用。

编写用例

config:    name: "request methods testcase: params testcase"    base_url: http://127.0.0.1:7777    variables:              username: "tester"              password: "tester"teststeps:    -        name: pity登录        request:            url: /auth/login            method: POST            headers:                Content-Type: "application/json"            json:                  "username": $username                  "password": $password        extract:            - code: "json.code"        validate:           - eq: ["$code", 0]

运行用例

hrun  hr_params/demo_testcase_login_params.yml

生成用例

执行完 yml文件会自动生成 py文件的用例。
# NOTE: Generated By HttpRunner v3.1.11# FROM: testcases/hr_params/demo_testcase_login_params.yml
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCaseclass TestCaseDemoTestcaseLoginParams(HttpRunner):    
config = (        Config("request methods testcase: params testcase")        .variables(**{"username": "tester", "password": "tester"})        .base_url("http://127.0.0.1:7777")    )    teststeps = [        Step(            RunRequest("pity登录")            .post("/auth/login")            .with_headers(**{"Content-Type": "application/json"})            .with_json({"username": "$username", "password": "$password"})            .extract()            .with_jmespath("body.code", "code")            .validate()            .assert_equal("$code", 0)        ),    ]if __name__ == "__main__":    TestCaseDemoTestcaseLoginParams().test_start()

HttpRunner-参数化2

conifg parametersteststepsvariables 中使用变量的情况。

编写用例

config:    name: "request methods testcase: params testcase"    base_url: ${ENV(BASE_URL)}#    variables:#              username: "tester"#              password: "tester"    parameters:        username-password:            - [ "tester","tester" ]teststeps:    -        name: pity登录        request:            url: /auth/login            method: POST            headers:                Content-Type: "application/json"            json:                  "username": $username                  "password": $password        extract:            - code: "json.code"        validate:           - eq: ["$code", 0]
#.envUSERNAME=leoleePASSWORD=123456BASE_URL=http://127.0.0.1:7777

运行用例

加上-s打印的信息更全面。

 hrun demo_testcase_login_params_parameters.yml  -s

生成用例

执行完 yml文件会自动生成 py文件的用例。
# NOTE: Generated By HttpRunner v3.1.11# FROM: testcases/hr_params/demo_testcase_login_params_parameters.ymlimport pytestfrom httprunner import Parametersfrom httprunner import HttpRunner, Config, Step, RunRequest, RunTestCaseclass TestCaseDemoTestcaseLoginParamsParameters(HttpRunner):    @pytest.mark.parametrize(        "param", Parameters({"username-password": [["tester", "tester"]]})    )    def test_start(self, param):        super().test_start(param)    config = Config("request methods testcase: params testcase").base_url(        "${ENV(BASE_URL)}"    )    teststeps = [        Step(            RunRequest("pity登录")            .post("/auth/login")            .with_headers(**{"Content-Type": "application/json"})            .with_json({"username": "$username", "password": "$password"})            .extract()            .with_jmespath("body.code", "code")            .validate()            .assert_equal("$code", 0)        ),    ]if __name__ == "__main__":    TestCaseDemoTestcaseLoginParamsParameters().test_start()

HttpRunner-参数化3

登录---增加项目---查询项目,一个复杂点的例子。
step variables ,extract variables,parameter variables ,config variables变量优先级使用情况。大家可以将本例中的参数随意更改,亲手验证。
经过思考,我认为我们可以选择一种适合自己的方式进行参数化。实际过程中也就调试的时候会将值写死在步骤中。为了方便,建议是最好写在 config中,其中写到 parameters最合适不过了,这样省去了后续数据驱动的麻烦。

编写用例

config:    name: "request methods testcase: params testcase"    base_url: http://192.168.0.123:7777  # 本机的pity不工作了,赶紧换了个电脑,大佬们看到了可以改成自己的IP哦--彩蛋。#    variables:#         username: "tester_config_var1"#         password: "tester_config_var1"    parameters:            username-password-name-app:              - ["tester","tester","aa","aa"]teststeps:    -        name: pity登录        request:            url: /auth/login            method: POST            headers:                Content-Type: "application/json"            json:                  "username": $username                  "password": $password        extract:            - code: "json.code"            - token: body.data.token        validate:           - eq: ["$code", 0]    -        name: 创建项目        request:          url: /project/insert          method: POST          headers:            Content-Type: "application/json"            token: "$token"          json:              {"name": "${name}","app":"${app}","owner":2,"private":false}        extract:          - code: "json.code"   ## 提取到的变量,我们后面涉及到关联的再介绍它        validate:          - eq: [ "$code", 0 ]    -        name: 查询项目信息        request:            url: /project/list            method: GET            headers:                Content-Type: "application/json"                token: "$token"            params:                page: 1                size: 8        extract:            - code: "json.code"            - name: "json.data[0].name"        validate:            - eq: ["$code", 0]            - eq: ["$name", "${name}"]

运行用例

 hrun  create_project_params_parameters.yml

生成用例

执行完 yml文件会自动生成 py文件的用例。
# NOTE: Generated By HttpRunner v3.1.11# FROM: testcases/hr_params2/create_project_params_parameters.ymlimport pytestfrom httprunner import Parametersfrom httprunner import HttpRunner, Config, Step, RunRequest, RunTestCaseclass TestCaseCreateProjectParamsParameters(HttpRunner):    @pytest.mark.parametrize(        "param",        Parameters({"username-password-name-app": [["tester", "tester", "aa", "aa"]]}),    )    def test_start(self, param):        super().test_start(param)    config = Config("request methods testcase: params testcase").base_url(        "http://192.168.0.123:7777"    )    teststeps = [        Step(            RunRequest("pity登录")            .post("/auth/login")            .with_headers(**{"Content-Type": "application/json"})            .with_json({"username": "$username", "password": "$password"})            .extract()            .with_jmespath("body.code", "code")            .with_jmespath("body.data.token", "token")            .validate()            .assert_equal("$code", 0)        ),        Step(            RunRequest("创建项目")            .post("/project/insert")            .with_headers(**{"Content-Type": "application/json", "token": "$token"})            .with_json(                {"name": "${name}", "app": "${app}", "owner": 2, "private": False}            )            .extract()            .with_jmespath("body.code", "code")            .validate()            .assert_equal("$code", 0)        ),        Step(            RunRequest("查询项目信息")            .get("/project/list")            .with_params(**{"page": 1, "size": 8})            .with_headers(**{"Content-Type": "application/json", "token": "$token"})            .extract()            .with_jmespath("body.code", "code")            .with_jmespath("body.data[0].name", "name")            .validate()            .assert_equal("$code", 0)            .assert_equal("$name", "${name}")        ),    ]if __name__ == "__main__":    TestCaseCreateProjectParamsParameters().test_start()

创建成功

HttpRunner-参数化4

hrun  create_project_params_debugtalk.yml

debugtalk.py中参数化,详见后面的代码地址,这里不再展示。

注意:

step中不支持从debugtalk中读取函数返回值。

小小的总结一下下

配置变量(config variables):用于数据解藕:字典类型,定义在config或者teststep中。

参数变量(parameter variables):用户参数化,列表类型,定义在config

HttpRunner-testsuit使用

编写用例

config:    name: "demo testsuite"testcases:    -        name: "suitdemo"        testcase: hr_params2/create_project_params_debugtalk.yml  #以源码为准,路径太长,我这里写不下了。

运行用例

hrun create_project_testsuit.yml

生成报告

hrun  create_project_testsuit.yml  --html=report/report.html

关于用例套件也涉及到变量的问题,此处只给出结论,以后再讲吧,写不动了。

测试用例变量(testcase variables) > export variables > testsuite config variables > 被引用用例配置变量(referenced testcase config variables)
config:    name: xxx    variables:                  # testsuite config variables        varA: "configA"        varB: "configB"        varC: "configC"testcases:-    name: case 1    variables:                  # testcase variables        varA: "case1A"    testcase: /path/to/testcase1    export: ["varA", "varB"]    # export variables-    name: case 2    varialbes:                  # testcase variables        varA: "case2A"    testcase: /path/to/testcase2

HttpRunner-hooks机制

牛刀小试

编写用例

config:    name: "request methods testcase: params testcase"    base_url: http://192.168.0.123:7777  # 本机的pity不工作了,赶紧换了个电脑,大佬们看到了可以改成自己的IP哦--彩蛋    variables:         username: "tester"         password: "tester"teststeps:    -        name: pity登录        request:            url: /auth/login            method: POST            headers:                Content-Type: "application/json"            json:                  "username": $username                  "password": $password        extract:            - code: "json.code"            - token: body.data.token        validate:           - eq: ["$code", 0]    -        name: 创建项目        setup_hooks:            - ${hook_before_add($request)}        teardown_hooks:            - ${hook_after_teardown($response)}        request:          url: /project/insert          method: POST          headers:            Content-Type: "application/json"            token: "$token"          data:              {"name": "aaa","app":"aaa","owner":2,"private":false}        extract:          - code: "json.code"   ## 提取到的变量,我们后面涉及到关联的再介绍它        validate:          - eq: [ "$code", 0 ]
# debugtalk.pydef hook_before_add(request):    print("====")    print(request)    data={}    data['name']="bbb"    data['app']="bbb"    data['owner']=2    data['private']=False    request['data']=json.dumps(data)def hook_after_teardown(response):    print("==========")    print(response.json)

运行用例

hrun create_project_hooks.yml  -s

创建成功

成功的将用例中的项目由aaa修改为bbb,说明我们的hook调用成功了。

文章源码

https://gitee.com/rdtest/code2022/tree/master/HttpRunnerThreeDemo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HttpRunner 3.x接口自动化: 全面讲解如何落地实战 的相关文章

  • 【100%通过率 】华为OD真题c++/python 【羊、狼、农夫过河】【 2022 Q4

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 羊 狼 农夫都在岸边 农夫有一艘容量固定的船 要求求出不损失羊情况下将全部羊和狼运到对岸需要的次数 农夫在或农夫离开后羊的数量大于狼的数量时狼不
  • 2023.02

    2023 02 01 将mpu写到dxReagion中的数据打印到文件中 调试解决mpu2ipu和ipu2mpu同时跑线程未关掉导致的异常 2023 02 02 学习2102 spec文档和mpu设计文档 将mpuipu测试用例加到回归测试
  • 漫谈软件测试工程师与mercury认证

    漫谈软件测试工程师与mercury认证 出自无忧网 作者 叶赫华 sinckyzhang hotmail com 自从本人从事软件测试培训以来 接触了太多的软件测试工程师 发觉从业者多数存在以下现象 刚刚毕业 踏入IT行业 不懂开发或开发经
  • VisualStudio—Remote Debug

    主要用来解决本地调试没问题发布到远端后却报错的项目 一 Windows Debug Windows 本文叙述采用的VS2022 远端 windows服务器 安装远程调试器 远端 windows服务器 安装过程省略 详见官方参考链接中设置远程
  • 下面是两种解决Redis击穿问题的方法,并给出相应的Java代码实现。

    Redis击穿问题指的是当一个key在缓存中过期时 恰好有大量并发请求访问该key 导致请求直接打到数据库 引起数据库压力过大 甚至宕机 方法一 使用互斥锁 在访问缓存之前 首先获取一个互斥锁 防止多个请求同时访问数据库 只有一个请求可以访
  • 数字后端知识点扫盲——后端设计流程及使用工具

    1 DFT Design For Test 可测性设计 芯片每一步往往都自带测试电路 DFT的目的就是在设计的时候就考虑将来的测试 DFT的常见方法是 在设计中插入scan chain 将非扫描单元 如寄存器 变为扫描单元 DFT工具是sy
  • 组合测试方法PK正交分析方法

    测试过程中 我们经常遇到需要覆盖多个变化参数的测试场景 如我们测试BS配置控制客户端组织资源远程配置一个设备时 进行一个设备通道视频参数设置的各种组合测试 如下图 多数情况下 类似于这种多组合测试时 老员工则是依靠经验去进行有针对性的测试
  • 【计算机基础

    定点数的表示 定点数 小数点的位置固定 例 996 007 常规计数 浮点数 小数点的位置不固定 例 9 96007 10 2 科学计数法 二进制的定点数 浮点数也类似 无符号数 整个机器字长的全部二进制位均为数值位 没有符号位 相当于数的
  • macOS M2使用conda配置pytorch环境

    一 conda 首先我们需要有conda miniconda的安装配置流程可以看这个http t csdn cn ShcNb 二 进入官网 https pytorch org 选择对应的版本 复制下面的命令 conda install py
  • 【NLP】第 6 章 :微调预训练模型

    到目前为止 我们已经了解了如何使用包含预训练模型的huggingface API 来创建简单的应用程序 如果您可以从头开始并仅使用您自己的数据来训练您自己的模型 那不是很棒吗 如果您没有大量空闲时间或计算资源可供使用 那么使用迁移学习 是最
  • 【ffmpeg基础】ffmpeg音频编码

    一 aac编码 输入raw音频编码为AAC ffmpeg i input wav acodec aac y input aac 通过 acodec来指定音频编码器 视频编码器为 vcodec 也可以使用 c a来指定音频编码器 ffmpeg
  • 描述性能测试工作中的完整过程?

    有简单接触 采用的工具是Jmeter 进行轻量级的压力测试 1 确定好压力测试的功能模块 首先用Jmeter录制脚本 然后对脚本进行优化 2 对一些数据进行参数化 利用CSV导入存在txt文档里面的数据 3 设计测试场景 4 执行压力测试
  • 【CV with Pytorch】第 7 章 :图像异常检测

    机器学习的研究使我们进入了研究各种模式和行为的过程 它使我们能够构建可以研究封闭环境的模型 预测能力通常遵循模型训练过程 这是我们在训练模型时需要经常问的一个重要问题 还有另一个问题需要回答 多少数据足以帮助模型理解分布 以便我们有一个好的
  • 如何做自动化测试

    这个话题比较大 相信大家也都有自己的想法 我在这里写一些我自己的看法 请大家指教 什么叫做自动化测试工程师 首先 会使用自动化测试工具的测试人员不能够称之为完全的自动化测试人员 这类测试人员被称为 工具小子 Script Kid 这个阶段还
  • 使用SpringSecurity

    前几天写了一个SpringBoot对拦截器的使用 在实际项目中 对一些情况需要做一些安全验证 比如在没有登录的情况下访问特定的页面应该解释的拦截处理 这一篇介绍使用SpringSecurity来做简单的安全控制 由于SpringSecuri
  • 软件测试 app自动化02 Appium常用的元素定位工具 元素的属性 元素定位方法

    文章目录 1 Appium常用的元素定位工具 1 1 uiautomatorviewer 1 2 Appium Inspector 1 3 Weditor 2 元素的属性 3 元素定位方法 小结 1 Appium常用的元素定位工具 1 1
  • 网管员牢记 10种较为常见的服务器管理错误

    网管员牢记 10种较为常见的服务器管理错误 网络管理阶层的工作就是保证网络的正常工作 从而使得职工们的工作不被打断 可问题在于事物并非总是按照理想状况发展 事实上经常会出现平地起风波的状况 其间有许多原因 这里我们只讨论10种较为常见的网管
  • 008-黑盒测试和白盒测试的优缺点

    黑盒测试和白盒测试的优缺点 黑盒测试的优点有 比较简单 不需要了解程序内部的代码及实现 与软件的内部实现无关 从用户角度出发 能很容易的知道用户会用到哪些功能 会遇到哪些问题 基于软件开发文档 所以也能知道软件实现了文档中的哪些功能 在做软
  • 如何从零开始搭建公司自动化测试框架?

    搭建的自动化测试框架要包括API测试 UI测试 APP测试三类 以上三类其实可以简化为两类 那就是 1 接口自动化测试框架搭建 2 UI自动化测试框架搭建 没问题 安排 且是手把手教你如何搭建以上两类自动化测试框架 回到这篇主题 刷到这个问
  • ASTM D6147测定压缩情况下硫化橡胶和热塑弹性体作用力衰减 (应力松弛) 的标准试验方法

    标准名称 ASTM D6147 Standard Test Method for Vulcanized Rubber and Thermoplastic Elastomer Determination of Force Decay Stre

随机推荐

  • 西瓜小说(安卓)

    软件名叫西瓜阅读 是吾爱上的大佬根据开源阅读APP魔改之后的版本 内置了超多书源 大家下载安装直接使用 无需再进行任何其他额外的一些操作或者设置 作者魔改之后还给软件添加了推荐 榜单 书架之类的一些很不错的界面 大家都知道 阅读APP最大的
  • SpringCluod深入教程

    1 Nacos配置管理 Nacos除了可以做注册中心 同样可以做配置管理来使用 1 1 统一配置管理 当微服务部署的实例越来越多 达到数十 数百时 逐个修改微服务配置就会让人抓狂 而且很容易出错 我们需要一种统一配置管理方案 可以集中管理所
  • DeFi终极指南【以太坊去中心化金融】

    DeFi De centralized Fi nance 即去中心化金融 是2019年区块链应用发展最迅猛的一个领域 在以太坊区块链上那些最成功的DApp 例如MakerDAO DAI Compound 0x以及下面我们要介绍的那些 其目标
  • 关于matlab中矩阵取值的方法

    在matlab中 取出矩阵中某一个值的方法如下 1 对于二维数组 a i j 表示取出二维数组a的第 i 行 第 j 列的数据 a j 表示取出二维数组a的第 j 列的所有数据 a i 表示取出二维数组a的第 i 行的所有数据 2 多维数组
  • Aviator 表达式的使用

    1 使用Aviator 需要导入包
  • 计算机视觉人体骨骼点动作识别-1.训练自己的关键点检测模型

    人体关键点检测算法 关键点并不特指人体骨骼关键点 还有人脸关键点 物体的关键点 其中人体的关键点 也叫作pose Estimation 是最热门 也是最有难度 应用最广的 应用可以包括 行为识别 人机交互 智能家居 虚拟现实 具体细分下来可
  • USB之基础知识

    1 USB概述 USB Universal Serial Bus 通用串行总线 是一个外部总线标准 用于规范电脑与外部设备的连接和通讯 USB接口支持设备的即插即用和热插拔功能 USB接口有4个pin脚 分别为VCC GND Data Da
  • 通过tomcat.mamager页面远程管理tomcat

    通过java访问tomcat的manager来管理 此方法无法达到重启tomcat的目的 只能重启应用 先在tomcat中修改tomcat users xml
  • 嵌入式Linux编译系统的设计——Bootloader, 内核,驱动,文件系统,升级镜像等自动化编译打包

    项目简介 嵌入式系统的开发过程较为复杂 编译 裁剪 定制等如果没有一套规范的流程将会难于管理和控制 本项目的目的是设计一个嵌入式Linux编译系统 实现代码的编译 定制和裁剪 Bootloader 内核 驱动 文件系统 升级镜像等都可以自动
  • 前端将静态页面放在移动端上,查看效果

    想要将本地刚写完的静态HTML文件 放在移动端上查看 不是放在浏览器中 打开移动端模式 需要进行一下步骤 1 全局安装 node 具体步骤看官网 2 在全局运行 cmd 输入 npm install anywhere g 3 打开静态资源
  • 前端例程20220920:纯CSS图片自动轮播效果

    演示 原理 代码
  • tp5实现短信注册,调用第三方接口,电话通知,和短信通知都可以。

    thinkphp5实现短线验证注册 思路 1 一个表单 表单中要有一个手机字段 和密码 2 在提交验证码添加点击事件 触发ajax 请求后台 发送短信 3 后台中编写控制器方法 一个ajax请求发送短信 一个表单验证成功条页面 4 在con
  • OpenCV copyTo操作会覆盖原数据

    前言 有一些指导说copyTo只会覆盖对应区域 这边做了一个测试 测试 测试代码 int main Mat photo1 imread home evening 桌面 5 png if photo1 data cout lt lt erro
  • Your account has been blocked. git更新代码时报错

    记录一下问题 原因解释 当前用户登录信息过期 在浏览器里登录gitlab后台 长时间没有重新登录 导致后端登录session失效 自动锁住用户账号 此时通过ssh下载也就无法更新代码 解决办法 在浏览器重新登录gitlab网站 然后重新更新
  • 【tomcat】应用服务

    准备环境 三台虚拟机 192 168 1 120 192 168 1 122 192 168 1 131 三台虚拟机关闭防火墙 查看光盘 检测yun创库 查看JDK是否安装 root localhost java version openj
  • 蓝桥杯 - 负载均衡

    输入样例 2 6 5 5 1 1 5 3 2 2 2 6 3 1 2 3 4 1 6 1 5 1 3 3 6 1 3 4 输出样例 2 1 1 1 1 0 解析 优先队列 排序规则为任务结束的时间 在新任务的时候 弹出已经结束的任务 并且恢
  • 什么是自动与自主?

    自动与自主的区别很有意思 平时大家都不爱斟酌 一般都是拿过来就用 岂不知 西方人常常不是这样子的 他们一般先从基本概念上进行咬文嚼字般的抠 然后在此基础上进行理论过程的推导演算或实验实践的验证分析 于是差距往往就此拉开 自主 自建构 系统中
  • virtio-netdev 发送数据包

    在前面几文中已经大体介绍了virtio的重要组成 包含virtio net设备的创建 vring的创建 与virtio设备的交互方式 我们就从网络数据包的发送角度来看下virtio的详细使用流程 点击查看全文 http luoye me 2
  • 网络编程1

    网络编程 网络编程是Java最擅长的方向之一 使用Java进行网络编程时 由虚拟机实现了底层复杂的网络协议 Java程序只需要调用Java标准库提供的接口 就可以简单高效地编写网络程序 1 前置知识点 学习网络编程之前 我们需要先了解什么是
  • HttpRunner 3.x接口自动化: 全面讲解如何落地实战

    今天 我们来一起学习下HttpRunner3 主要讲解如何使用 应用技巧 基本知识点总结和需要注意事项 一篇文章没法面面俱到 如果有重要的地方没写到 可以给我留言 咱们接着补充 整体概览 概述介绍 HttpRunner 是一款面向 HTTP