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

python excel接口自动化测试框架!

今天采用Excel继续写一个接口自动化测试框架。

设计流程图

这张图是我的excel接口测试框架的一些设计思路。

首先读取excel文件,得到测试信息,然后通过封装的requests方法,用unittest进行测试。

其中,接口关联的参数通过正则进行查找和替换,为此我专门开辟了一个全局变量池,用于管理各种各样的变量。

最后通过HTMLrunner生成测试报告。如果执行失败,发送测试报告结果邮件。

图片

Excel和结果预览

这个时excel的测试测试用例组织结构图。

图片

这个是运行之后生成的HTML测试报告。

图片

这个时运行之后生成的excel报告。可以看到我故意在预期正则中设置了错误的值,然后用例失败的同时也把失败的预期值标记出来了。

图片

测试失败之后收到的邮件

图片

好了上面就是一些简单的介绍,我们开始进入正题把。

框架结构

首先,要开发这样一个excel接口自动化测试项目必须有一个设计清晰的思路,这样我们在开发框架的过程中才会明白自己要干什么。【关注我的vx公众号:程序员小濠免费获取一份13G的软件测试资源】

图片

Excel相关

用例设计

本次依然采用的是智学网登录接口。使用了智学网中的登录接口和登录验证接口,这两个接口之间有依赖的参数。

配置文件

在项目的根目录创建config.py,把你能想到的配置信息,全部丢在这个文件中进行统一的管理。

#!/usr/bin/env python3
# coding=utf-8
import osclass CF:"""配置文件"""# 项目目录BASE_DIR = os.path.abspath(os.path.dirname(__file__))# Excel首行配置NUMBER = 0NAME = 1METHOD = 2URL = 3ROUTE = 4HEADERS = 5PARAMETER = 6  # 参数EXPECTED_CODE = 7  # 预期响应码EXPECTED_REGULAR = 8  # 预期正则EXPECTED_VALUE = 9  # 预期结果值SPEND_TIME = 10  # 响应时间TEST_RESULTS = 11  # 测试结果EXTRACT_VARIABLE = 12  # 提取变量RESPONSE_TEXT = 13  # 响应文本# 字体大小FONT_SET = "微软雅黑"FONT_SIZE = 16# 颜色配置COLOR_PASSED = "90EE90"COLOR_FAILED = "FA8072"# 邮箱配置EMAIL_INFO = {'username': '1084502012@qq.com','password': 2,'smtp_host': 'smtp.qq.com','smtp_port': 465}# 收件人ADDRESSEE = ['1084502012@qq.com']if __name__ == '__main__':print(CF.EXPECTED_CODE)

读取/写入excel

在common目录中新建excelset.py文件,在这个文件中我们要实现,读取excel中的用例,写入测试结果并绘制相应的颜色,写入测试耗费时长。

#!/usr/bin/env python
# coding=utf-8
import shutil
import openpyxl
from config import CF
from openpyxl.styles import Font
from openpyxl.styles import PatternFill
from common.variables import VariablePoolclass ExcelSet:"""Excel配置"""def __init__(self):shutil.copyfile(VariablePool.get('excel_input'), VariablePool.get('excel_output'))self.path = VariablePool.get('excel_output')self.wb = openpyxl.load_workbook(self.path)self.table = self.wb.activedef get_cases(self, min_row=2):"""获取用例"""all_cases = []for row in self.table.iter_rows(min_row=min_row):all_cases.append((self.table.cell(min_row, CF.NAME + 1).value,min_row, [cell.value for cell in row]))min_row += 1return all_casesdef write_color(self, row_n, col_n, color=CF.COLOR_FAILED):"""写入颜色"""cell = self.table.cell(row_n, col_n + 1)fill = PatternFill("solid", fgColor=color)cell.fill = filldef write_results(self, row_n, col_n, value, color=True):"""写入结果"""cell = self.table.cell(row_n, col_n + 1)cell.value = valuefont = Font(name=CF.FONT_SET, size=CF.FONT_SIZE)cell.font = fontif color:if value.lower() in ("fail", 'failed'):fill = PatternFill("solid", fgColor=CF.COLOR_FAILED)cell.fill = fillelif value.lower() in ("pass", "ok"):fill = PatternFill("solid", fgColor=CF.COLOR_PASSED)cell.fill = fillself.wb.save(self.path)excel_set = ExcelSet()
if __name__ == '__main__':print(excel_set.get_cases())

日志封装

logger.py

在一个项目中日志是必不可少的东西,可以第一时间反馈问题。

