首页 > 其他分享 >httprunner简要说明

httprunner简要说明

时间:2024-10-15 14:43:48浏览次数:7  
标签:简要 httprunner name url 说明 token test rsv eq

Httprunner

1.简介

面向HTTP(S)协议的测试通用框架,维护YAML/JSON脚本执行测试用例,最终都是转化为python文件执行,3.0以后官方建议直接转为维护python脚本

特性

  1. 继承Requests特性
  2. 辅助函数debugtalk.py,实现动态计算逻辑
  3. 测试分层,api层、测试用例层、测试套件
  4. 支持Hook机制
  5. 丰富的校验机制
  6. 基于HAR实现接口录制和用例生成功能
  7. 结合locust框架,分布式性能测试
  8. 可与jenkins进行持续集成
  9. 支持测试报告,pytest-html和allure
  10. 可拓展,支持二次开发和平台化

文件

  1. YAML/JSON,测试用例文件,一个文件对应一条测试用例
  2. debugtalk.py,脚本函数,存在时所在目录被视为项目工程的根目录,不存在时运行测试的路径为根目录,测试用例文件和测试报告文件都是基于该目录运行和生成
  3. .env,存储项目全局变量
  4. .csv 项目数据文件,用于数据驱动
  5. report(自动生成) 运行后自动生成,无需创建
  6. testcase 存放测试用例
  7. har 存放导出的文件

2.YAML文件简介

  1. :表示键值对

  2. -表示数组

  3. 纯量:字符串、整数、浮点数、布尔值、NULL、时间、日期

  4. 对象,数组嵌套

    - 
      id: 1
      name: kong
    -
      id: 2
      name: zhenguo
      city: 
        - 'shandong'
        - 'jinan'
    

3. 环境安装

pip install httprunner==版本号

hrun -v 查看版本号

httprunner startproject httprunner_demo 创建项目

hrun httprunner_demo 运行

4.快速生成接口测试用例

  • fiddler获取接口.har包

    选中单接口或多接口,File->Export Sessions->selected session->选择HTTPArchive v1.2

  • har转yaml

    har2case name.har -2y

  • har转json

    har2cae name.har -2j

  • har转python

    har2case name.bar

  • 执行:yaml和json 直接hrun name.yaml,python文件也可以使用pytest

5.脚本文件详解

yaml

  • get

    - config:  # 配置信息
       name: '测试'  # 测试用例名称
       base_url: 'url'  # ip地址
       
    - test: 
        name: '第一步测试' # 测试步骤名称
        request: 
          url: '/login' # 路径
          method: GET
          headers:
            Accept: 'text/html'
          params:
            name: ''
            age: ''
        validate:  # 断言
          - eq: ['status_code',200]
          - eq: [content.expires_in,7200] # content表示接口响应的json
    
  • post

    - config:  # 配置信息
       name: '测试'  # 测试用例名称
       base_url: 'url'  # ip地址
       
    - test: 
        name: '第一步测试' # 测试步骤名称
        request: 
          url: '/login' # 路径
          method: POST
          headers:
            
            Content-Type: 'application/json'
          json:
            {"name": {"age": 18}}
        validate:  # 断言
          - eq: ['status_code',200]
          - eq: [content.expires_in,7200] # content表示接口响应的json
    

