当前位置: 首页 > news >正文

软件测试经理工作日常随记【7】-接口+UI自动化(多端集成测试)

软件测试经理工作日常随记【7】-UI自动化(多端集成测试)

自动化测试前篇在此

前言

今天开这篇的契机是,最近刚好是运维开发频繁更新证书的,每次更新都在0点,每次一更新都要走一次冒烟流程。为了不让我的美容觉被阉割!(bushi)为了方便同事儿,不用每次更新都求爷告奶地通知大家辛苦半夜走一遍测试。我紧赶慢赶,于是有了此。因为此次冒烟涉及三个端,其中两个端采用接口自动化,另外一个端采用UI自动化,集成运行。

正文

工具类

用于UI自动化的工具类
# utils.py 用于UI自动化的工具类,包含在pc端有界面的执行和linux服务器无界面的执行(本段代码以linux服务器无界面运行为例)
"""
设置驱动
驱动停止
获取弹窗信息
获取data数据
"""
import json
import timeimport allure
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from log.log import Loggerclass UtilsDriver:@classmethoddef get_driver(cls):""":return:浏览器驱动"""if cls._driver is None:# 创建一个ChromeOptions对象chrome_options = Options()  # (linux服务运行1)# 添加--headless参数来启用无头模式chrome_options.add_argument("--headless")  # (linux服务运行2)# 指定ChromeDriver的路径(如果不在PATH环境变量中)# driver_path = '/path/to/chromedriver'# driver = webdriver.Chrome(executable_path=driver_path, options=chrome_options)# 如果ChromeDriver已经在PATH中,或者你可以直接调用它,则可以省略executable_pathcls._driver = webdriver.Chrome(options=chrome_options)  # (linux服务运行3)# cls._driver = webdriver.Chrome()  # 谷歌(如在pc电脑有UI界面则不执行以上服务器执行的步骤,执行该行代码)cls._driver.maximize_window()cls._driver.implicitly_wait(5)cls._driver.get("http://********") time.sleep(1)return cls._driver@classmethod"""关闭浏览器驱动"""def quit_driver(cls):if cls._driver is not None:cls.get_driver().quit()cls._driver = None@classmethod"""获取元素信息:用于断言"""def get_mes(cls, xpath):return UtilsDriver.get_driver().find_element(By.XPATH, xpath).text@classmethoddef get_mes_wait(cls, xpath):"""显性等待获取元素信息"""wait = WebDriverWait(UtilsDriver.get_driver(), 10, 1)element = wait.until(lambda x: x.find_element(By.XPATH, xpath))return element@classmethoddef get_mes_s(cls, xpath):""":param xpath: 元素的路径:return: 返回的是以元素列表,不可以直接取text,只能用for循环历遍各个元素并读取文本值"""eles = UtilsDriver.get_driver().find_elements(By.XPATH, xpath)alist = []for ele in eles:ele_mes = ele.textalist.append(ele_mes)print(alist)return alist@classmethod"""显性等待获取元素定位"""def get_element_utils_wait(cls, location):  # page页对象层的基类,显式等待wait = WebDriverWait(UtilsDriver.get_driver(), 10, 1)element_wait = wait.until(lambda x: x.find_element(By.XPATH, location))return element_wait@classmethoddef get_elements(cls, xpath):""":param xpath: 表示元素定位的路径:return: 返回找到的元素"""return UtilsDriver.get_driver().find_elements(By.XPATH, xpath)@classmethoddef get_attribute(cls, xpath, attribute):"""以元素的属性值来断言,断言前必须延迟2s:param xpath: 找到元素的路径,只取到前面的标签,然后根据标签中的元素名来判断属性值对不对:param attribute: 标签中的元素名:return: 属性值"""return UtilsDriver.get_driver().find_element(By.XPATH, xpath).get_attribute(attribute)@classmethoddef get_text(cls, xpath, expected_msg, xpath2, expected_msg2):"""有两个断言元素获取元素的文本来断言,断言前必须延迟2s:param xpath: 定位元素的路径1:param expected_msg: 断言参数1:param xpath2: 定位元素的路径2:param expected_msg2: 断言参数2"""actual_mes = UtilsDriver.get_driver().find_element(By.XPATH, xpath).textactual_mes2 = UtilsDriver.get_driver().find_element(By.XPATH, xpath2).textprint("生成截图")allure.attach(UtilsDriver.get_driver().get_screenshot_as_png(), "截图",allure.attachment_type.PNG)print("第一个断言的实际mes:" + actual_mes + "第一个断言的预期结果" + expected_msg)Logger.logger_in().info("第一个断言的实际mes:" + actual_mes + ";第一个断言的预期结果" + expected_msg)print("第二个断言的实际mes:" + actual_mes2 + "第二个断言的预期结果:" + expected_msg2)Logger.logger_in().info("第二个断言的实际mes:" + actual_mes2 + ";第二个断言的预期结果:" + expected_msg2)assert expected_msg in actual_mesprint("1断言成功!")Logger.logger_in().info('1断言成功!')assert expected_msg2 in actual_mes2print("2断言成功!")Logger.logger_in().info('2断言成功!')@classmethoddef get_text_1(cls, xpath, expected_msg):"""有一个断言元素获取元素的文本来断言,断言前必须延迟2s:param xpath:找到元素的路径,只取到前面的标签,然后根据标签中的元素名来判断属性值对不对:param expected_msg:期待定位的元素获取的值"""actual_mes = UtilsDriver.get_driver().find_element(By.XPATH, xpath).text# actual_mes2 = UtilsDriver.get_driver().find_element(By.XPATH, xpath2).textprint("生成截图")allure.attach(UtilsDriver.get_driver().get_screenshot_as_png(), "截图",allure.attachment_type.PNG)print("实际mes:" + actual_mes + "预期结果" + expected_msg)Logger.logger_in().info("实际mes:" + actual_mes + ";预期结果" + expected_msg)assert expected_msg in actual_mesprint("1断言成功!")Logger.logger_in().info('1断言成功!')
用于接口自动化的工具类
# utils_api.py,用于接口自动化的工具类
"""
设置驱动
驱动停止
获取弹窗信息
获取data数据
"""
import datetime
import requests
from log.log import Loggerclass RequestUtils:session = requests.session()@classmethod"""定义发送请求的方法,参数为data"""def send_request_data(cls, url, method, data, **kwargs):try:Logger.logger_in().info('-----------------{}接口开始执行-----------------'.format(url))response = RequestUtils.session.request(url=url, method=method, data=data, **kwargs)Logger.logger_in().info('接口请求成功,响应值为:{}'.format(response.text))return responseexcept Exception as e:Logger.logger_in().error('接口请求失败,原因为:{}'.format(repr(e)))return e@classmethod"""定义发送请求的方法,参数为json"""def send_request_json(cls, url, method, data, **kwargs):try:Logger.logger_in().info('-----------------{}接口开始执行-----------------'.format(url))print('-----------------{}接口开始执行-----------------'.format(url))response = RequestUtils.session.request(url=url, method=method, json=data, **kwargs)Logger.logger_in().info('接口请求成功,响应值为:{}'.format(response.text))Logger.logger_in().info('请求体为:{}'.format(response.request.body))print('请求体为:{}'.format(response.request.body))print('接口请求成功,响应值为:{}'.format(response.text))return responseexcept Exception as e:Logger.logger_in().error('接口请求失败,原因为:{}'.format(repr(e)))return e@classmethod"""定义发送请求的方法(get请求,参数为拼接方式),参数为dicts(dicts = {'a': 1, 'b': 2, 'c': 3})"""def send_request_splicing(cls, dicts, url):  # 对应请求的入参及请求的函数Logger.logger_in().info('-----------------{}接口开始执行-----------------'.format(url))print('-----------------{}接口开始执行-----------------'.format(url))def parse_url(data: dict): # 将一个字典(data)转换成一个 URL 查询字符串(query string)item = data.items()urls = "?"for i in item:(key, value) = itemp_str = key + "=" + valueurls = urls + temp_str + "&"urls = urls[:len(urls) - 1]print('请求体为:{}'.format(urls))Logger.logger_in().info('请求体为:{}'.format(urls))return urlsresponse = RequestUtils.session.get(url + parse_url(dicts))Logger.logger_in().info('接口请求成功,响应值为:{}'.format(response.json()))print('接口请求成功,响应值为:{}'.format(response.json()))print(response.json()["data"][0]["a"]) #json串被解析为一个字典,data对应的值是一个列表,列表包含字典,取data列表的第一个字典中a键对应的值return response

