Pytest测试框架3

news2024/10/6 0:30:50

目录:

  1. pytest结合数据驱动-yaml
  2. pytest结合数据驱动-excel
  3. pytest结合数据驱动-csv
  4. pytest结合数据驱动-json
  5. pytest测试用例生命周期管理(一)
  6. pytest测试用例生命周期管理(二)
  7. pytest测试用例生命周期管理(三)
  8. pytest测试用例生命周期管理-自动注册
  9. pytest测试用例生命周期管理-自动生效
  10. pytestfixture实现参数化

1.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

yaml 文件使用

  • 查看 yaml 文件
    • pycharm
    • txt 记事本
  • 读取 yaml 文件
    • 安装:pip install pyyaml
    • 方法:yaml.safe_load(f)
    • 方法:yaml.safe_dump(f)
import yaml

file_path = './my.yaml'
with open(file_path, 'r', encoding='utf-8') as f:
    data = yaml.safe_load(f)

 代码实例:

工程目录结构

  • 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
import pytest
import yaml

from func.operation import my_add


# 方法一
# class TestWithYAML:
#     @pytest.mark.parametrize('x,y,expected', [[1, 1, 2], [3, 6, 9], [100, 200, 300]])
#     def test_add(self, x, y, expected):
#         assert my_add(int(x), int(y)) == int(expected)

# 方法二
def get_data():
    with open("../data/data.yaml", encoding='utf-8') as f:
        data = yaml.safe_load(f)
    return data


class TestWithYAML:
    @pytest.mark.parametrize('x,y,expected', get_data())
    def test_add(self, x, y, expected):
        assert my_add(int(x), int(y)) == int(expected)

2.pytest结合数据驱动-excel

读取 Excel 文件

  • 第三方库

    • xlrd
    • xlwings
    • pandas
  • openpyxl

    • 官方文档: https://openpyxl.readthedocs.io/en/stable/

openpyxl 库的安装

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

openpyxl 库的操作

  • 读取工作簿

  • 读取工作表

  • 读取单元格

import openpyxl

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

# 读取工作表
sheet = book.active
print(sheet)

# 读取单个单元格
cell_a1 = sheet['A1']
print(cell_a1.value)

cell_a3 = sheet.cell(column=1, row=3)  # A3
print(cell_a3.value)

# 读取多个连续单元格
cells = sheet["A1":"C3"]
for i in cells:
    for j in i:
        print(j.value,end=' ')
    print()

 代码实例:

import openpyxl
import pytest
import yaml

from func.operation import my_add


# 方法一
# class TestWithYAML:
#     @pytest.mark.parametrize('x,y,expected', [[1, 1, 2], [3, 6, 9], [100, 200, 300]])
#     def test_add(self, x, y, expected):
#         assert my_add(int(x), int(y)) == int(expected)

# 方法二
# def get_data():
#     with open("../data/data.yaml", encoding='utf-8') as f:
#         data = yaml.safe_load(f)
#     return data
#
#
# class TestWithYAML:
#     @pytest.mark.parametrize('x,y,expected', get_data())
#     def test_add(self, x, y, expected):
#         assert my_add(int(x), int(y)) == int(expected)

# 方法三
def get_excel():
    book = openpyxl.load_workbook("../data/test.xlsx")
    sheet = book.active
    cells = sheet["A1":"C3"]
    values = []
    for row in cells:
        data = []
        for cell in row:
            data.append(cell.value)
        values.append(data)
    return values


class TestWithYAML:
    @pytest.mark.parametrize('x,y,expected', get_excel())
    def test_add(self, x, y, expected):
        assert my_add(int(x), int(y)) == int(expected)

3.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 ,文件或列表对象
    • 返回:迭代器,每次迭代会返回一行数据。
import csv


def get_csv():
    with open('./data/params.csv', 'r', encoding='utf-8') as file:
        raw = csv.reader(file)
        for line in raw:
            print(line)


if __name__ == '__main__':
    get_csv()

代码实例:

测试准备

  • 被测对象: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
import csv

import openpyxl
import pytest
import yaml

from func.operation import my_add


# 方法一
# class TestWithYAML:
#     @pytest.mark.parametrize('x,y,expected', [[1, 1, 2], [3, 6, 9], [100, 200, 300]])
#     def test_add(self, x, y, expected):
#         assert my_add(int(x), int(y)) == int(expected)

# 方法二
# def get_data():
#     with open("../data/data.yaml", encoding='utf-8') as f:
#         data = yaml.safe_load(f)
#     return data
#
#
# class TestWithYAML:
#     @pytest.mark.parametrize('x,y,expected', get_data())
#     def test_add(self, x, y, expected):
#         assert my_add(int(x), int(y)) == int(expected)