python

  • get

    # NOTE: Generated By HttpRunner v3.1.4
    # FROM: har/baidu_home.har
     
     
    from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
     
    # 一个类是一个testcase,继承自HTTpRunner
    class TestCaseBaiduHome(HttpRunner):
        
        config = Config("testcase description").verify(False).base-url('ip地址').variables(**{"name": "123"}).export(*["token", "list"])
        # 配置测试用例设置,包括url、验证、变量、导出
        """
        Config(): 显示在执行日志和测试报告中
        base_url() 主机ip,用于切换测试环境
        variables() 公共变量,级别比Step中的低,同名不执行
        verify 用来决定是否验证服务器TLS证书的开关。通常设置为False,当请求https请求时,就会跳过验证。如果你运行时候发现抛错SSLError,可以检查一下是不是verify没传,或者设置了True。
        export() 导出的变量
        ** 解构字典,*结构列表或元组
        """
        teststeps = [
            # teststeps 每个Step对应一个API请求,也可以调用另一个testcase
            Step(
                RunRequest("/s")  # 指定测试用例名称,显示在日志和测试报告中
                .get("https://www.baidu.com/s")
                .call(导入的测试用例名称) # 导入后可使用其中的变量
                .with_variables(
                   **{"foo1": "testcase_ref_bar1", "expect_foo1": "testcase_ref_bar1"}
                ) # 测试用例变量,会覆盖全局变量中重名的变量
                .with_params(
                    **{
                        "ie": "utf-8",
                        "mod": "1",
                        "isbd": "1",
                        "isid": "C9FF25725AB54698",
                        "f": "8",
                        "rsv_bp": "1",
                        "rsv_idx": "1",
                        "tn": "baidu",
                        "wd": "httprunner",
                        "fenlei": "256",
                        "oq": "httprunner%20%26lt%3B",
                        "rsv_pq": "86a39119000039fe",
                        "rsv_t": "9d65Kx91ldJ2V3LDLjZmstZTQ27dNOYAMJ++oE9TlK6y2o+O7A7XdDS6Yus",
                        "rqlang": "cn",
                        "rsv_enter": "0",
                        "rsv_dl": "tb",
                        "rsv_sug3": "2",
                        "rsv_sug1": "2",
                        "rsv_sug7": "000",
                        "rsv_btype": "t",
                        "prefixsug": "httprunner",
                        "rsp": "1",
                        "inputT": "6648",
                        "rsv_sug4": "7252",
                        "rsv_sug": "2",
                        "bs": "httprunner 3",
                        "rsv_sid": "undefined",
                        "_ss": "1",
                        "clist": "",
                        "hsug": "httprunner 3\thttprunner",
                        "f4s": "1",
                        "csor": "10",
                        "_cr1": "40730",
                    }
                )
                .with_headers(
                    **{
                        "Host": "www.baidu.com",
                        "Connection": "keep-alive",
                        "Accept": "*/*",
                        "is_xhr": "1",
                        "X-Requested-With": "XMLHttpRequest",
                        "is_referer": "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=httprunner%203&fenlei=256&oq=httprunner%203&rsv_pq=86a39119000039fe&rsv_t=2b6c1PBdGIcDYzEKyW9BkMzeCPMYcfbqTSf%2FEDXZuefGUrmcy2q1pxhJ0NQ&rqlang=cn",
                        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36",
                        "Sec-Fetch-Site": "same-origin",
                        "Sec-Fetch-Mode": "cors",
                        "Sec-Fetch-Dest": "empty",
                        "Referer": "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=httprunner&fenlei=256&oq=httprunner%2520%2526lt%253B&rsv_pq=86a39119000039fe&rsv_t=9d65Kx91ldJ2V3LDLjZmstZTQ27dNOYAMJ%2B%2BoE9TlK6y2o%2BO7A7XdDS6Yus&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=2&rsv_sug1=2&rsv_sug7=000&rsv_btype=t&prefixsug=httprunner&rsp=1&inputT=6648&rsv_sug4=7252&rsv_sug=2",
                        "Accept-Encoding": "gzip, deflate, br",
                        "Accept-Language": "zh-CN,zh;q=0.9",
                        "Cookie": "BIDUPSID=EA49B0E234E0F93BBD3C0082A586CDEA; PSTM=1619952293; BAIDUID=C9FF25B24E5A3C59C96D61DB506725AB:FG=1; BD_UPN=123253; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=33986_33819_33849_33759_33675_33607_26350_33996; H_PS_645EC=9d65Kx91ldJ2V3LDLjZmstZTQ27dNOYAMJ%2B%2BoE9TlK6y2o%2BO7A7XdDS6Yus; delPer=0; BD_CK_SAM=1; PSINO=5; BDSVRTM=14; WWW_ST=1620121549937",
                    }
                )
                .with_cookies(
                    **{
                        "BIDUPSID": "EA49B0E234E0F93BBD3C0082A586CDEA",
                        "PSTM": "1619952293",
                        "BAIDUID": "C9FF25B24E5A3C59C96D61DB506725AB:FG=1",
                        "BD_UPN": "123253",
                        "BDORZ": "B490B5EBF6F3CD402E515D22BCDA1598",
                        "H_PS_PSSID": "33986_33819_33849_33759_33675_33607_26350_33996",
                        "H_PS_645EC": "9d65Kx91ldJ2V3LDLjZmstZTQ27dNOYAMJ%2B%2BoE9TlK6y2o%2BO7A7XdDS6Yus",
                        "delPer": "0",
                        "BD_CK_SAM": "1",
                        "PSINO": "5",
                        "BDSVRTM": "14",
                        "WWW_ST": "1620121549937",
                    }
                )
                .validate()
                .assert_equal("status_code", 200)
                .assert_equal('headers."Content-Type"', "text/html;charset=utf-8")
            ),
        ]
     
     
    if __name__ == "__main__":
        TestCaseBaiduHome().test_start()
    