base类

用于ui自动化定位元素继承使用

# base_ui.py
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from utils_app import UtilsDriverclass BaseApp:def __init__(self):print("引用基类:BaseApp")self.driver = UtilsDriver.get_app_driver()  # get_driver方法的引用就有隐形等待# self.driver.implicitly_wait(10)print("已获取app驱动")def get_element(self, location):  # page页对象层的基类,显式等待wait = WebDriverWait(self.driver, 10, 1)element = wait.until(lambda x: x.find_element(location))return elementdef get_elements(self, xpath):""":param xpath: 表示元素定位的路径:return: 返回找到的元素"""wait = WebDriverWait(self.driver, 10, 1)element = wait.until(lambda x: x.find_element(By.XPATH, xpath))return elementdef get_element_id(self, ID):""":param ID::return:"""wait = WebDriverWait(self.driver, 15, 1)element = wait.until(lambda x: x.find_element(By.ID, ID))return elementdef get_element_text(self, XPATH):wait = WebDriverWait(self.driver, 15, 1)element = wait.until(lambda x: x.find_element(By.XPATH, XPATH))return elementdef get_app_element(self, location):wait = WebDriverWait(self.driver, 15, 1)element = wait.until(lambda x: x.find_element(*location))return elementdef get_element_wait(self, location):# page页对象层的基类,显式等待# (定义等待条件,当条件发生时才执行后续代码。程序会轮询查看条件是否发生(默认 10 秒),# 如果条件成立则执行下一步,否则继续等待,直到超过设置的最长时间,程序抛出异常。)# 相较于隐性等待,这个显性等待要明确等待条件和等待上限。比如隐性等待,只要元素存在,可找到就可以,但显性等待,我要明确条件是我的元素可见。而元素存在,并不一定是元素可见。# 显性等待的场景:操作引起了页面的变化,而接下来要操作变化的元素的时候,就需要使用显性等待wait = WebDriverWait(self.driver, 10, 1)element_wait = wait.until(lambda x: x.find_element(By.XPATH, location))return element_waitdef get_switch_to_frame(self, ida):self.driver.implicitly_wait(10)ele_frame = self.driver.find_element(By.ID, ida)return self.driver.switch_to.frame(ele_frame)def get_element_1(self, xpath):""":param xpath: 表示元素定位的路径:return: 返回找到的元素"""self.driver.implicitly_wait(10)return self.driver.find_element(By.XPATH, xpath)class BaseHandle:def input_text(self, element, text):""":param element: 表示元素得对象:param text: 表示要输入的内容:return:"""element.clear()element.send_keys(text)