# 方法三
# def get_excel():
#     book = openpyxl.load_workbook("../data/test.xlsx")
#     sheet = book.active
#     cells = sheet["A1":"C3"]
#     values = []
#     for row in cells:
#         data = []
#         for cell in row:
#             data.append(cell.value)
#         values.append(data)
#     return values
#
#
# class TestWithYAML:
#     @pytest.mark.parametrize('x,y,expected', get_excel())
#     def test_add(self, x, y, expected):
#         assert my_add(int(x), int(y)) == int(expected)

# 方法四
def get_csv():
    with open('../data/test.csv', encoding='utf-8') as f:
        raw = csv.reader(f)
        data = []
        for line in raw:
            data.append(line)
    return data


class TestWithYAML:
    @pytest.mark.parametrize('x,y,expected', get_csv())
    def test_add(self, x, y, expected):
        assert my_add(int(x), int(y)) == int(expected)

4.pytest结合数据驱动-json

json 文件介绍

  • json 是 JS 对象

  • 全称是 JavaScript Object Notation

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

  • json 结构

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

 json 文件使用

  • 查看 json 文件
    • pycharm
    • txt 记事本
  • 读取 json 文件
    • 内置函数 open()
    • 内置库 json
    • 方法:json.loads()
    • 方法:json.dumps()

 params.json

{
  "case1": [1, 1, 2],
  "case2": [3, 6, 9],
  "case3": [100, 200, 300]
}
import json


def get_json():
    with open('./data/params.json', 'r') as f:
        data = json.loads(f.read())
        print(data)
        print(type(data))

        s = json.dumps(data, ensure_ascii=False)
        print(s)
        print(type(s))

if __name__ == '__main__':
    get_json()

代码示例:

测试准备

  • 被测对象: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]
}
import csv
import json

import openpyxl
import pytest
import yaml

from func.operation import my_add


# 方法一
# class TestWithYAML:
#     @pytest.mark.parametrize('x,y,expected', [[1, 1, 2], [3, 6, 9], [100, 200, 300]])
#     def test_add(self, x, y, expected):
#         assert my_add(int(x), int(y)) == int(expected)

# 方法二
# def get_data():
#     with open("../data/data.yaml", encoding='utf-8') as f:
#         data = yaml.safe_load(f)
#     return data
#
#
# class TestWithYAML:
#     @pytest.mark.parametrize('x,y,expected', get_data())
#     def test_add(self, x, y, expected):
#         assert my_add(int(x), int(y)) == int(expected)

# 方法三
# def get_excel():
#     book = openpyxl.load_workbook("../data/test.xlsx")
#     sheet = book.active
#     cells = sheet["A1":"C3"]
#     values = []
#     for row in cells:
#         data = []
#         for cell in row:
#             data.append(cell.value)
#         values.append(data)
#     return values
#
#
# class TestWithYAML:
#     @pytest.mark.parametrize('x,y,expected', get_excel())
#     def test_add(self, x, y, expected):
#         assert my_add(int(x), int(y)) == int(expected)

# 方法四
# def get_csv():
#     with open('../data/test.csv', encoding='utf-8') as f:
#         raw = csv.reader(f)
#         data = []
#         for line in raw:
#             data.append(line)
#     return data
#
#
# class TestWithYAML:
#     @pytest.mark.parametrize('x,y,expected', get_csv())
#     def test_add(self, x, y, expected):
#         assert my_add(int(x), int(y)) == int(expected)

# 方法五
def get_json():
    with open('../data/params.json', 'r') as f:
        data = json.loads(f.read())
        print(data)
        print(type(data))
        print(list(data.values()))
    return list(data.values())


class TestWithYAML:
    @pytest.mark.parametrize('x,y,expected', get_json())
    def test_add(self, x, y, expected):
        assert my_add(int(x), int(y)) == int(expected)

5.pytest测试用例生命周期管理(一)

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.不传⼊的就不登陆直接执⾏测试⽅法。
import pytest

@pytest.fixture()
def login():
    print('完成登录操作')

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

# def test_cart():
#     login()
#     print('购物车')

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

def test_order(login):
    print('下单功能')

6.pytest测试用例生命周期管理(二)

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

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


@pytest.fixture(scope="function")
def login():
    print('完成登录操作')


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


# def test_cart():
#     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")

7.pytest测试用例生命周期管理(三)

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

  • 场景:

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

  • 解决:

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

  • 步骤:

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

import pytest
'''
@pytest.fixture
def fixture_name():
    setup 操作
    yield 返回值
    teardown 操作
'''

@pytest.fixture(scope="function")
def login():
    #setup操作
    print('完成登录操作')
    tocken = "abcdafafasdfds"
    username = 'tom'
    yield tocken,username #相当于return
    #teardown操作
    print('完成登出操作')

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


# def test_cart():
#     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")

8.pytest测试用例生命周期管理-自动注册

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

  • 场景:

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

  • 解决:

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

  • 前提:

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

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

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