#!/usr/bin/env python3
# coding=utf-8
import os
import logging
from config import CF
from datetime import datetimeclass Logger:def __init__(self):self.logger = logging.getLogger()if not self.logger.handlers:self.logger.setLevel(logging.DEBUG)# 创建一个handler,用于写入日志文件fh = logging.FileHandler(self.log_path, encoding='utf-8')fh.setLevel(logging.DEBUG)# 创建一个handler,用于输出到控制台ch = logging.StreamHandler()ch.setLevel(logging.INFO)# 定义handler的输出格式formatter = logging.Formatter(self.fmt)fh.setFormatter(formatter)ch.setFormatter(formatter)# 给logger添加handlerself.logger.addHandler(fh)self.logger.addHandler(ch)@propertydef log_path(self):logs_path = os.path.join(CF.BASE_DIR, 'logs')if not os.path.exists(logs_path):os.makedirs(logs_path)now_month = datetime.now().strftime("%Y%m")return os.path.join(logs_path, '{}.log'.format(now_month))@propertydef fmt(self):return '%(levelname)s %(asctime)s %(filename)s:%(lineno)d %(message)s'log = Logger().logger
if __name__ == '__main__':log.info("你好")

正则操作

regular.py

在接口关联参数的提取和传参中的起到了决定性的作用。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import re
from utils.logger import log
from common.variables import VariablePool
from core.serialize import is_json_strclass Regular:"""正则类"""def __init__(self):self.reg = re.compiledef finds(self, string):return self.reg(r'\{{(.*?)}\}').findall(string)def subs(self, keys, string):result = Nonelog.info("提取变量:{}".format(keys))for i in keys:if VariablePool.has(i):log.info("替换变量:{}".format(i))comment = self.reg(r"\{{%s}}" % i)result = comment.sub(VariablePool.get(i), string)log.info("替换结果:{}".format(result))return resultdef find_res(self, exp, string):"""在结果中查找"""if is_json_str(string):return self.reg(r'\"%s":"(.*?)"' % exp).findall(string)[0]else:return self.reg(r'%s' % exp).findall(string)[0]if __name__ == '__main__':a = "{'data': {'loginName': 18291900215, 'password': '{{dd636482aca022}}', 'code': None, 'description': 'encrypt'}}"print(Regular().finds(a))

核心操作

定义变量池

variables.py

全局变量池来了,是不是很简单,但是作用确实很巨大的。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-class VariablePool:"""全局变量池"""@staticmethoddef get(name):"""获取变量"""return getattr(VariablePool, name)@staticmethoddef set(name, value):"""设置变量"""setattr(VariablePool, name, value)@staticmethoddef has(name):return hasattr(VariablePool, name)if __name__ == '__main__':VariablePool.set('name', 'wxhou')print(VariablePool.get('name'))

封装requests

request.py

最最核心的部分,对于python requests库的二次封装。用以实现接口的请求和返回结果的获取。

#!/usr/bin/env python
# coding=utf-8
import urllib3
import requests
from config import CF
from utils.logger import log
from common.regular import Regular
from common.setResult import replace_param
from core.serialize import deserialization
from requests.exceptions import RequestException
from common.variables import VariablePoolurllib3.disable_warnings()class HttpRequest:"""二次封装requests方法"""http_method_names = 'get', 'post', 'put', 'delete', 'patch', 'head', 'options'def __init__(self):self.r = requests.session()self.reg = Regular()def send_request(self, case, **kwargs):"""发送请求:param case: 测试用例:param kwargs: 其他参数:return: request响应"""if case[CF.URL]:VariablePool.set('url', case[CF.URL])if case[CF.HEADERS]:VariablePool.set('headers', deserialization(case[CF.HEADERS]))method = case[CF.METHOD].upper()url = VariablePool.get('url') + case[CF.ROUTE]self.r.headers = VariablePool.get('headers')params = replace_param(case)if params: kwargs = paramstry:log.info("Request Url: {}".format(url))log.info("Request Method: {}".format(method))log.info("Request Data: {}".format(kwargs))def dispatch(method, *args, **kwargs):if method in self.http_method_names:handler = getattr(self.r, method)return handler(*args, **kwargs)else:raise AttributeError('request method is ERROR!')response = dispatch(method.lower(), url, **kwargs)log.info(response)log.info("Response Data: {}".format(response.text))return responseexcept RequestException as e:log.exception(format(e))except Exception as e:raise e

序列化与反序列化

serialize.py

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import json
from json.decoder import JSONDecodeErrordef deserialization(content: json):"""反序列化json对象 -> python数据类型"""return json.loads(content)def serialization(content, ensure_ascii=True):"""序列化python数据类型 -> json对象"""return json.dumps(content, ensure_ascii=ensure_ascii)def is_json_str(string):"""判断是否是json格式字符串"""if isinstance(string, str):try:json.loads(string)return Trueexcept JSONDecodeError:return Falsereturn Falseif __name__ == '__main__':a = "{'data': {'loginName': 18291900215, 'password': 'dd636482aca022', 'code': None, 'description': 'encrypt'}}"print(is_json_str(a))