log类

用于记录所有执行目录

# log.py
import logging
import datetime
import osclass Logger:__logger = None@classmethoddef logger_in(cls):if cls.__logger is None:# 创建日志器cls.__logger = logging.getLogger("APIlogger")cls.__logger.setLevel(logging.DEBUG)# 判断是否存在handler,不然每次都会新建一个handler,导致日志重复输出if not cls.__logger.handlers:# 获取当前日期为文件名,年份最后2位+月份+日期file_name = str(datetime.datetime.now().strftime('%g' + '%m' + "%d")) + '.log'# 创建处理器handler = logging.FileHandler(os.path.join('', file_name))# handler = logging.StreamHandler()# 创建格式器formatter = logging.Formatter('%(asctime)s [%(filename)s:%(lineno)d] %(levelname)s  %(message)s','%Y-%m-%d %H:%M:%S')cls.__logger.addHandler(handler)handler.setFormatter(formatter)return cls.__logger

page类

用于定位UI元素

形成业务用例的执行流程(以登录为例)

# page_ui.py
import timeimport allurefrom utils import UtilsDriver
from base.base_page import BasePage
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
from log.log import Loggerclass PageLogin(BasePage):  # 对象库层def __init__(self):super().__init__()def find_username(self):return self.get_element_1("//*/input[@placeholder='用户名']")def find_password(self):return self.get_element_1("//*/input[@placeholder='密码']")def find_login_bt(self):return self.get_element_1("(//div[contains(text(),'登录')])")class HandleLogin: # 操作层def __init__(self):self.driver = UtilsDriver.get_driver()self.login_page = PageLogin()self.keys = Keys()self.ac = ActionChains(self.driver)def click_and_input_find_username(self, username):  # 点击用户名输入框self.login_page.find_username().click()for i in range(10):self.login_page.find_username().send_keys(Keys.BACK_SPACE)  # 无法使用clear,只能点10次BACK_SPACEself.login_page.find_username().send_keys(username)def click_and_input_find_password(self, password):self.login_page.find_password().click()for i in range(20):self.login_page.find_password().send_keys(Keys.BACK_SPACE)  # 无法使用clear,只能点10次BACK_SPACEself.login_page.find_password().send_keys(password)def click_login_bt(self):self.login_page.find_login_bt().click()class LoginProxy: # 业务层def __init__(self):self.handle_login = HandleLogin()def login(self, username, password, xpath, expected_msg, xpath2, expected_msg2):time.sleep(1)self.handle_login.click_and_input_find_username(username)print("输入用户名")Logger.logger_in().info('输入用户名!')self.handle_login.click_and_input_find_password(password)print("输入密码")Logger.logger_in().info('输入密码!')self.handle_login.click_login_bt()print("点击登录")Logger.logger_in().info('点击登录!')time.sleep(2)UtilsDriver.get_text(xpath, expected_msg, xpath2, expected_msg2)
用于封装请求+断言的方法