代码示例:

conftest.py

# conftest.py名字是固定的,不能改变
import pytest


@pytest.fixture(scope="function")
def login():
    # setup操作
    print('完成登录操作')
    tocken = "abcdafafasdfds"
    username = 'tom'
    yield tocken, username  # 相当于return
    # teardown操作
    print('完成登出操作')

test_test1.py

import pytest
'''
@pytest.fixture
def fixture_name():
    setup 操作
    yield 返回值
    teardown 操作
'''

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


# def test_cart():
#     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")

项目结构:

9.pytest测试用例生命周期管理-自动生效

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

场景:

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

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

解决:

使⽤ fixture 中参数 autouse=True 实现

步骤:

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

test_test1.py

import pytest

'''
@pytest.fixture
def fixture_name():
    setup 操作
    yield 返回值
    teardown 操作
'''


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


# def test_cart():
#     login()
#     print('购物车')

# def test_cart(login):
#     print('购物车')
def test_cart():
    print('购物车')


# def test_order(login):
#     print('下单功能')

def test_order():
    print('下单功能')


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

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

 conftest.py

# conftest.py名字是固定的,不能改变
import pytest


@pytest.fixture(scope="function", autouse=True)
def login():
    # setup操作
    print('完成登录操作')
    tocken = "abcdafafasdfds"
    username = 'tom'
    yield tocken, username  # 相当于return
    # teardown操作
    print('完成登出操作')

运行结果:

 

 10.pytestfixture实现参数化

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

场景:

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

解决:

fixture 通过固定参数 request 传递

步骤:

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

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

# @pytest.fixture(params=['tom', 'jenny'])
# def login(request):
#     print(f"用户名:{request.param}")
#     return request.param
#
#
# def test_demo1(login):
#     print(f'demo1 case:数据为{login}')

@pytest.fixture(params=[['tom', 'harry'], ['jenny', 'jack']])
def login(request):
    print(f"用户名:{request.param}")
    return request.param


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

Fixture 的用法总结

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

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

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

相关文章

rust-异步学习

rust获取future中的结果 两种主要的方法使用 async: async fn 和 async 块 async 体以及其他 future 类型是惰性的:除非它们运行起来,否则它们什么都不做。 运行 Future 最常见的方法是 .await 它。 当 .await 在 Future 上调用时,它会尝试把…

vue2.29-Vue3跟vue2的区别

1、vue3介绍 更新(和重写)Vue的主要版本时,主要考虑两点因素:首先是新的JavaScript语言特性在主流浏览器中的受支持水平;其次是当前代码库中随时间推移而逐渐暴露出来的一些设计和架构问题。 相较于vue2,vu…

从零开始打造你的书店小程序商城

随着互联网的发展,线上商城成为了书店经营的重要方式之一。如何快速搭建一个符合书店特点的小程序商城呢?下面将为您详细介绍利用乔拓云平台搭建一个符合书店特点的小程序商城的步骤。 首先,登录乔拓云平台,进入商城后台管理页面。…

uniapp两个单页面之间进行传参

1.单页面传参:A --> B url: .....?code JSON.stringify(param), 2.单页面传参B–>Auni.$emit() uni.$on()

Aspose.Imaging for Python via .NET Crack

Aspose.Imaging for Python via .NET Crack Aspose.Imaging for Python via.NET是一个提供高级图像处理功能的库。您可以使用此API轻松创建、加载、操作、转换或压缩图像。另外,Aspose.Imaging for Python通过.NET支持绘图和使用图形基元。图像导出和转换-API的核心…

使用XMLHttpRequest实现文件异步下载

1、问题描述 我想通过异步的方式实现下载文化&#xff0c;请求为post请求。一开始我打算用ajax。 $.ajax({type:post,contentType:application/json,url:http://xxx/downloadExcel,data:{data:JSON.stringify(<%oJsonResponse.JSONoutput()%>)},}).success(function(dat…

旅游系统开源

线上旅游电子商务系统 适用业务场景&#xff1a; 线路、酒店、门票、租车、邮轮、导游、团购、签证、特产、户外、商城等。 支持B2C\B2B2C\B2B业务&#xff0c;支持微信公会号、微信小程序、PC端等等。 源码介绍&#xff1a; 1、采用WEB软件应用最广泛的PHPMYSQL语言 采用B…

4大软件测试策略的特点和区别(单元测试、集成测试、确认测试和系统测试)

四大软件测试策略分别是单元测试、集成测试、确认测试和系统测试。 一、单元测试 单元测试也称为模块测试&#xff0c;它针对软件中的最小单元&#xff08;如函数、方法、类、模块等&#xff09;进行测试&#xff0c;以验证其是否符合预期的行为和结果。单元测试通常由开发人…

单例模式(C++)