6.获得响应数据&extract提取值到变量

yaml

  • 提取响应头、响应行

    - test:
        name: 接口名称 百度接口
        request:
          url: /
          method: GET
        extract:  # 提取值存储到变量中
          - code: status_code  # 响应码
          - info: reason       # ok
          - header_Content: headers.Content-Type  # 响应头部
        validate:
          - eq: [$code,200]  # 引用变量  $变量名
          - eq: [$info,"OK"]
          - eq: [$header_Content,'text/html']
    
  • 正则解析相应内容

    - test:
        name: 百度主页
        request:
            url: /
            method: GET
            headers:  # 如果断言为中文的话,加上headers的Accept-Language即可
              Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
              Accept-Encoding: gzip, deflate, br
              Accept-Language: zh-CN,zh;q=0.9
              User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36
        extract:
          - title: <title>(.+?)</title>  # 可以使用正则表达式提取
        validate:
          - eq: [$title,"百度一下,你就知道"]
    
  • 解析响应正文

    - test:
        name: 百度主页
        request:
            url: /cgi-bin/tags/get
            method: GET
            params:
              access_token: 49_lsdk_pQJJ4R5IWdWVcDTQu3bHyVOsHDlAcuA99UtVwsmzrtHhSGJKgSPMi3i3TdOQrGeuzZdB62K1uhcKJQAk6eKjzlBL7HgWvAmw7gfiRTp00QnLdSZzN7ul9f2TMPex-Iz2tCg-ZWsSPLbJTJdABAYIY
        extract:
          - id: content.tags.0.id  # content为根节点
          - name: content.tags.0.name
        validate:
          - eq: [$id,2]
          - eq: [$name,"星标组"]
    

python

  • Step(
           RunTestCase("request with functions")
           .with_variables(
                **{"foo1": "testcase_ref_bar1", "expect_foo1": "testcase_ref_bar1"}
            )
            .call(RequestWithFunctions)
            .extract()
            .with_jmespath("body.args.foo2", "foow") # json提取
           )
    

7.接口关联