会引用到utils_api.py中的方法

# page_api.py
class PageUrl:def __init__(self):self.session = requests.session()def post(self, url, method, data, assert_msg):response = RequestUtils().send_request_json(url, method, data)print("实际response:" + response.text + ";预期响应:" + assert_msg)assert response.text in assert_msgreturn responsedef get(self, url, params, assert_msg):  # 对应请求的断言的函数response = RequestUtils().send_request_splicing(url, params)print("实际response:" + str(response.json()) + ";预期响应:" + assert_msg)print("实际response.json()[‘data’][0][‘a’]:" + response.json()["data"][0]["a"])assert response.json()["data"][0]["a"] == assert_msgreturn response

test文件

接口自动化脚本的入口

# test_api.py
import os
import allure
import time
import sys
import pytest
import hashlib
import urllib.parse
# from page.page_login import LoginProxy
from page_url.page_url import PageUrl
from utils_app import DbMysql
from utils_url_def import RequestUtils  # 有导入就有可能执行
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)class TestUrl:def setup_class(self):  # 实例化page中的业务对象"""pytest中的测试类必须以“Test”开头,且不能有init方法你试下把"Login_test"更改以“Test”开头的命名如果还不行的话文件名更改成“test_”开头或者以“_test”结尾因为pytest命名规范有3点:文件名以“test_”开头或者以“_test”结尾测试类必须以“Test”开头,且不能有init方法测试方法必须以test开头"""self.page_url = PageUrl()self.absolute_xpath = os.path.abspath(os.path.dirname(os.getcwd()))print("当前文件路径:"+BASE_DIR)  # 输入当前的文件路径@pytest.mark.run(order=1)# 执行顺序,数字越小越先执行@allure.title("用例名")  # 命名用例名称方式1@allure.severity(allure.severity_level.CRITICAL)# 关键用例@pytest.mark.skipif(condition=True, reason="暂停")  # 跳过@pytest.mark.parametrize("参数名1,参数名2,参数名3,参数名4,参数名5,参数名6",[(f'{RequestUtils.参数A1}', f'{RequestUtils.参数B1}', 1,  '', '断言1'), (f'{RequestUtils.参数A2}', f'{RequestUtils.参数B2}', 1,  '', '断言2'),]) # 参数化,可用于执行多条用例; ''表参数为空def test_001_entrance(self, A, B, C, D, E, assert_msg):data = {"a": 1,"b": 2}self.page_url.patrol_add_new_001("http:***", "post", data, assert_msg)  time.sleep(2)@pytest.mark.run(order=2) # 执行顺序,数字越小越先执行@allure.title("用例名2")  # 命名用例名称方式1@allure.severity(allure.severity_level.NORMAL)# 正常级别用例# @pytest.mark.skipif(condition=True, reason="暂停")  # 暂停%s,%RequestUtils.test_numberdef test_003_wechat_api(self):dicts = {'a': 1, 'b': 2}url = "http:***"time.sleep(2)self.page_url.wechat_public_account_api(dicts, url, RequestUtils.test_number2)time.sleep(0.3)

