软件测试/测试开发丨Pytest和Allure报告 学习笔记

点此获取更多相关资料

本文为霍格沃兹测试开发学社学员学习笔记分享
原文链接:https://ceshiren.com/t/topic/26755

Pytest 命名规则

类型规则
文件test_开头 或者 _test 结尾
Test 开头
方法/函数test_开头
注意:测试类中不可以添加__init__构造函数

注意:pytest对于测试包的命名没有要求

方法:类中定义的函数

函数:类外面定义的函数

谷歌风格开源项目风格指南:

https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/ 2

Pytest用例断言

断言的概念

断言(assert),是一种在程序中的一阶逻辑(如:一个结果为真或假的逻辑判断式),目的为了表示与验证软件开发者预期的结果。当程序执行到断言的位置时,对应的断言应该为真。若断言不为真时,程序会中止执行,并给出错误信息。

img

断言的用法

  • 断言写法

    • assert <表达式>
    • assert <表达式>,<描述>
assert <bool expression>;       
assert <bool expression> : <message>;    

示例一

def test_a():
    assert True

def test_b():
    a = 1
    b = 1
    c = 2
    assert a + b == c, f"{a}+{b}=={c}, 结果为真"
    

示例二

def test_c():
    a = 1
    b = 1
    c = 2
    assert 'abc' in "abcd"

import sys
def test_plat():
    assert ('linux' in sys.platform), "该代码只能在 Linux 下执行"

Pytest测试框架结构(setup/teardown)

测试装置介绍

类型规则
setup_module/teardown_module全局模块级
setup_class/teardown_class类级,只在类中前后运行一次
setup_function/teardown_function函数级,在类外
setup_method/teardown_method方法级,类中的每个方法执行前后
setup/teardown在类中,运行在调用方法的前后(重点)

Pyrest参数化用例

参数化

  • 通过参数的方式传递数据,从而实现数据脚本分离。
  • 并且可以实现用例的重复生成与执行

参数化测试函数使用

单参数情况

  • 单参数,可以将数据放在列表中
search_list = ['appium','selenium','pytest']

@pytest.mark.parametrize('name',search_list)
def test_search(name):
    assert name in search_list

多参数情况

  • 将数据放在列表嵌套元组中
  • 将数据放在列表嵌套列表中
# 数据放在元组中
@pytest.mark.parametrize("test_input,expected",[
    ("3+5",8),("2+5",7),("7+5",12)
])
def test_mark_more(test_input,expected):
    assert eval(test_input) == expected
# 数据放在列表中
@pytest.mark.parametrize("test_input,expected",[
    ["3+5",8],["2+5",7],["7+5",12]
])
def test_mark_more(test_input,expected):
    assert eval(test_input) == expected

用例重命名-添加 ids 参数

  • 通过ids参数,将别名放在列表中
@pytest.mark.parametrize("test_input,expected",[
    ("3+5",8),("2+5",7),("7+5",12)
],ids=['add_3+5=8','add_2+5=7','add_3+5=12'])
def test_mark_more(test_input,expected):
    assert eval(test_input) == expected

用例重命名-添加 ids 参数(中文)

@pytest.mark.parametrize("test_input,expected",[
    ("3+5",8),("2+5",7),("7+5",12)
],ids=["3和5相加","2和5相加","7和5相加"])
def test_mark_more(test_input,expected):
    assert eval(test_input) == expected
    

ids不支持中文,默认是unicode编码格式,可以用如下方法转换

# 在项目(最末一级)下创建conftest.py 文件 ,将下面内容添加进去,运行脚本
def pytest_collection_modifyitems(items):
    """
    测试用例收集完成时,将收集到的用例名name和用例标识nodeid的中文信息显示在控制台上
    """
    for i in items:
        i.name=i.name.encode("utf-8").decode("unicode_escape")
        i._nodeid=i.nodeid.encode("utf-8").decode("unicode_escape")

笛卡尔积