检查结果

checkResult.py

在这个文件中,我们将对测试返回的结果进行预期的验证。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import re
from config import CF
from utils.logger import log
from requests import Response
from common.excelset import excel_setdef check_result(r: Response, number, case):"""获取结果"""results = []excel_set.write_results(number, CF.SPEND_TIME, r.elapsed.total_seconds(), color=False)if case[CF.EXPECTED_CODE]:res = int(case[CF.EXPECTED_CODE]) == r.status_coderesults.append(res)if not res: excel_set.write_color(number, CF.EXPECTED_CODE)log.info(f"预期响应码:{case[CF.EXPECTED_CODE]},实际响应码:{r.status_code}")if case[CF.EXPECTED_VALUE]:res = case[CF.EXPECTED_VALUE] in r.textresults.append(res)if not res: excel_set.write_color(number, CF.EXPECTED_VALUE)log.info(f"预期响应值:{case[CF.EXPECTED_VALUE]},实际响应值:{r.text}")if case[CF.EXPECTED_REGULAR]:res = r'%s' % case[CF.EXPECTED_REGULAR]ref = re.findall(res, r.text)results.append(ref)if not ref: excel_set.write_color(number, CF.EXPECTED_REGULAR)log.info(f"预期正则:{res},响应{ref}")if all(results):excel_set.write_results(number, CF.TEST_RESULTS, 'Pass')log.info(f"用例【{case[CF.NAME]}】测试成功!")else:excel_set.write_results(number, CF.TEST_RESULTS, 'Failed')assert all(results), f"用例【{case[CF.NUMBER]}{case[CF.NAME]}】测试失败:{results}"

设置参数

setResult.py

在这个文件中我们实现了接口返回值的提取,实现了接口传递参数的函数。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from requests import Response
from utils.logger import log
from common.regular import Regular
from common.excelset import excel_set
from common.variables import VariablePool
from core.serialize import is_json_str, deserialization
from config import CFreg = Regular()def get_var_result(r: Response, number, case):"""替换变量"""if case[CF.EXTRACT_VARIABLE]:for i in case[CF.EXTRACT_VARIABLE].split(','):result = reg.find_res(i, r.text)VariablePool.set(i, result)log.info(f"提取变量{i}={result}")if not VariablePool.get(i):excel_set.write_results(number, CF.EXTRACT_VARIABLE, f"提变量{i}失败")excel_set.write_results(number, CF.RESPONSE_TEXT,f"ResponseCode:{r.status_code}\nResponseText:{r.text}")def replace_param(case):"""传入参数"""if case[CF.PARAMETER]:if is_json_str(case[CF.PARAMETER]):is_extract = reg.finds(case[CF.PARAMETER])if is_extract:return deserialization(reg.subs(is_extract, case[CF.PARAMETER]))return deserialization(case[CF.PARAMETER])

测试操作

test_api.py

我们采用unittest进行测试,在前置条件和后置条件中我们对封装的HttpRequest方法进行了初始化和关闭会话操作。

使用parameterized库中的expend方法对excel中的用例进行参数化读取执行。

#!/usr/bin/env python
# coding=utf-8
import unittest
from parameterized import parameterized
from common.excelset import excel_set
from core.request import HttpRequest
from common.checkResult import check_result
from common.setResult import get_var_resultclass TestApi(unittest.TestCase):"""测试接口"""@classmethoddef setUpClass(cls) -> None:cls.req = HttpRequest()@classmethoddef tearDownClass(cls) -> None:cls.req.r.close()@parameterized.expand(excel_set.get_cases())def test_api(self, name, number, case):"""测试excel接口用例"""r = self.req.send_request(case)get_var_result(r, number, case)check_result(r, number, case)if __name__ == '__main__':unittest.main(verbosity=2)

测试报告发送邮件类

run.py

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import os
import platform
import argparse
import unittest
from common.variables import VariablePool
from utils.send_mail import send_report_mail
from utils.HTMLTestRunner import HTMLTestRunnerdef running(path):"""运行"""test_case = unittest.defaultTestLoader.discover('tests', 'test*.py')with open(path, 'wb') as fp:runner = HTMLTestRunner(stream=fp,title='Excel接口测试',description="用例执行情况",verbosity=2)result = runner.run(test_case)if result.failure_count:send_report_mail(path)def file_path(arg):"""获取输入的文件路径"""if 'Windows' in platform.platform():_dir = os.popen('chdir').read().strip()else:_dir = os.popen('pwd').read().strip()if _dir in arg:return argreturn os.path.join(_dir, arg)def main():"""主函数"""parser = argparse.ArgumentParser(description="运行Excel接口测试")parser.add_argument('-i', type=str, help='原始文件')parser.add_argument('-o', type=str, default='report.xlsx', help="输出文件")parser.add_argument('-html', type=str, default='report.html', help="报告文件")args = parser.parse_args()VariablePool.set('excel_input', file_path(args.i))VariablePool.set('excel_output', file_path(args.o))VariablePool.set('report_path', file_path(args.html))running(VariablePool.get('report_path'))if __name__ == '__main__':main()