UI自动化脚本的入口

# test_ui.py
"""
以模块名称作为测试套件的名称,不要全部堆在一个测试套件里
[pytest]#标识当前配置文件是pytest的配置文件
addopts=-s -v #标识pytest执行的参数
testpaths=./scripts #匹配搜索的目录
python_files=test_*.py #匹配搜索的文件
python_classes=Test* #匹配搜索的类
python_functions=test_* #匹配测试的方法执行结果生成测试报告步骤
1先生成json数据---pytest 测试文件(在pytest.ini在addopts参数后+--alluredir report2)
2再把生成的json生成测试报告---allure generate report/ -o report/html --clean
allure generate report2/ -o report2/html --clean
注意目录的路径及名称
"""
import os
import allure
import time
import datetime
import sys
import pytest
from page.page_login import LoginProxy
from page_url.page_url import PageUrl
from page.page_inside_the_road_in_backstage import InsideTheRoadProxy
from page.page_finance_in_backstage import FinanceProxy
from utils import UtilsDriver
from utils_url_def import RequestUtils
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)class TestLogin:def setup_class(self):  # 实例化page中的业务对象"""pytest中的测试类必须以“Test”开头,且不能有init方法你试下把"Login_test"更改以“Test”开头的命名如果还不行的话文件名更改成“test_”开头或者以“_test”结尾因为pytest命名规范有3点:文件名以“test_”开头或者以“_test”结尾测试类必须以“Test”开头,且不能有init方法测试方法必须以test开头"""self.driver = UtilsDriver.get_driver()self.driver.implicitly_wait(6)self.login_proxy = LoginProxy()self.inside_the_road_proxy = InsideTheRoadProxy()self.finance_proxy = FinanceProxy()self.page_url = PageUrl()self.current_time = str(datetime.datetime.now().strftime("%Y-%m-%d"))self.absolute_xpath = os.path.abspath(os.path.dirname(os.getcwd()))print("当前文件路径:"+BASE_DIR)  # 输入当前的文件路径print(self.current_time)def teardown_class(self):time.sleep(3)UtilsDriver.get_driver().quit()@allure.step(title="正向登录")@allure.title("用例名字")@allure.severity(allure.severity_level.BLOCKER)# 冒烟测试用例@pytest.mark.run(order=4)# @pytest.mark.skipif(condition=True, reason="暂停")  # 跳过该用例def test_001_login(self):self.login_proxy.login(UtilsDriver.user,UtilsDriver.pwd,UtilsDriver.login_actual_xpath,UtilsDriver.login_expected_mes,UtilsDriver.login_actual_xpath,UtilsDriver.login_expected_mes)#在UtilsDriver的方法中订单变量login_expected_mes

main文件