接口测试中用的较多,因为接口的值很多

  • 两组数据

    • a=[1,2,3]
    • b=[a,b,c]
  • 对应有几种组合形势 ?

    • (1,a),(1,b),(1,c)
    • (2,a),(2,b),(2,c)
    • (3,a),(3,b),(3,c)
@pytest.mark.parametrize("b",["a","b","c"])
@pytest.mark.parametrize("a",[1,2,3])
def test_param1(a,b):
    print(f"笛卡积形式的参数化中 a={a} , b={b}")

执行方向:由近致远

使用 Mark 标记测试用例

Mark:标记测试用例

  • 场景:只执行符合要求的某一部分用例 可以把一个web项目划分多个模块,然后指定模块名称执行。

  • 解决: 在测试用例方法上加 @pytest.mark.标签名

  • 执行: -m 执行自定义标记的相关用例

    • pytest -s 文件名 -m=webtest
    • pytest -s test_mark_zi_09.py -m apptest
    • pytest -s test_mark_zi_09.py -m "not ios"(必须要是双引号)
    • pytest -v是能输出更详细的用例信息,成功与失败不再是.和F

如何解决warnings问题

[pytest]
# 在项目目录下创建一个pytest.ini放标签,这样这些标签就不会warning。而且要换行写,也不要顶头写,会被认为是key
# 在这里注册好标签名后,pytest可以识别
markers = str
          bignum
          float
          int
          minus
          zero

pytest 设置跳过、预期失败

Mark:跳过(Skip)及预期失败(xFail)

  • 这是 pytest 的内置标签,可以处理一些特殊的测试用例,不能成功的测试用例
  • skip - 始终跳过该测试用例
  • skipif - 遇到特定情况跳过该测试用例
  • xfail - 遇到特定情况,产生一个“期望失败”输出

Skip 使用场景

  • 调试时不想运行这个用例

  • 标记无法在某些平台上运行的测试功能

  • 在某些版本中执行,其他版本中跳过

  • 比如:当前的外部资源不可用时跳过

    • 如果测试数据是从数据库中取到的,
    • 连接数据库的功能如果返回结果未成功就跳过,因为执行也都报错
  • 解决 1:添加装饰器

    • @pytest.mark.skip
    • @pytest.mark.skipif
  • 解决 2:代码中添加跳过代码

    • pytest.skip(reason)
# 形式一:跳过这个方法
@pytest.mark.skip(reason="存在bug")
def test_double_str():
    print("代码未开发完")
    assert 'aa' == 'aa'


# 形式二:跳过这个方法
@pytest.mark.skipif(sys.platform == "win32", reason="does not run on win32")
def test_case():
    print(sys.platform)
    assert True
    
    
# 形式二:在代码中跳过代码
def check_login():
    return False

def test_double_str():
    print("start")
    if not check_login():
        pytest.skip("未登录,不进行下去")
    print("end")
# ============================= 1 skipped in 0.02s ======

xfail 使用场景

用于标记此用例可能会失败,当脚本失败时,测试报告也不会打印错误追踪,只是会显示xfail状态。xfail的主要作用是比如在进行测试提前时,当产品某功能尚未开发完成而进行自动化脚本开发,当然此时也可以把这些脚本注释起来,但这不是pytest推荐的做法,pytest推荐使用xfail标记,如此则虽然产品功能尚未开发完成,但是自动化脚本已经可以跑起来了,只不过在测试报告中会显示xfail而已。

  • 与 skip 类似 ,预期结果为 fail ,标记用例为 fail
  • 与skip不同,xfail标记的用例依然会被执行,如果执行成功就返回XPASS,执行失败就返回XFAIL。只是起到一个提示的作用。
  • 用法:添加装饰器@pytest.mark.xfail
@pytest.mark.xfail
def test_case():
    print("test_xfail 方法执行")
    assert 2 == 2
# XPASS                                   [100%]test_xfail 


@pytest.mark.xfail
def test_case():
    print("test_xfail 方法执行")
    assert 1 == 2
    
# XFAIL                                            [100%]test_xfail 方法执行


xfail = pytest.mark.xfail
@xfail(reason="bug 110")
def test_case():
    print("test_xfail 方法执行")
    assert 1 == 2