当前文件

  • yaml

    - test:
        name: 获取token
        request:
          url: /cgi-bin/token
          method: GET
          params:
            grant_type: client_credential
            appid: wxf144190
            secret: 92a113bd4b5
        extract:   # 提取变量
          - token: content.access_token
          - time: content.expires_in
        validate:
          - eq: [$time,7200]
    
    - test:
        name: 获取用户所有标签
        request:
          url: /cgi-bin/tags/get
          method: GET
          params:
            access_token: $token  # 引用上面的token实现关联
        extract:
          - id: content.tags.0.id
          - name: content.tags.0.name
        validate:
          - eq: [$id,2]
          - eq: [$name,"星标组"]
    
  • python

    Step(
           RunTestCase("request with functions")
           .with_variables(
                **{"foo1": "testcase_ref_bar1", "expect_foo1": "testcase_ref_bar1"}
            )
            .call(RequestWithFunctions)
            .extract()
            .with_jmespath("body.args.foo2", "foow") # json提取
           )
    
    Step(
           RunTestCase("request with functions")
           .with_variables(
                **{"foo1": "testcase_ref_bar1", "expect_foo1": "testcase_ref_bar1"}
           )
           .with_params(**{"str1": "hello", "str2": "$foow"})  # 在第二个传参中引用导出的变量
           )
    

跨文件

  • yaml

    test.yml

    - config:  # 配置信息
       name: '测试'  # 测试用例名称
       base_url: 'url'  # ip地址
       export: 
         - token
       
    - test: 
        name: '第一步测试' # 测试步骤名称
        request: 
          url: '/login' # 路径
          method: GET
          headers:
            Accept: 'text/html'
          params:
            name: ''
            age: ''
        validate:  # 断言
          - eq: ['status_code',200]
          - eq: [content.expires_in,7200] # content表示接口响应的json
        extract:
          token: content.access_token
    
    - config:  # 配置信息
       name: '测试'  # 测试用例名称
       base_url: 'url'  # ip地址
       
    - test: 
        name: '第一步测试' # 测试步骤名称
        testcase: test.yaml
        extract:
          - token
        request: 
          url: '/login' # 路径
          method: GET
          headers:
            Accept: 'text/html'
          params:
            name: ''
            age: ''
        validate:  # 断言
          - eq: ['status_code',200]
          - eq: [content.expires_in,7200] # content表示接口响应的json
          - eq: [content, $token]
    
  • python

    testcases.test_getUserName_demo

    from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
     
     
    class TestCaseRequestWithGetUserName(HttpRunner):
        config = (
            Config("test /getUserName")
            .base_url("http://localhost:5000")
            .verify(False)
            .export(*["username"])  # 这里定义出要导出的变量
        )
     
        teststeps = [
            Step(
                RunRequest("getUserName")
                .get("/getUserName")
                .extract()
                .with_jmespath("body.username", "username")  # 提取出目标值,赋值给username变量
                .validate()
                .assert_equal("body.username", "chenshifeng")
            ),
     
        ]
     
     
    if __name__ == "__main__":
        TestCaseRequestWithGetUserName().test_start()
    
    from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
    from testcases.test_getUserName_demo import TestCaseRequestWithGetUserName as RequestWithGetUserName   # 记得要导入引用的类
     
     
    class TestCaseRequestWithJoinStr(HttpRunner):
        config = (
            Config("test /joinStr")
            .base_url("http://localhost:5000")
            .verify(False)
        )
     
        teststeps = [
            Step(
                RunTestCase("setUp getUserName")
                .call(RequestWithGetUserName)   # 导入后就可以调用了
                .export(*["username"])  # 在RunTestCase步骤中定义这个变量的导出
            ),
            Step(
                RunRequest("joinStr")
                .get("/joinStr")
                .with_params(**{"str1": "hello", "str2": "$username"})  # 在第二个传参中引用导出的变量
                .validate()
                .assert_equal("body.result", "hello $username")   # 断言的预期值也引用变量
            ),
     
        ]
     
     
    if __name__ == "__main__":
        TestCaseRequestWithJoinStr().test_start()
    

8.断言

yaml

validate:
    - eq: [status_code,200]

# 断言
- config:
    name: 测试百度网站
    base_url: https://www.baidu.com