# main.py
import os
import pytest
if __name__ == '__main__':pytest.main()  # 这里已经执行了pytest.ini成为临时文件了(pytest的配置文件自己根据需求配置)os.system("allure generate report/ -o report/html --clean")  # 再次生成测试报告

依赖库

# requirements.txt
allure_python_commons==2.13.5
Appium_Python_Client==2.11.0
Appium_Python_Client==4.0.1
PyMySQL==1.1.0
pytest==8.1.1
Requests==2.32.3
selenium==4.23.1

后言

以上为多端集成联动测试的完全代码,也包含UI自动化和接口自动化的结合,用的是pytest框架,执行后自动生成allure测试报告。

相关文章:

软件测试经理工作日常随记【7】-接口+UI自动化(多端集成测试)

软件测试经理工作日常随记【7】-UI自动化(多端集成测试) 自动化测试前篇在此 前言 今天开这篇的契机是,最近刚好是运维开发频繁更新证书的,每次更新都在0点,每次一更新都要走一次冒烟流程。为了不让我的美容觉被阉割…...

软考:软件设计师 — 9.数据流图

九. 数据流图 数据流图是下午场考试中第一个题目,分值 15 分。通常会考察实体名、存储名、加工名的补充,以及找到缺失的数据流并改正等。 1. 数据平衡原则 数据流的分析依赖于数据平衡原则。 父图与子图之间的平衡 父图与子图之间平衡是指任何一张 …...

收银系统源码-门店折扣活动应该怎么做

系统概况: 专门为零售行业的连锁店量身打造的收银系统,适用于常规超市、生鲜超市、水果店、便利店、零食专卖店、服装店、母婴用品、农贸市场等类型的门店使用。同时线上线下数据打通,线下收银的数据与小程序私域商城中的数据完全同步&#…...

Python数值计算(12)——线性插值

1. 概述 插值是根据已知的数据序列(可以理解为你坐标中一系列离散的点),找到其中的规律,然后根据找到的这个规律,来对其中尚未有数据记录的点进行数值估计的方法。最简单直观的一种插值方式是线性插值,它是…...

TypeScript(switch判断)