# XFAIL (bug 110)                                  [100%]test_xfail 方法执行
    

pytest 运行用例

运行多条用例方式

如果要进入某个文件所在的目录终端,可以右键文件->选择open in terminal

  • 执行包下所有的用例:pytest/py.test [包名]

  • 执行单独一个 pytest 模块:pytest 文件名.py

  • 运行某个模块里面某个类:pytest 文件名.py::类名

  • 运行某个模块里面某个类里面的方法:pytest 文件名.py::类名::方法名

  • 加-v可以具体展示,如pytest -v 文件名.py::类名::方法名 (-v在前在后都行)

    • test_skip.py::TestDemo::test_demo1 PASSED [100%]

运行结果分析

  • 常用的:fail/error/pass(error可能是代码写错了)
  • 特殊的结果:warning/deselect(后面会讲)

python 执行 pytest

前面已经介绍了几种执行用例的方法,一个是点击代码方法或类的左侧绿色箭头,一个是右键测试用例,一个是终端pytest解释器执行,我们也可以用python解释器执行

Python 代码执行 pytest

  • 方法一:使用 main 函数

  • 方法二:使用 python -m pytest 调用 pytest(jenkins 持续集成用到),相当于在原来pytest 用例前加了python -m。

    • 方便指定python版本,比如有的用例使用python老版本写的

Python 代码执行 pytest - main 函数

if __name__ == '__main__':
    # 1、运行当前目录下所有符合规则的用例,包括子目录(test_*.py 和 *_test.py)
    pytest.main()
    # 2、运行test_mark1.py::test_dkej模块中的某一条用例
    pytest.main(['test_mark1.py::test_dkej','-vs'])
    # 3、运行某个 标签
    pytest.main(['test_mark1.py','-vs','-m','dkej'])

运行方式
  `python test_*.py `

pytest 异常处理

异常处理方法 try …except

try:
    可能产生异常的代码块
except [ (Error1, Error2, ... ) [as e] ]:
    处理异常的代码块1
except [ (Error3, Error4, ... ) [as e] ]:
    处理异常的代码块2
except  [Exception]:
    处理其它异常

异常处理方法 pytest.raise()

  • 可以捕获特定的异常
  • 获取捕获的异常的细节(异常类型,异常信息)
  • 发生异常,后面的代码将不会被执行
def test_raise():
    with pytest.raises(ValueError, match='must be 0 or None'):
        raise ValueError("value must be 0 or None")

def test_raise1():
    with pytest.raises(ValueError) as exc_info:
        raise ValueError("value must be 42")
    assert exc_info.type is ValueError
    assert exc_info.value.args[0] == "value must be 42"

这样可以选择一个异常

 def test_raise():
    with pytest.raises((ZeroDivisionError,ValueError)):
        raise ZeroDivisionError("value must be 0 or None")

Pytest 结合数据驱动 YAML

数据驱动

  • 什么是数据驱动?

    • 数据驱动就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。简单来说,就是参数化的应用。数据量小的测试用例可以使用代码的参数化来实现数据驱动,数据量大的情况下建议大家使用一种结构化的文件(例如 yaml,json 等)来对数据进行存储,然后在测试用例中读取这些数据。
  • 应用:

    • App、Web、接口自动化测试
    • 测试步骤的数据驱动
    • 测试数据的数据驱动
    • 配置的数据驱动

yaml 文件介绍

  • 对象:键值对的集合,用冒号 “:” 表示

  • 数组:一组按次序排列的值,前加 “-”

  • 纯量:单个的、不可再分的值

    • 字符串
    • 布尔值
    • 整数
    • 浮点数
    • Null
    • 时间
    • 日期
# 编程语言
languages:
  - PHP
  - Java
  - Python
book:
  Python入门: # 书籍名称
    price: 55.5
    author: Lily
    available: True
    repertory: 20
    date: 2018-02-17
  Java入门:
    price: 60
    author: Lily
    available: False
    repertory: Null
    date: 2018-05-11

相当于:

languages:['PHP', 'Java', 'Python'] # languages是key值