- test:
    name: 接口名称 百度接口
    request:
      url: /
      method: GET
    validate:
      - eq: [status_code,200]  # 判断相等的4种写法 [实际结果,预期结果]
      - is: [status_code,200]
      - ==: [status_code,200]
      - equals: [status_code,200]
      - eq: ["${函数名()}", "结果"] # 函数需要引号

eq、equals、==、is,判断实际结果和期望结果是否相等
lt、less_than,判断实际结果小于期望结果
le、less_than_or_equals,判断实际结果小于等于期望结果
gt、greater_than,判断实际结果大于期望结果
ge、greater_than_or_equals,判断实际结果大于等于期望结果
ne、not_equals, 判断实际结果和期望结果不相等
str_eq、string_equals 判断转字符串后对比实际结果和期望结果是否相等
len_eq、length_equals、count_eq 判断字符串或list长度
len_gt、length_greater_than、count_gt、count_greater_than 判断实际结果的长度大于和期望结果
len_ge、length_greater_than_or_equals、count_ge、count_greater_than_or_equals实际结果的长度大于等于期望结果
len_lt、length_less_than、count_lt、count_less_than实际结果的长度小于期望结果
len_le、length_less_than_or_equals、count_le count_less_than_or_equals实际结果的长度小于等于期望结果

9.环境变量

存放在.env文件中,格式为 变量名 = 变量值

${变量名}调用

10.辅助函数debufralk.py

在执行文件中引入该文件函数

import random

def get_value():
    return "猫咪"

def get_search_word():
    work = [1, 2, 3, 4]
    num = random.randint(0, len(work)-1)
    return num
# 调用 debugtalk.py文件中的函数
- config:
    name: 百度主页
    base_url: https://www.baidu.com
    export:
      - title

- test:
    name: 百度搜索
    request:
      url: /s
      method: GET
      headers:
        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
        Accept-Encoding: gzip, deflate, br
        Accept-Language: zh-CN,zh;q=0.9
        User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36
      params:
        wd: ${get_value()} # 引用函数
    extract:
      - title: <title>(.+?)</title>
    validate:
      - eq: [$title,"猫_百度搜索"]

11.hook机制,初始化和清理

debugtalk.py

def setup_case():
    print("测试执行")
    
def teardown_case():
    print("测试结束")
- config:
    name: 百度主页
    base_url: https://www.baidu.com
    output:
      - title
    # 放到用例层级
    setup_hooks:
      - ${setup_case()}
    teardown_hooks:
      - ${teardown_case()}

12.忽略跳过测试用例

  • skip: 无条件跳过

  • skipif: 条件成立跳过

  • skipUnless: 条件不成立跳过

    # skip是用来忽略跳过测试用例
    - config:
        name: 百度主页
        base_url: https://www.baidu.com
        output:
          - title
    
    - test:
        name: 百度搜索
        # 忽略跳过用例只能在测试步骤中使用
        skip: 无条件跳过
    #    skipIf: True         # 条件为 True 时跳过
    #    skipUnless: False    # 条件为 False 时跳过
        request:
          url: /s
          method: GET
          headers:
            Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
            Accept-Encoding: gzip, deflate, br
            Accept-Language: zh-CN,zh;q=0.9
            User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36
          params:
            wd: 猫
        extract:
          - title: <title>(.+?)</title>
    
        validate:
          - eq: [$title,"猫_百度搜索"]
    

13.测试分层

api层

  • 对接口进行独立管理

    get_access_token.yml

    name: 123
    base_url: http:...
    request:
      url:
      method: 
      params:
        name: 13
    validate: 
      - eq: [status_code, 2000]
    

testcase(测试用例)

  • 测试用例管理

  • demo1_test.yml

    - config:
        name: 测试
        export:
          - token
    
    - test:
        name: 测试用例名称
        api: ../get_access_token.yml # 引用接口
        validate: 
          - eq: [content.expires_in, 1000]
        extract:
          token: content.access_token
    