运行

值得注意的是,运行测试时要关闭office打开该excel文件。

最后的文件中我是使用了argparse进行了命令行管理,意味着我们可以通过命令行进行测试而无需关心excel在那个目录下存放着。

python run.py -i data\usercase.xlsx

输入下面的命令执行一下。

INFO 2020-07-30 22:07:52,713 request.py:40 Request Url: https://www.zhixue.com/weakPwdLogin/?from=web_login
INFO 2020-07-30 22:07:52,714 request.py:41 Request Method: POST
INFO 2020-07-30 22:07:52,715 request.py:42 Request Data: {'data': {'loginName': 18291900215, 'password': 'dd636482aca022', 'code': None, 'descriptio
n': 'encrypt'}}
INFO 2020-07-30 22:08:17,204 request.py:55 <Response [200]>
INFO 2020-07-30 22:08:17,204 request.py:56 Response Data: {"data":"1500000100070008427","result":"success"}
INFO 2020-07-30 22:08:17,207 setResult.py:20 提取变量data=1500000100070008427
INFO 2020-07-30 22:08:17,307 checkResult.py:18 预期响应码:200,实际响应码:200
INFO 2020-07-30 22:08:17,308 checkResult.py:23 预期响应值:"result":"success",实际响应值:{"data":"1500000100070008427","result":"success"}
INFO 2020-07-30 22:08:17,310 checkResult.py:29 预期正则:[\d]{16},响应['1500000100070008']
INFO 2020-07-30 22:08:17,356 checkResult.py:32 用例【登录】测试成功!
ok test_api_0__ (test_api.TestApi)
INFO 2020-07-30 22:08:17,358 regular.py:20 提取变量:['data']
INFO 2020-07-30 22:08:17,359 regular.py:23 替换变量:data
INFO 2020-07-30 22:08:17,361 regular.py:26 替换结果:{"data": {"userId": "1500000100070008427"}}
INFO 2020-07-30 22:08:17,363 request.py:40 Request Url: https://www.zhixue.com/loginSuccess/
INFO 2020-07-30 22:08:17,366 request.py:41 Request Method: POST
INFO 2020-07-30 22:08:17,367 request.py:42 Request Data: {'data': {'userId': '1500000100070008427'}}
INFO 2020-07-30 22:08:20,850 request.py:55 <Response [200]>
INFO 2020-07-30 22:08:20,851 request.py:56 Response Data: {"result":"success"}
INFO 2020-07-30 22:08:20,932 checkResult.py:18 预期响应码:200,实际响应码:200
INFO 2020-07-30 22:08:20,933 checkResult.py:23 预期响应值:"result":"success",实际响应值:{"result":"success"}
INFO 2020-07-30 22:08:20,935 checkResult.py:29 预期正则:11,响应[]
F  test_api_1__ (test_api.TestApi)Time Elapsed: 0:00:28.281434
测试结果邮件发送成功!

执行规则

(venv) C:\Users\hoou\PycharmProjects\httptest-excel>python run.py -h
usage: run.py [-h] [-i I] [-o O] [-html HTML]运行Excel接口测试optional arguments:-h, --help  show this help message and exit-i I        原始文件-o O        输出文件-html HTML  报告文件

在命令行输入python run.py excel路径 新excel路径 报告路径

如果不输入新excel路径 和报告路径,会在run.py所在目录生成两个report.xlsx,report.html。

本篇的excel测试框架就完成了。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

相关文章:

python excel接口自动化测试框架!

今天采用Excel继续写一个接口自动化测试框架。 设计流程图 这张图是我的excel接口测试框架的一些设计思路。 首先读取excel文件&#xff0c;得到测试信息&#xff0c;然后通过封装的requests方法&#xff0c;用unittest进行测试。 其中&#xff0c;接口关联的参数通过正则进…...

Spring框架整合单元测试

目录 一、配置文件方式 1.导入依赖 2.编写类和方法 3.配置文件applicationContext-test.xml 4.测试类 5.运行结果 二、全注解方式 1.编写类和方法 2.配置类 3.测试类 4.运行结果 每次进行单元测试的时候&#xff0c;都需要编写创建工厂&#xff0c;加载配置文件等相关…...

Java部分新特性

模式匹配 instance of 模式匹配 之前写法 public void print(Object o) {if (o instanceof String){String str (String) obj;System.out.println("This is a String of length " s.length());} else {System.out.println("This is not a String");} …...

keepalived+lVS(dr)高可用集群

keepalivedlVS(dr)高可用集群 规划 服务器名称IP描述masterkeepalivedlvsVIP:192.168.238.100DIP:192.168.238.151keepalived的master节点和lvs负载均衡backupkeepalivedlvsVIP:192.168.238.100DIP:192.168.238.152keepalived的备份节点和lvs负载均衡server1VIP:192.168.238.…...

【前端】JavaScript中的柯里化(Currying)详解及实现

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是柯里化&#xff1f;&#x1f4af;柯里化的特点&#x1f4af;柯里化的简单示例&#x1f4af;通用的柯里化实现&#x1f4af;柯里化让代码更易读的原因&#x1f4af…...

Cyberchef 辅助网络安全运营-数据格式转换

在网络安全的世界中&#xff0c;经常会遇到各种格式的数据&#xff0c;比如二进制&#xff0c;比如说16进制&#xff0c;URL编码&#xff0c;HTML编码&#xff0c;Unicode编码&#xff0c;Base格式的编码。网络安全运营一个明确的目标就是把这些不同的数据格式换成为可读的字符…...

鸿蒙面试 --- 性能优化(精简版)

一、性能优化的三个方面 感知流畅&#xff1a;通过合理运用动画提升用户对应用操作的感知流畅度&#xff0c;同时避免因动画滥用导致性能下降。涵盖视觉感知优化、转场场景动效感知流畅&#xff08;如出现 / 消失转场、导航转场、模态转场、共享元素转场等&#xff09;&#x…...

qsort函数详解+代码展示

文章目录 概要系列文章目录前言(1) 定义(2) 使用&#xff08;举例子 上代码&#xff09;1、定义数组&#xff1a;2、定义比较函数&#xff1a;3、调用 qsort&#xff1a;4、输出结果&#xff1a; (3) 注意事项 小结 概要 本篇博客将详细地介绍qsort排序函数&#xff0c;&#x…...

ms-hot29 解码方法

leetcode原题链接: 解码方法 ms-hot目录: ​​​​​​ ms-hot目录 上一篇&#xff1a;ms-hot28 合并两个有序数组 下一篇&#xff1a;二叉树的中序遍历 题目描述 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; "1" -> A "2"…...

【5】STM32·FreeRTOS·临界段保护与调度器挂起

目录 一、临界段代码保护简介 二、临界段代码保护函数介绍 2.1、调用示例 2.2、内部实现 三、任务调度器的挂起和恢复 3.1、调用示例 3.2、内部实现 一、临界段代码保护简介 什么是临界段&#xff1a;临界段代码也叫做临界区&#xff0c;是指那些必须完整运行&#xff…...

daos源码编译

1. 前言 本文详细介绍如何在almalinux8.9上编译daos.2.0.0源码。系统环境如下&#xff1a; daos: 2.0.0 linux os: almalinux 8.9 linux kernel: 4.18.0-513.5.1.el8_9.x86_64之所以选择2.0.0版本&#xff0c;是因为daos从2.0.0开始是一个全新的架构设计&a…...

Flink--API 之Transformation-转换算子的使用解析

目录 一、常用转换算子详解 &#xff08;一&#xff09;map 算子 &#xff08;二&#xff09;flatMap 算子 &#xff08;三&#xff09;filter 算子 &#xff08;四&#xff09;keyBy 算子 元组类型 POJO &#xff08;五&#xff09;reduce 算子 二、合并与连接操作 …...

火山引擎VeDI在AI+BI领域的演进与实践

随着数字化时代的到来&#xff0c;企业对于数据分析与智能决策的需求日益增强。作为新一代企业级数据智能平台&#xff0c;火山引擎数智平台VeDI基于字节跳动多年的“数据驱动”实践经验&#xff0c;也正逐步在AI&#xff08;人工智能&#xff09;与BI&#xff08;商业智能&…...

java获取docker镜像构建日志

在Java中获取Docker镜像的构建日志&#xff0c;你可以使用Docker Engine API。以下是一个使用OkHttp库的示例代码&#xff0c;用于获取构建日志&#xff1a; import okhttp3.*; import java.io.IOException; public class DockerLogsFetcher { private static final St…...

Spring-boot整合Webservice服务端

Spring Boot整合Webservice服务端 本文是基于前辈一顿吃不饱的文章SpringBoot整合WebService&#xff08;服务端客户端&#xff09;-CSDN博客&#xff0c;由于工作需要用.NET调用其他系统发布的WebService服务&#xff0c;尝试用java搭建一个WebService服务端测试一下&#xf…...

动静分离具体是怎么实现的?

在 Nginx 中实现动静分离是一种常见的优化手段&#xff0c;用于提高网站的性能和可扩展性。以下是 Nginx 动静分离的一些基本概念和配置方法&#xff1a; 1、什么是动静分离&#xff1a; 动静分离是指将网站的静态资源&#xff08;如图片、CSS、JavaScript 文件&#xff09;与…...

如何取出.vmdk文件中的数据

前提&#xff1a;我的云服务器到期了&#xff0c;于是我将云服务器导出了.vmdk镜像。本想在vm虚拟机中启动&#xff0c;但是一直报错。很是苦恼。 首先下载DiskGenius这个软件。 点击磁盘-》打开磁盘 打开.vmdk文件 可以看到内部的文件了&#xff0c;可以选择对应文件导出到桌…...

Vue2中 vuex 的使用

1.安装 vuex 安装vuex与vue-router类似&#xff0c;vuex是一个独立存在的插件&#xff0c;如果脚手架初始化没有选 vuex&#xff0c;就需要额外安装。 yarn add vuex3 或者 npm i vuex3 233 Vue2 Vue-Router3 Vuex3 344 Vue3 Vue-Router4 Vuex4 2. 新建 store/index.j…...

Swift 数据类型

Swift 数据类型 Swift 是一种强类型语言&#xff0c;这意味着在 Swift 中声明的每个变量和常量都必须具有明确的类型。Swift 的类型系统旨在帮助开发者编写清晰、安全的代码。本文将详细介绍 Swift 中的基本数据类型&#xff0c;包括整数、浮点数、布尔值、字符和字符串。 整…...

【pyspark学习从入门到精通22】机器学习库_5

训练-验证分割 TrainValidationSplit 模型为了选择最佳模型&#xff0c;会对输入数据集&#xff08;训练数据集&#xff09;进行随机分割&#xff0c;分成两个子集&#xff1a;较小的训练子集和验证子集。分割只执行一次。 在这个例子中&#xff0c;我们还将使用 ChiSqSelect…...

Zookeeper3.5.8集群部署

环境说明 准备三台服务器&#xff0c;我这边是虚拟机&#xff0c;分别为&#xff1a;bigdata141、bigdata142、bigdata143 下载安装包 下载链接&#xff1a;Index of /dist/zookeeper/zookeeper-3.5.8 下载完后&#xff0c;上传到其中一台服务器&#xff0c;我这边上传到 b…...

Linux 无图形界面磁盘空间排查与优化实践20241127

Linux 无图形界面磁盘空间排查与优化实践 引言&#xff1a;磁盘空间问题的痛点与挑战 &#x1f50d; 常见问题 当系统磁盘空间超过 90% 时&#xff0c;不仅可能导致性能下降&#xff0c;还可能让关键操作无法正常完成。这种情况下&#xff0c;如何高效且精准地排查磁盘占用来…...

TCP socket api详解 续

文章目录 守护进程怎么做到&#xff1f;setsid返回值 dev/null字符文件 daemonTCP协议 退出的时候呢&#xff1f; 会话有很多后台任务&#xff0c;bash肯定会退&#xff0c;那后台会话怎么办呢&#xff1f; 理论上也要退的&#xff0c;但实际上关了bash&#xff0c;bash肯定要…...

一道经典的整数划分题——分弹珠

CSDN 博客&#xff1a;一道经典的整数划分题——分弹珠 一、题目描述 这道题目是一道经典的整数划分问题&#xff0c;要求将 (M) 个弹珠分到 (N) 个盘子中&#xff0c;满足以下条件&#xff1a; 允许盘子为空。两种分法被认为相同当且仅当分配的弹珠数量相同&#xff08;不考…...

浏览器缓存与协商缓存

1. 强缓存&#xff08;Strong Cache&#xff09; 定义 强缓存是指在缓存的资源有效期内&#xff0c;浏览器会直接使用缓存中的数据&#xff0c;而不会发起网络请求。也就是说&#xff0c;浏览器会直接从本地缓存读取资源&#xff0c;不会与服务器进行任何交互。 如何控制强缓…...

Maven 如何配置忽略单元测试

在使用 Maven 进行项目构建时&#xff0c;有时您可能希望跳过测试阶段。 这在确保代码更改不影响测试结果或需要快速部署项目的情况下特别有用。 Maven 提供了多种方法来在构建过程中跳过测试。 为什么跳过测试&#xff1f; 加速构建&#xff1a;对于具有大量测试用例的大项…...

哪里能找到好用的动物视频素材 优质网站推荐

想让你的短视频增添些活泼生动的动物元素&#xff1f;无论是搞笑的宠物瞬间&#xff0c;还是野外猛兽的雄姿&#xff0c;这些素材都能让视频更具吸引力。今天就为大家推荐几个超实用的动物视频素材网站&#xff0c;不论你是短视频新手还是老手&#xff0c;都能在这些网站找到心…...

Python中的23种设计模式:详细分类与总结

设计模式是解决特定问题的通用方法&#xff0c;分为创建型模式、结构型模式和行为型模式三大类。以下是对每种模式的详细介绍&#xff0c;包括其核心思想、应用场景和优缺点。 一、创建型模式&#xff08;Creational Patterns&#xff09; 创建型模式关注对象的创建&#xff0…...

研0找实习【学nlp】14--BERT理解

​​​​​以后做项目&#xff0c;一定要多调查&#xff0c;选用不同组合关键词多搜索&#xff01; BERT论文解读及情感分类实战_bert模型在imdb分类上的准确率已经到达了多少的水平-CSDN博客 【深度学习】-Imdb数据集情感分析之模型对比&#xff08;4&#xff09;- CNN-LSTM…...

【AI日记】24.11.27 学习 kaggle 入门比赛 Titanic - Machine Learning from Disaster

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 核心工作 内容&#xff1a;学习 kaggle 入门比赛 Titanic - Machine Learning from Disaster时间&#xff1a;8 小时心得&#xff1a;在学习别人的 notebook 的时候&#xff0c;碰到不懂的知识点&#xff0c;…...

HCIP——堆叠技术实验配置

目录 一、堆叠的理论知识 二、堆叠技术实验配置 三、总结 一、堆叠的理论知识 1.1堆叠概述&#xff1a; 是指将两台交换机通过堆叠线缆连接在一起&#xff0c;从逻辑上变成一台交换设备&#xff0c;作为一个整体参与数据的转发。 1.2堆叠的基本概念 堆叠系统中所有的单台…...

trtllm 部署新体验

实验清华大模型和trtllm Chatglm3 pip3 install tensorrt_llm -U --pre --extra-index-url https://pypi.nvidia.com 要安装git来下载仓库 使用这个chatglm的例子 安装依赖 用最新的glm3的model 然后开始转换model 官方写错了&#xff0c;这应该是个-&#xff0c;不是_&a…...

部署 DeepSpeed以推理 defog/sqlcoder-70b-alpha 模型

部署 DeepSpeed 以推理 defog/sqlcoder-70b-alpha 这样的 70B 模型是一个复杂的过程&#xff0c;涉及多个关键步骤。下面是详细的步骤&#xff0c;涵盖了从模型加载、内存优化到加速推理的全过程。 1. 准备环境 确保你的环境配置正确&#xff0c;以便能够顺利部署 defog/sqlc…...

node.js基础学习-http模块-创建HTTP服务器、客户端(一)

http模块式Node.js内置的模块&#xff0c;用于创建和管理HTTP服务器。Node.js使用JavaScript实现&#xff0c;因此性能更好。 使用http模块创建服务器&#xff0c;我们建议使用commonjs模块规范&#xff0c;因为很多第三方的组件都使用了这种规范。当然es6写法也支持。 下面就是…...

Cobalt Strike 4.8 用户指南-第十一节 C2扩展

11.1、概述 Beacon 的 HTTP 指标由 Malleable Command and Control &#xff08;Malleable C2&#xff09; 配置文件控制。Malleable C2 配置文件是一个简单的程序&#xff0c;它指定如何转换数据并将其存储在事务中。转换和存储数据的同一程序&#xff08;向后解释&#xff0…...

STM32 使用ARM Compiler V6 编译裸机 LWIP协议栈报错的解决方法

在lwip 的cc.h 中使用以下宏定义&#xff0c;来兼容 V5 和 V6编译器 #if defined (__ARMCC_VERSION) && (__ARMCC_VERSION > 6010050) /* ARM Compiler V6 */ #define __CC_ARM /* when use v6 compiler define this */ #endifV6编译的速度确实比V5块了好多倍。 …...

K8S简介、使用教程

以下是关于 Kubernetes&#xff08;通常缩写为 K8S&#xff09;的简介和使用教程&#xff1a; 一、Kubernetes 简介 定义与作用 Kubernetes 是一个开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。它最初由谷歌开发&#xff0c;后捐赠给云原生计算基…...

Scala—Map用法详解

Scala—Map用法详解 在 Scala 中&#xff0c;Map 是一种键值对的集合&#xff0c;其中每个键都是唯一的。Scala 提供了两种类型的 Map&#xff1a;不可变 Map 和可变 Map。 1. 不可变集合&#xff08;Map&#xff09; 不可变 Map 是默认的 Map 实现&#xff0c;位于 scala.co…...

2024御网杯信息安全大赛个人赛wp(misc方向)

目录 一.信息安全大赛的通知二、编码转换1. 第一部分2. 第二部分3. 第三部分 三、1.txt四、buletooth 题目附件以及工具链接&#xff1a; 通过网盘分享的文件&#xff1a;御网杯附件 链接: https://pan.baidu.com/s/1LNA6Xz6eZodSV0Io9jGSZg 提取码: jay1 –来自百度网盘超级会…...

DeepSpeed 配置文件(DeepSpeed Configuration Files)详解:中英文解释

中文版 本文详细介绍 DeepSpeed 配置文件&#xff0c;结合 4 卡 3090 的实际使用场景&#xff0c;重点解释各个参数的含义&#xff0c;并提供应对爆显存的方案。 DeepSpeed 配置文件详解&#xff1a;从基础到实战 DeepSpeed 是用于加速大规模分布式训练的重要工具&#xff0c…...

AI 助力开发新篇章:云开发 Copilot 深度体验与技术解析

本文 一、引言&#xff1a;技术浪潮中的个人视角1.1 AI 和低代码的崛起1.2 为什么选择云开发 Copilot&#xff1f; 二、云开发 Copilot 的核心功能解析2.1 自然语言驱动的低代码开发2.1.1 自然语言输入示例2.1.2 代码生成的模块化支持 2.2 实时预览与调整2.2.1 实时预览窗口功能…...

QTableWidget使用代理绘制分行显示

在这里插入代码片# 创建主窗口类&#xff1a; 使用 QTableWidget 作为核心控件。 设置表头及行列信息。 自定义代理&#xff1a; 继承 QStyledItemDelegate&#xff0c;实现代理模式。 重写 paint 和 sizeHint 方法&#xff0c;支持多行文本绘制。 设置行高以适应多行显示。 …...

Linux系统之fuser命令的基本使用

Linux系统之fuser命令的基本使用 一、fuser命令介绍二、fuser命令使用帮助2.1 help帮助信息2.1 基本语法①通用选项②文件/设备相关选项③网络相关选项④进程操作选项⑤其他选项 三、fuser命令的基本使用3.1 查找挂载点的进程3.2 查看指定设备进程信息3.3 查找监听特定端口的进…...

解决`-bash: ./configure:/bin/sh^M:解释器错误: 没有那个文件或目录`的问题

解决`-bash: ./configure:/bin/sh^M:解释器错误: 没有那个文件或目录`的问题 一、错误原因分析二、解决方法方法一:使用`dos2unix`工具方法二:使用`sed`命令方法三:使用`tr`命令方法四:在文本编辑器中转换方法五:在Windows系统中使用适当的工具三、预防措施四、总结在使…...

【时时三省】(C语言基础)结构体的声明

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 数组是一组相同类型的元素的集合 结构体也是一些值的集合&#xff0c;结构的每…...

群聊前选择患者功能的实现

和普通群聊不同&#xff0c;开启一个图文会话聊天&#xff0c;必须先选择患者、团队、医生。 原来是集成到腾讯IM当中&#xff0c;现在需要单独写一个页面 原来的代码在这里&#xff1a; const handleShow () > {uni.navigateTo({url: /pageB/active-home/active-home})}…...

目标检测,图像分割,超分辨率重建

目标检测和图像分割 目标检测和图像分割是计算机视觉中的两个不同任务&#xff0c;它们的输出形式也有所不同。下面我将分别介绍这两个任务的输出。图像分割又可以分为&#xff1a;语义分割、实例分割、全景分割。 语义分割&#xff08;Semantic Segmentation&#xff09;&…...

关于 EKS Bottlerocket AMI 版本与 Karpenter 配置的说明

问题1: Bottlerocket AMI 版本问题 之前,后端团队发现在使用 Bottlerocket v1.26.2 AMI 版本时,存在某些问题。经过 Bottlerocket 团队调查,此行为是罕见的 race condition 导致的结果。 我们在环境中重现了此状况,并且关注到由于 kubelet device manager 的启动时间晚于 NVI…...

安全设备-日志审计-网络路由配置

1 网络设置 菜单项‘网络’‘网络设置’子项。进入网卡列表展示页面。点击操作列‘编辑’图标&#xff0c;可编辑对应网卡信息。 图11-1 网卡信息 设备接口的 GE0/1 接口IP:192.168.0.1子网掩码:255.255.255.0 图11-2 配置网卡 1 IP地址2 子网掩码3 主机DNS4 备份DNS 2 通…...

Linux服务器生成SSH 密钥对与 GitLab 仓库进行交互

目录 生成 SSH 密钥对 将公钥添加到 GitLab 测试 SSH 连接 生成 SSH 密钥对 在执行脚本的机器上打开终端&#xff0c;执行以下命令&#xff08;假设使用默认的 RSA 算法&#xff0c;一路回车使用默认设置即可&#xff0c;也可以根据需要指定其他算法和参数&#xff09;&…...