yaml 文件使用

  • 查看 yaml 文件

    • pycharm
    • txt 记事本
  • 读取 yaml 文件

    • 安装:pip install pyyaml
    • 方法:yaml.safe_load(f)(yaml->python)
    • 方法:yaml.safe_dump(f) (python->yaml)
import yaml
file_path = './my.yaml'
with open(file_path, 'r', encoding='utf-8') as f:
    data = yaml.safe_load(f)

工程目录结构(看项目文件datadriver_yaml)

  • data 目录:存放 yaml 数据文件
  • func 目录:存放被测函数文件
  • testcase 目录:存放测试用例文件
# 工程目录结构
.
├── data
│   └── data.yaml
├── func
│   ├── __init__.py
│   └── operation.py
└── testcase
    ├── __init__.py
    └── test_add.py

测试准备

  • 被测对象:operation.py
  • 测试用例:test_add.py
  • 测试数据:data.yaml
# operation.py 文件内容
def my_add(x, y):
    result = x + y
    return result
# test_add.py 文件内容
class TestWithYAML:
  @pytest.mark.parametrize('x,y,expected', [[1, 1, 2]])
  def test_add(self, x, y, expected):
    assert my_add(int(x), int(y)) == int(expected)
# data.yaml 文件内容
-
  - 1
  - 1
  - 2
-
  - 3
  - 6
  - 9
-
  - 100
  - 200
  - 300

Pytest 数据驱动结合 yaml 文件

# 读取yaml文件
def get_yaml():
    """
    获取json数据
    :return: 返回数据的结构:[[1, 1, 2], [3, 6, 9], [100, 200, 300]]
    """
    with open('../datas/data.yaml', 'r') as f:
        data = yaml.safe_load(f)
        return data

Pytest 结合数据驱动 Excel

读取 Excel 文件

  • 第三方库

    • xlrd
    • xlwings
    • pandas
  • openpyxl

    • 官方文档: openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files — openpyxl 3.1.2 documentation

openpyxl 库的安装

  • 安装:pip install openpyxl
  • 导入:import openpyxl

openpyxl 库的操作

  • 读取工作簿
  • 读取工作表
  • 读取单元格
import openpyxl

# 获取工作簿
book = openpyxl.load_workbook('../data/params.xlsx')

# 读取工作表
sheet = book.active

# 读取单个单元格
cell_a1 = sheet['A1']
cell_a3 = sheet.cell(column=1, row=3)  # A3

# 读取多个连续单元格
cells = sheet["A1":"C3"]

# 获取单元格的值
cell_a1.value

工程目录结构

  • data 目录:存放 excel 数据文件
  • func 目录:存放被测函数文件
  • testcase 目录:存放测试用例文件
# 工程目录结构
.
├── data
│   └── params.excel
├── func
│   ├── __init__.py
│   └── operation.py
└── testcase
    ├── __init__.py
    └── test_add.py

测试准备

  • 被测对象:operation.py
  • 测试用例:test_add.py
# operation.py 文件内容
def my_add(x, y):
    result = x + y
    return result

# test_add.py 文件内容
class TestWithEXCEL:
    @pytest.mark.parametrize('x,y,expected', get_excel())
    def test_add(self, x, y, expected):
        assert my_add(int(x), int(y)) == int(expected)

测试准备

  • 测试数据:params.xlsx

img

注意:.xlsx文件要在外面创建,不要在编辑器里创建

Pytest 数据驱动结合 Excel 文件

# 读取Excel文件
import openpyxl
import pytest

def get_excel():
    # 获取工作簿
    book = openpyxl.load_workbook('../data/params.xlsx')

    # 获取活动行(非空白的)
    sheet = book.active

    # 提取数据,格式:[[1, 2, 3], [3, 6, 9], [100, 200, 300]]
    values = []
    for row in sheet:
        line = []
        for cell in row:
            line.append(cell.value)
        values.append(line)
    return values

Pytest 结合数据驱动 csv

csv 文件介绍

  • csv:逗号分隔值
  • 是 Comma-Separated Values 的缩写
  • 纯文本形式存储数字和文本
  • 文件由任意数目的记录组成
  • 每行记录由多个字段组成