引用同层级用例

  • - config:
        name: 测试
        export:
          - token
    
    -test:
      name: 引用同层级接口
      testcase: ../demo1_test.yml
      extract:
        token # 引入接口变量
      
    - test:
        name: 测试用例名称
        api: ../get_access_token.yml # 引用接口
        validate: 
          - eq: [content.expires_in, 1000]
        extract:
          token: content.access_token
    

接口用例管理(接口套件)

  • config: 
      name: test_suite
      
    testcases:
      - name: testcase1
        testcase: ../testcase1.yml
      - name: testcase2
        testcase: ../testcase2.yml
    
    # 写法2
    config: 
      - name: test_suite
      
    testcases:
      testcase1:   # 测试用例名称
        testcase: ../testcase1.yml
      testcase2: 
        testcase: ../testcase2.yml
    

14.中文乱码

  • 添加请求头信息:详情见6.yaml正则提取

  • debugtalk.py解码

    # encode编码   decode解码
    # iso8859-1 编码,解码成 utf-8
    def iso8859_to_utf8(str):
        return str.encode("iso8859-1").decode("utf-8")
    
    # utf-8 编码,解码成 iso8859-1
    def utf8_to_iso8859(str):
        return str.encode("utf-8").decode("iso8859-1")
    
    # unicode_escape 编码,解码成 utf-8
    def unicode_escape_to_utf8(str):
        return str.encode("unicode_escape").decode("utf-8")
    

15.参数化传递(多组数据)

yaml

variables关键字

套件层传给用例层再传给api层

test_suite.yml

config: 
  name: test_suite
  
testcases:
  testcase1:
    testcase: ../testcase1.yml
    variables:
      search_word: 猫猫 # 参数名: 值

test_case.yml

- config:
    name: 测试
    export:
      - token

- test:
    name: 测试用例名称
    api: ../get_access_token.yml # 引用接口
    variables:
      work: $search_work
    validate: 
      - eq: [content.expires_in, 1000]
    extract:
      token: content.access_token

test_api.yml

name: 123
base_url: http:...
request:
  url:
  method: 
    wd: $work
  params:
    name: 13
validate: 
  - eq: [status_code, 2000]

parameters关键字

接受多个参数,依次执行

config: 
  name: test_suite
  
testcases:
  testcase1:
    testcase: ../testcase1.yml
    parameters:
      search_word: ["猫猫", "狗狗", "兔兔"] # 参数名: 值
- config:
    name: 测试
    export:
      - token

- test:
    name: 测试用例名称
    api: ../get_access_token.yml # 引用接口
    cariables:
      work: $search_work
    validate: 
      - eq: [content.expires_in, 1000]
      - eq: ["猫", $result]  # $result调用套件层变量的值
    extract:
      token: content.access_token
name: 123
base_url: http:...
request:
  url:
  method: 
    wd: $work
  params:
    name: 13
validate: 
  - eq: [status_code, 2000]

dubugtalk.py自定义函数

def search_key():
    return [["猫","猫_百度搜索"],["狗","狗_百度搜索"],["大象","大象_百度搜索"]]
config: 
  name: test_suite
  
testcases:
  testcase1:
    testcase: ../testcase1.yml
    parameters:
      search_word: ${search_key()}

用例层和接口层不变

- config:
    name: 测试
    export:
      - token

- test:
    name: 测试用例名称
    api: ../get_access_token.yml # 引用接口
    cariables:
      work: $search_work
    validate: 
      - eq: [content.expires_in, 1000]
      - eq: [123, $result] # result是内部变量
    extract:
      token: content.access_token

csv参数化

search, result
1, 2
3, 4
config: 
  name: test_suite
  
testcases:
  testcase1:
    testcase: ../testcase1.yml
    parameters:
      search_word: ${P(文件路径)}

可在钩子函数中使用Faker或者pymysql构建测试数据

标签:简要,httprunner,name,url,说明,token,test,rsv,eq
From: https://www.cnblogs.com/leaveName/p/18467046