定义 保证一个类仅有一个实例&#xff0c;并提供一个该实例的全局访问点。 应用场景 在软件系统中&#xff0c;经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例&#xff0c;才能确保它们的逻辑正确性、以及良好的效率。如何绕过常规的构造器&#xff0c;提供一种…

【Docker】Docker私有仓库的使用

目录 一、搭建私有仓库 二、上传镜像到私有仓库 三、从私有仓库拉取镜像 一、搭建私有仓库 首先我们需要拉取仓库的镜像 docker pull registry 然后创建私有仓库容器 docker run -it --namereg -p 5000:5000 registry 这个时候我们可以打开浏览器访问5000端口看是否成功&…

zookeeper和kafka

目录 一、zookeeper理论 1.1、zookeeper定义 1.2、zookeeper工作机制 1.3、zookeeper特点 1.4、zookeeper的数据结构 1.5、zookeeper应用场景 1.6、zookeeper的选举机制 二、部署Zookeeper 集群 2.1、环境准备 2.2、安装 Zookeeper 2.3、修改配置文件 2.4、配置…

编写第一个 React Native 程序

React Native 目录 使用React Native CLI命令创建的目录如下图所示&#xff1a; 重要目录说明 目录说明__tests__存放测试用例的目录.bundle / config配置文件&#xff08;一般不会用到&#xff09;android 和 IOS 文件夹这两个文件夹主要是存放安卓和 ios 相关的配置文件和…

ESP32学习笔记(52)————三轴加速度ADXL345使用(SPI方式)

一、简介 ADXL345 是一款 ADI 公司推出的基于 iMEMS 技术的超低功耗3轴加速度计&#xff0c;分辨率高(13位)&#xff0c;测量范围达 16g。数字输出数据为 16 位二进制补码格式&#xff0c;可通过 SPI(3线或4线) 或 I2C 数字接口访问。ADXL345 非常适合移动设备应用。它可以在倾…

小研究 - MySQL 分区技术在海量系统日志中的应用

随着信息技术的飞速发展&#xff0c;系统的业务功能不断扩大&#xff0c;产生的日志与日俱增&#xff0c;导致应用软件的运行速度越来越慢&#xff0c;不能很好地满足用户对软件性能的需求。基于此&#xff0c;重点研究了 MySQL 分区技术在大数据量软件日志中的应用&#xff0c…

NamedParameterJdbcTemplate类的作用和使用

NamedParameterJdbcTemplate是Spring框架提供的一个类&#xff0c;用于简化在JDBC操作中使用命名参数的过程。它是对JdbcTemplate的扩展&#xff0c;通过使用命名参数而不是传统的问号占位符&#xff0c;使SQL语句更易读和维护。 NamedParameterJdbcTemplate的作用是&#xff…

cn.hutool.core.date.DateUtil.beginOfDay 方法的作用和使用

cn.hutool.core.date.DateUtil.beginOfDay 方法的作用是返回指定日期的开始时间&#xff0c;即将时、分、秒和毫秒部分设置为 0。 使用 beginOfDay 方法时&#xff0c;可以按照以下步骤进行操作&#xff1a; 导入 cn.hutool.core.date.DateUtil 类。创建一个 java.util.Date …

PPS Tester测量原理和实施方法

怿星科技发布了新品PPS Tester&#xff0c;这是一款基于1PPS方法的时间同步精度测试设备。PPS Tester由硬件模块ETS2110和上位机软件ePPSTester构成。本文将围绕此设备的应用场景&#xff0c;介绍相关概念和设备使用方法。 什么是时间同步&#xff1f; 时间同步就是采取某项技…

涂鸦智能获Matter Non-VID Scoped PAA资质 助力开发者拥抱Matter生态

今年5月&#xff0c;全球化IoT开发者平台涂鸦智能&#xff08;NYSE: TUYA&#xff0c;HKEX: 2391&#xff09;正式生成Tuya Matter PAA密钥根&#xff0c;并于7月&#xff0c;成功通过了连接标准联盟和第三方MA机构审查而上线。自此&#xff0c;涂鸦正式成为全球同时提供支持Ma…

考研算法38天:反序输出 【字符串的翻转】

题目 题目收获 很简单的一道题&#xff0c;但是还是有收获的&#xff0c;我发现我连scanf的字符串输入都忘记咋用了。。。。。我一开始写的 #include <iostream> #include <cstring> using namespace std;void deserve(string &str){int n str.size();int…

STM32 HAL 驱动PM2.5传感器(GP2Y10AU气体检测模块)

目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 ADC外设配置 2.3 串口外设配置 2.4 项目生成 3、KEIL端程序整合 3.1 串口重映射 3.2 ADC数据采集 3.3 主函数代 3.4 效果展示 1、简介 本文通过STM32F103C8T6单片机通过HAL库方式对G…