Linux从入门到高级,linux,¥5000
web自动化测试进阶,python,¥3000
app自动化测试进阶,python,¥6000
Docker容器化技术,linux,¥5000
测试平台开发与实战,python,¥8000

csv 文件使用

  • 读取数据

    • 内置函数:open()
    • 内置模块:csv
  • 方法:csv.reader(iterable)

    • 参数:iterable ,文件或列表对象
    • 返回:迭代器,每次迭代会返回一行数据。
# 读取csv文件内容

def get_csv():
    with open('demo.csv', 'r') as file:
        raw = csv.reader(file)

        for line in raw:
            print(line)

工程目录结构

  • data 目录:存放 csv 数据文件
  • func 目录:存放被测函数文件
  • testcase 目录:存放测试用例文件
# 工程目录结构
.
├── data
│   └── params.csv
├── func
│   ├── __init__.py
│   └── operation.py
└── testcase
    ├── __init__.py
    └── test_add.py

测试准备

  • 被测对象:operation.py
  • 测试用例:test_add.py
  • 测试数据:params.csv
# operation.py 文件内容
def my_add(x, y):
    result = x + y
    return result

# test_add.py 文件内容
class TestWithCSV:
    @pytest.mark.parametrize('x,y,expected', [[1, 1, 2]])
    def test_add(self, x, y, expected):
        assert my_add(int(x), int(y)) == int(expected)

# params.csv 文件内容
1,1,2
3,6,9
100,200,300

Pytest 数据驱动结合 csv 文件

# 读取 data目录下的 params.csv 文件
import csv

def get_csv():
    """
    获取csv数据
    :return: 返回数据的结构:[[1, 1, 2], [3, 6, 9], [100, 200, 300]]
    """
    with open('../data/params.csv', 'r') as file:
        raw = csv.reader(file)
        data = []
        for line in raw:
            data.append(line)
    return data

Pytest 结合数据驱动 json

json 文件介绍

  • json 是 JS 对象

  • 全称是 JavaScript Object Notation

  • 是一种轻量级的数据交换格式

  • json 结构

    • 对象 {"key": value}
    • 数组 [value1, value2 ...]
{
  "name:": "hogwarts ",
  "detail": {
    "course": "python",
    "city": "北京"
  },
  "remark": [1000, 666, 888]
}

json 文件使用

  • 查看 json 文件

    • pycharm
    • txt 记事本
  • 读取 json 文件

    • 内置函数 open()
    • 内置库 json
    • 方法:json.loads()
    • 方法:json.dumps()
# 读取json文件内容
def get_json():
    with open('demo.json', 'r') as f:
        data = json.loads(f.read())
        print(data)

测试准备

  • 被测对象:operation.py
  • 测试用例:test_add.py
  • 测试数据:params.json
# operation.py 文件内容
def my_add(x, y):
    result = x + y
    return result

# test_add.py 文件内容
class TestWithJSON:
    @pytest.mark.parametrize('x,y,expected', [[1, 1, 2]])
    def test_add(self, x, y, expected):
        assert my_add(int(x), int(y)) == int(expected)

# params.json 文件内容
{
  "case1": [1, 1, 2],
  "case2": [3, 6, 9],
  "case3": [100, 200, 300]
}

Pytest 数据驱动结合 json 文件

# 读取json文件
def get_json():
    """
    获取json数据
    :return: 返回数据的结构:[[1, 1, 2], [3, 6, 9], [100, 200, 300]]
    """
    with open('../data/params.json', 'r') as f:
        data = json.loads(f.read())
        return list(data.values())

pytest测试用例生命周期管理

Fixture 用法

Fixture 特点及优势

  • 1、命令灵活:对于 setup,teardown,可以不起这两个名字
  • 2、数据共享:在 conftest.py 配置⾥写⽅法可以实现数据共享,不需要 import 导⼊。可以跨⽂件共享
  • 3、scope 的层次及神奇的 yield 组合相当于各种 setup 和 teardown
  • 4、实现参数化