1.switch 语法用法 switch是对某个表达式的值做出判断。然后决定程序执行哪一段代码 case语句中指定的每个值必须具有与表达式兼容的类型 语法switch(表达式){ case 值1: ​ 执行语句块1 break; case 值2: ​ 执行语句块3 break; dfault: //如…...

血细胞自动检测与分类系统:深度学习与UI界面的结合

一、项目概述 项目背景 在医学实验室中,血细胞的检测和分类是诊断和研究的重要环节。传统方法依赖于人工显微镜检查,费时且容易出现误差。通过深度学习技术,特别是目标检测模型YOLO,可以实现自动化、快速且准确的血细胞检测和分…...

鸿蒙Flex布局

效果: 代码: 换行代码参数设置: wrap:FlexWrap.Wrap Entry Component struct FlexCase {State message: string Hello World;build() {Flex({direction:FlexDirection.Row,justifyContent:FlexAlign.SpaceAround,alignItems:ItemAlign.Cen…...

开发自己的 Web 框架

开发自己的 Web 框架 开发Web服务器主体程序开发Web框架程序使用模板来展示响应内容开发框架的路由列表功能采用装饰器的方式添加路由电影列表页面的开发案例 接收web服务器的动态资源请求,给web服务器提供处理动态资源请求的服务。根据请求资源路径的后缀名进行判断…...

用于自动驾驶的基于立体视觉的语义 3D 对象和自我运动跟踪

Stereo Vision-based Semantic 3D Object and Ego-motion Tracking for Autonomous Driving 论文 摘要: 我们提出了一种基于立体视觉的方法,用于在动态自动驾驶场景中跟踪相机自我运动和 3D 语义对象。我们建议使用易于标记的 2D 检测和离散视点分类以及…...

Spring@Autowired注解

Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。 因此,引入Autowired注解…...

32.x86游戏实战-使用物品call

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…...

Prometheus+Alertmanager+邮件告警

参考node_exporter-CSDN博客,球球不要断更!!!! 大致流程 1.部署promethus 可以写一个自定义的 systemd 服务启动文档,详情见自定义的 systemd 服务启动方式-CSDN博客 [rootlocalhost system]# sudo tee /e…...

upload-labs漏洞靶场~文件上传漏洞

寻找测试网站的文件上传的模块,常见:头像上传,修改上传,文件编辑器中文件上传,图片上传、媒体上传等,通过抓包上传恶意的文件进行测试,上传后缀名 asp php aspx 等的动态语言脚本,查…...

PostgreSQL 高阶函数详解:全面深入的功能与实用示例

PostgreSQL 高阶函数详解 PostgreSQL 是一款功能强大的开源关系数据库管理系统,以其丰富的功能和高扩展性著称。在数据处理和分析方面,PostgreSQL 提供了一系列高阶函数,可以极大地简化和优化各种复杂操作。本文将详细介绍 PostgreSQL 的高阶…...

Redis——集合 SET

目录 1. 添加元素 SADD 2. 查看元素 SMEMBERS 3. 判断元素是否存在该集合 SISMEMBER 4. 删除元素 SREM 集合 SET 是一种无序集合;因此其与列表有以下区别: (1)列表是有序的,集合是无序的; &#xff0…...

openEuler安装docker

1.下载地址 搜索docker 寻找docker-ce 复制地址 2.配置仓库 [rootlocalhost yum.repos.d]# pwd /etc/yum.repos.d [rootlocalhost yum.repos.d]# vim docker-ce.repo [docker-ce] namedocker baseurlhttps://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable/ gpgche…...

每天一个数据分析题(四百六十五)- 缺失值

某连续型变量的数据集存在缺失值,可以采用哪种方法处理? A. 插值法填补 B. EM算法填补 C. 随机森林填补 D. 以上均不对 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖Pytho…...

干货 | 变频器的详细介绍

变频器简述 变频器是电机控制领域中常见的一种设备,也称变频调节器,是一种将固定频率的交流电转换为可调频率的交流电的电力电子设备,用于控制交流电机的转速和输出功率。变频器通过调节输出电源的电压和频率,从而控制电动机的转速…...

Linux线程2

线程相关函数 线程分离--pthread_detach(后面会详细讲) 函数原型:int pthread_datach(pthread_t thread); 调用该函数之后不需要 pthread_join 子线程会自动回收自己的PCB 杀死(取消)线程--pthread_cancel 取…...

乱弹篇(40)人类追求长寿

不要认为只有中国的老龄化才严重,实际上全球都面临老龄化,其中日本最为严重。 这是随着人类生活和医学水平的不断提高,寿命才会比过去数十年有了大幅度的提升。据资料显示,目前全球平均预期寿命估计为73岁。与百年之前相比&#…...

技术详解:互联网医院系统源码与医保购药APP的整合开发策略

本篇文章,小编将从系统架构、数据安全、用户体验和技术实现等方面详细探讨互联网医院系统与医保购药APP的整合开发策略。 一、系统架构 1.模块化设计 互联网医院系统与医保购药APP的整合需要采用模块化设计。 2.微服务架构 每个功能模块作为一个独立的微服务&am…...

N4 - Pytorch实现中文文本分类

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目录 任务描述步骤环境设置数据准备模型设计模型训练模型效果展示 总结与心得体会 任务描述 在上周的任务中,我们使用torchtext下载了托管的英文的…...

centos 如何安装sox音视频处理工具

要在 CentOS 系统上安装 Sox 音频处理软件,你可以遵循以下步骤。请注意,这些说明适用于 CentOS 7,对于 CentOS 8 及更高版本,某些包管理命令可能略有不同。 第一步:安装所需的依赖库 首先,你需要安装一系列…...

Java语言程序设计——篇十一(2)

🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳&…...

Linux 应急响应靶场练习 1

靶场在知攻善防实验室公众号中可以获取 前景需要:小王急匆匆地找到小张,小王说"李哥,我dev服务器被黑了",快救救我!! 挑战内容: (1)黑客的IP地址 (2&#xff0…...

AWS-Lambda的使用

介绍 Lambda 是一种无服务器(Serverless), 而且设计成事件驱动的计算服务器. 简单来说, 你可以将你的 code 上传, 当有事件产生(例如cronjob , 或者S3有新的文件被上传上來) , 你的code 就会在瞬间(零点几秒以內)被叫起來执行. 由于你不用管 Server如何维护, 或者自动扩展之类…...

python3.12 搭建MinerU 环境遇到的问题解决

报错: AttributeError: module pkgutil has no attribute ImpImporter. Did you mean: zipimporter? ERROR: Exception: Traceback (most recent call last):File "D:\ipa_workspace\MinerU\Lib\site-packages\pip\_internal\cli\base_command.py", …...

基于SpringBoot+Vue的流浪猫狗救助救援网站(带1w+文档)

基于SpringBootVue的流浪猫狗救助救援网站(带1w文档) 基于SpringBootVue的流浪猫狗救助救援网站(带1w文档) 该流浪猫狗救助救援网站在Windows平台下完成开发,采用java编程语言开发,将应用程序部署于Tomcat上,加之MySQL接口来实现交互式响应服…...

56_AOP

AOP使用案例 如何进行数据库和Redis中的数据同步?/ 你在项目的那些地方使用了aop?答:可以通过Aop操作来实现数据库和Redis中的数据同步。/ 通过Aop操作来实现数据库和Redis中的数据同步。可以定义一个切面类,通过对控制器下的所有…...

安装了h5py,使用报错ImportError: DLL load failed while importing _errors

使用pip 安装了h5py,但是运行代码报错; from . import _errorsImportError: DLL load failed while importing _errors: 找不到指定的程序。 原因: 可能和不正确安装h5py这个包有关系 解决: pip uninstall h5py 换成使用conda…...

化工厂建设网站/韩国vs加纳分析比分

1、问题描述:python的数据类型字典,键值key为英文字母的时候,如何给其排序? 2、问题解决: info {wudang:zhangsanfeng,shaolin:damo,emei:guoxiang} info_sorted sorted(info.items(), keylambda v:v[0]) # 最终排序…...

汽车音响网站建设/2022网站快速收录技术

————— 第二天 —————————————————首先&#xff0c;我们来定义一个Product类&#xff1a;public class Product {ArrayList<String> parts new ArrayList<String>();public void add(String part) {parts.add(part);}public void show() {S…...

wordpress更换域名所有页面404/个人接外包项目平台

Oracle数据库首先有个数据库名&#xff0c;另外还可以设置一个域名&#xff0c;全局数据库名实际上就是数据库名域名。例如数据库名叫orcl&#xff0c;域名叫做abc.com&#xff0c;那么全局数据库名就叫orcl.abc.com. SID是数据库的系统标识符&#xff0c;一般是通过设置环境变…...

重庆本地建站/郑州seo外包阿亮

1.首先你要有一个github账号,如果没有的话,登录网址注册&#xff1a;https://github.com/ 2.进入你的github 点击右上角的号 选择 New repository 3.取一个Repository name&#xff0c;不能和自己的其他项目冲突 PS&#xff1a;Repository name: 仓库名称Description(可选…...

教育网站建设的策划/常用的seo查询工具

对于大数据&#xff0c;相信大家已经不再陌生&#xff0c;大数据技术承载着科技的未来&#xff0c;无论是应用于医疗还是应用于人工智能&#xff0c;根据互联网的发展&#xff0c;我们可以预测的就是大数据的未来身影应该无处不在&#xff0c;就算无法准确预测大数据终会将人类…...

个人作品集网站模板免费下载/荨麻疹怎么治疗能除根

https://blog.csdn.net/github_37512301/article/details/75675054 一、关联模型在关系型数据库中&#xff0c;表之间有一对一、一对多、多对多的关系。在 TP5 中&#xff0c;实现了ORM (Object Relational Mapping) 的思想&#xff0c;通过在模型中建立模型间的关联&#xff0…...