相关文章

  • C#中判断的应用说明二(switch语句)
    一.判断的定义说明判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。下面是大多数编程语言中典型的判断结构的一般形式:二.判断语句C#提供了以下类型的判断语句,查看每个语句的细节。语句描述switch语......
  • 密码管理APP系统规格说明书(初版)
    这里写目录标题1引言1.1背景1.2目的1.3范围2系统需求2.1功能需求2.2性能需求2.3安全需求2.4兼容性需求3系统设计3.1总体架构3.1.1系统架构概述3.1.2技术选型3.2功能模块设计3.2.1密码生成模块3.2.2安全存储模块3.2.3自动填充模块3.2.4多平台支持模......
  • Java项目:160 基于springboot物流管理系统(PPT+论文+说明文档)
    作者主页:源码空间codegym简介:Java领域优质创作者、Java项目、学习资料、技术互助文中获取源码项目介绍物流管理系统有管理员和用户两个角色。​管理员功能有个人中心,用户管理,车辆信息管理,公告信息管理,司机管理,物流信息管理,运单信息管理,车辆类型管理,车辆状态管理,公告......
  • 用python、JavaScript、JAVA等多种语言的实例代码演示教你如何免费获取股票数据(实时数
    ​近一两年来,股票量化分析逐渐受到广泛关注。而作为这一领域的初学者,首先需要面对的挑战就是如何获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的核心任务是从这些数据......
  • Apache Kafka各Api模块说明
    KafkaAPI微信公众号:阿俊的学习记录空间小红书:ArnoZhangwordpress:arnozhang1994博客园:arnozhangCSDN:ArnoZhang1994Kafka包含五个核心API:ProducerAPI允许应用程序将数据流发送到Kafka集群中的topic。ConsumerAPI允许应用程序从Kafka集群中的topic读取数据流......
  • adminPage-vue3依赖 v1.2.0新增组件 DetailsModule说明文档
    adminPage-vue3依赖v1.2.0新增组件DetailsModule说明文档引入思路介绍DetailsModuleAPI汇总属性插槽自定义对象config(array<object\>/object类型)config.list(array<object\>类型)使用基础使用范例config-titleconfig-moduleKeyconfig-listconfig-list-slotNamec......
  • Qt/C++编写的mqtt调试助手使用说明
    一、使用说明第一步,选择协议前缀,可选mqtt://、mqtts://、ws://、wss://四种,带s结尾的是走ssl通信,ws表示走websocket通信。一般选默认的mqtt://就好。第二步,填写服务所在主机地址,可以是IP地址也可以是网址,只要真实存在的就行。第三步,填写通信所用端口号,mqtt默认端口号是1883,以......
  • [转]WMTS服务说明
    转自:羊大葱 https://www.cnblogs.com/lishanyang/p/14288928.htmlWMTS服务 当前在网络地图服务中,大部分都会采取缓存技术来替代实时对数据进行可视化,用以提高地图响应能力。本期五分钟学GIS就给大家介绍OGC提出的缓存技术标准的WMTS服务。WMTS简介  WMTS,切片地图Web服......
  • 网站修改密码的步骤说明
    网站修改密码通常涉及以下几个步骤:登录账户:首先,你需要登录到你的账户中。这通常要求输入当前的用户名和密码。进入设置页面:登录后,找到并进入账户设置或个人信息设置页面。这个页面可能在不同的网站上有不同的名称,如“个人中心”、“账号管理”、“安全设置”等。选择修改......
  • 基于Java中的SSM框架实现学校访客登记系统项目【项目源码+论文说明】计算机毕业设计
    基于java中的SSM框架实现学校访客登记系统演示【内附项目源码+LW说明】摘要伴随着学生基数的不断的扩大和增长,各大高效也面临着巨大的困难和考验,这不仅是对于高校的考验也是对于高校在学生管理上的一个巨大的考验。其中在位重要的就是校园的安全管理,学校不仅要给学生创造......