Fixture 在自动化中的应用- 基本用法

  • 场景:

    测试⽤例执⾏时,有的⽤例需要登陆才能执⾏,有些⽤例不需要登陆。

    setup 和 teardown ⽆法满⾜。fixture 可以。默认 scope(范围)function

  • 步骤:

    • 1.导⼊ pytest
    • 2.在登陆的函数上⾯加@pytest.fixture()
    • 3.在要使⽤的测试⽅法中传⼊(登陆函数名称),就先登陆
    • 4.不传⼊的就不登陆直接执⾏测试⽅法。
# test_fixture.py

import pytest

# 定义登录的fixture
@pytest.fixture()
def login():
    print("完成登录操作")


def test_search():
    print("搜索")


def test_cart(login): #不需要把login放在函数里面,只要传参就可以
    print("购物车")


def test_order(login):
    print("下单")

Fixture 在自动化中的应用 - 作用域

取值范围说明
function函数级每一个函数或方法都会调用
class类级别每个测试类只运行一次
module模块级每一个.py 文件调用一次
package包级每一个 python 包只调用一次(暂不支持)
session会话级每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法

注:整个项目就是一个会话

import pytest

# 定义登录的fixture
@pytest.fixture(scope="class")
def login():
    print("完成登录操作")


def test_search(login):
    print("搜索")


def test_cart(login):
    print("购物车")


def test_order(login):
    print("下单")

class TestDemo:
    def test_case1(self,login):
        print("case1")

    def test_case2(self,login):
        print("case2")

Fixture 在自动化中的应用 - yield 关键字

  • 场景:

你已经可以将测试⽅法【前要执⾏的或依赖的】解决了,
测试⽅法后销毁清除数据的要如何进⾏呢?

  • 解决:

通过在 fixture 函数中加⼊ yield 关键字,yield 是调⽤第⼀次返回结果,
第⼆次执⾏它下⾯的语句返回。

  • 步骤:

在@pytest.fixture(scope=module)。
在登陆的⽅法中加 yield,之后加销毁清除的步骤

import pytest

# 定义登录的fixture
@pytest.fixture(scope="class")
def login():
    # setup 操作
    print("完成登录操作")
    token = "abcd"
    username = "hogwarts"
    yield token, username  # 相当于return
    # teardown 操作
    print("完成登出操作")


def test_search(login):
    token, username = login
    print(f"token:{token},name:{username}")
    print("搜索")


def test_cart(login):
    print("购物车")


def test_order(login):
    print("下单")

class TestDemo:
    def test_case1(self,login):
        print("case1")

    def test_case2(self,login):
        print("case2")

Fixture 在自动化中的应用 - 数据共享

  • 场景:

你与其他测试⼯程师合作⼀起开发时,公共的模块要在不同⽂件中,要在⼤家都访问到的地⽅。

  • 解决:

使⽤ conftest.py 这个⽂件进⾏数据共享,并且他可以放在不同位置起着不同的范围共享作⽤。

  • 前提:

    • conftest ⽂件名是不能换的
    • 放在项⽬下是全局的数据共享的地⽅
  • 执⾏:

    • 系统执⾏到参数 login 时先从本模块中查找是否有这个名字的变量什么的,
    • 之后在 conftest.py 中找是否有。
  • 步骤:

    • 将登陆模块带@pytest.fixture 写在 conftest.py

Fixture 在自动化中的应用 - 自动应用

场景:

不想原测试⽅法有任何改动,或全部都⾃动实现⾃动应⽤,

没特例,也都不需要返回值时可以选择⾃动应⽤

解决:

使⽤ fixture 中参数 autouse=True 实现

步骤:

在⽅法上⾯加 @pytest.fixture(autouse=True)

比如要实现fixture时session级别的,就要每个用例都添加fixture方法。可以通过自动应用来避免。

问题:那yield返回参数的怎么办?

Fixture 在自动化中的应用 -参数化

场景:

测试离不开数据,为了数据灵活,⼀般数据都是通过参数传的

解决:

fixture 通过固定参数 request 传递

步骤:

在 fixture 中增加@pytest.fixture(params=[1, 2, 3, ‘linda’])

在⽅法参数写 request,方法体里面使用 request.param 接收参数

Fixture 的用法总结

  • 模拟 setup,teardown(一个用例可以引用多个 fixture)
  • yield 的用法
  • 作用域( session,module, 类级别,方法级别 )
  • 自动执行 (autouse 参数)
  • conftest.py 用法,一般会把 fixture 写在 conftest.py 文件中(这个文件名字是固定的,不能改)
  • 实现参数化
# test_fixture_param.py
import pytest


@pytest.fixture(params=[["selenium",123], ["appium",123]])
def login(request):
    print(f"用户名:{request.param}")
    return request.param

def test_demo1(login):
    print(f"demo1 case:数据为{login}")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cvat 安装部署

官网地址&#xff1a; https://github.com/opencv/cvat/tree/masterhttps://github.com/opencv/cvat/tree/master 1.从官网上下载源码地址。 2.配置环境变量 vim /etc/profile source /etc/profile 或者执行&#xff1a; export CVAT_HOSTyour-ip-address 3.执行命令 …

无涯教程-Android - 应用组件

应用程序组件是Android应用程序的基本组成部分&#xff0c;这些组件需要在应用程序清单文件 AndroidManifest.xml 注册&#xff0c;该文件描述了应用程序的每个组件以及它们如何交互。 Android应用程序可以使用以下四个主要组件- Sr.NoComponents & 描述1 Activities 它们…

BMC相关知识

简介 BMC&#xff08;Baseboard Management Controller&#xff09;&#xff0c;基板管理控制器&#xff0c;普通PC没有&#xff0c;服务器产品必备。BMC是一个独立的系统&#xff0c;只要通电即可运行&#xff0c;服务器无需开机&#xff0c;不依赖其它软硬件&#xff0c;如O…

ChatGPT 总结数据分析的所有知识点

ChatGPT功能非常多,特别是对某个行业,某个方向,某个技术进行总结那是相当专业的。 如下图。 直接用一个指令便总结出来数据分析当中的所有知识点内容。 AIGC ChatGPT ,BI商业智能, 可视化Tableau, PowerBI, FineReport, 数据库Mysql Oracle, Office, Python ,ETL Ex…

打造个人的NAS云存储-通过Nextcloud搭建私有云盘实现公网远程访问

文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文件共享服…

EXCEL中点击单元格,所在行和列都改变颜色

在日常工作中&#xff0c;尤其是办公室工作人群&#xff0c;尝尝需要处理大量的数据&#xff0c;在对数据进行修改时&#xff0c;时长发生看错行的事情&#xff0c;导致数据越改越乱&#xff0c;因此&#xff0c;我常用的一种方法就是选中单元格时&#xff0c;所在行、列标记为…

suricata安装与配置

一、功能介绍 1、概述 suricata来源于经典的nids系统snort&#xff0c;是一套基于网络流量的威胁检测引擎&#xff0c;整合了ids,ips&#xff0c;network security monitoring(NSM)和PCAP processing等功能。 2、IDS功能 通过监听网卡流量并匹配规则引擎进行入侵实时监测和…

【分享】小型园区组网场景

小型园区组网图 在小型园区中&#xff0c;S2700&S3700通常部署在网络的接入层&#xff0c;S5700&S6700通常部署在网络的核心&#xff0c;出口路由器一般选用AR系列路由器。 接入交换机与核心交换机通过Eth-Trunk组网保证可靠性。 每个部门业务划分到一个VLAN中&#…

如何高效进行测试用例评审

1.用例评审的目的 为了减少测试人员执行阶段做无效工作&#xff0c;执行无效case&#xff0c;提交无效缺陷&#xff08;可以友情提醒研发同学&#xff0c;讲到自己负责的相关模块时&#xff0c;注意下是否存在异议点&#xff09;为了避免三方&#xff08;产品、研发、测试&…

使用C语言计算1/1-1/2+1/3-1/4+...+1/99-1/100

观察算式&#xff0c;发现分子都是1&#xff0c;分母从1~100&#xff0c;所以可以使用for循环产生1~100之间的数。 另一个问题是&#xff0c;如何产生正负交替的符号&#xff1f;很简单&#xff0c;这个符号本质上就是往每一项前面乘一个系数&#xff1a;一或者负一。所以只需…

【数据结构练习】单链表OJ题(二)

目录 一、相交链表二、环形链表1三、环形链表2四、链表分割五、复制带随机指针的链表 一、相交链表 题目&#xff1a; 示例&#xff1a; 注意&#xff1a;不能根据节点的值来比较是否相交&#xff0c;而是根据节点在内存中是否指向相同的位置。 例如以上图&#xff1a; 链表…

无涯教程-Android - RadioButton函数

RadioButton有两种状态:选中或未选中,这允许用户从一组中选择一个选项。 Radio Button 示例 本示例将带您完成一些简单的步骤,以展示如何使用Linear Layout和RadioButton创建自己的Android应用程序。 以下是修改后的主要Activity文件 src/MainActivity.java 的内容。 packa…

数学建模:数据的预处理

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 文章目录 数据预处理数据变换数据清洗缺失值处理异常值处理 数据预处理 数据变换 常见的数据变换的方式&#xff1a;通过某些简单的函数进行数据变换。 x ′ x 2 x ′ x x ′ log ⁡ ( x ) ∇ f ( x k )…

MATLAB中mod函数转化为C语言

背景 有项目算法使用matlab中mod函数进行运算&#xff0c;这里需要将转化为C语言&#xff0c;从而模拟算法运行&#xff0c;将算法移植到qt。 MATLAB中mod简单介绍 语法 b mod(a,m) 说明 b mod(a,m) 返回 a 除以 m 后的余数&#xff0c;其中 a 是被除数&#xff0c;m 是…

储能辅助电力系统调峰的容量需求研究(matlab代码)

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《储能辅助电力系统调峰的容量需求研究》&#xff0c;是一个很常规很经典的matlab优化代码&#xff0c;主要是对火电、风电和储能等电力设备主体进行优化调度&#xff0c;在调峰能力达不到时采…

Java 面试 - Redis

Redis Redis 是基于键值对的非关系型数据库。Redis 拥有string、hash、list、set、zset等多种数据结构, redis具有惊人的读写性能, 其优秀的持久化机制是的它在断电和机械故障时也不会发生数据丢失, 可以用于热点数据存放, 还提供了键过期、发布订阅、食物、流水线、LUA脚本等多…

创建聊天机器人:产品专属ChatGPT智能问答机器人,可添加任意网站

ChatGPT智能问答机器人可以广泛应用于各种SaaS产品&#xff0c;通过创建聊天机器人可以快速反馈用户&#xff0c;并且针对性的提供解决方案&#xff0c;非常高效的完成客户问答反馈。 聊天机器人是生活中常见的一种交互方式&#xff0c;机器人根据用户输入的关键字&#xff0c;…

ChatGPT~Error1015You are being rate limited

目录 问题背景 问题的原因 下来说说解决方案 总结 问题背景 今天使用Chatgpt的时候突然出现"You are being rate limited"的错误提示。 问题的原因 小问题了&#xff0c;又不是第一次被弄出来了&#xff0c;莫慌。 让我们先看看Chatgpt自己是怎么解释这个问题…

JVM类加载器

一、类与类加载器 类加载器虽然只用于实现类的加载动作&#xff0c;但它在Java程序中起到的作用却远超类加载阶段。对于 任意一个类&#xff0c;都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性&#xff0c;每一个类加载器&#xff0c;都拥有一个独…

win | wireshark | 在win上跑lua脚本 解析数据包

前提说明&#xff1a;之前是在linux 系统上配置的&#xff0c;然后现在 在配置lua 脚本 &#xff0c;然后 分析指定协议 的 数据包 其实流程也比较简单&#xff0c;但 逻辑需要缕清来 首先要把你 预先准备的 xxx.lua 文件放到wireshark 的安装文件中&#xff0c;&#xff08;我…