python-UnitTest框架笔记
UnitTest框架的基本使用方法
UnitTest框架介绍
框架:framework,为了解决一类事情的功能集合
UnitTest框架:是python自带的单元测试框架
自带的,可以直接使用,不需要格外安装
测试人员用来做自动化测试,作为自动化测试的执行框架,即管理和执行测试用例的
使用原因:
能够组织多个用例去执行
提供丰富的断言方法
能够生成测试报告
核心要素(组成):
-TestCase测试用例,这个测试用例是UnitTest的组成部分,作用是用来书写真正的用例代码(脚本)
-TestSuite测试套件,作用是用来组装TestCase的,即可以将多个用例脚本文件组装到一起
-TestRunner测试执行,作用是用来执行TestSuite的
-TestLoader测试加载,是对TestSuite功能的补充,作用是用来组装TestCase的
-Fixture测试夹具,是一种代码结构,书写前置方法代码和后置方法代码,即用例执行顺序:前置–>用例–>后置
TestCase测试用例
书写真正的用例代码(脚本)
步骤:
-1.导包unittest
-2.定义测试类
-3.书写测试方法
-4.执行
注意事项:
代码文件名字要满足标识符的规则
代码文件名不要使用中文
代码:
#导包
import unittest
#定义测试类,只要继承unittest.TestCase类,就是测试类
class TestDemo(unittest.TestCase):#书写测试方法,方法中的代码就是真正的用例代码,方法名必须以test开头def test_method1(self):print("测试方法一")def test_method2(self):print("测试方法二")
#执行
#在类名或者方法名后边右键运行
#在类名后边,执行类中的所有测试方法
#在方法名后边,只执行当前的测试方法#在主程序中使用unittest.main()来执行
if __name__ == '__main__':unittest.main()
TestCase常见错误
1.文件名包含中文-------执行可能报错
2.右键运行没有unittest for …
解决方法一:新建一个代码文件,将之前的代码复制过来
解决方法二:使用unittest.main()运行
解决方法三:
TestSuite和TestRunner的使用
TestSuite测试套件:将多条脚本集合在一起,就是套件,即用来组装用例的
1.导包unittest
2.实例化套件对象unittest.TestSuite()
3.添加用例方法,套件对象.addTest(测试类名(测试方法名))
TestRunner测试执行:用来执行套件对象
1.导包unittest
2.实例化执行对象unittest.TextTestRunner()
3.执行对象执行套件对象,执行对象.run(套件对象)
整体步骤:
1.导包unittest
2.实例化套件对象unittest.TestSuite()
3.添加用例方法,套件对象.addTest(测试类名(测试方法名))
4.实例化执行对象unittest.TextTestRunner()
5.执行对象执行套件对象,执行对象.run(套件对象)
代码案例
套件可以用来组装用例,创建多个代码用例
#导包
import unittest
#定义测试类,只要继承unittest.TestCase类,就是测试类
class TestDemo1(unittest.TestCase):#书写测试方法,方法中的代码就是真正的用例代码,方法名必须以test开头def test_method1(self):print("测试方法1-1")def test_method2(self):print("测试方法1-2")
#导包
import unittest
#定义测试类,只要继承unittest.TestCase类,就是测试类
class TestDemo2(unittest.TestCase):#书写测试方法,方法中的代码就是真正的用例代码,方法名必须以test开头def test_method1(self):print("测试方法2-1")def test_method2(self):print("测试方法2-2")
#1.导包unittest
import unittestfrom unittest1.TestCase.yongli1 import TestDemo2
from unittest1.TestCase.yongli2 import TestDemo1#2.实例化套件对象unittest.TestSuite()
suite=unittest.TestSuite()
#3.添加用例方法,套件对象.addTest(测试类名(测试方法名))
suite.addTest(TestDemo1('test_method1'))
suite.addTest(TestDemo1('test_method2'))
suite.addTest(TestDemo2('test_method1'))
suite.addTest(TestDemo2('test_method2'))
#4.实例化执行对象unittest.TextTestRunner()
runner=unittest.TextTestRunner()
#5.执行对象执行套件对象,执行对象.run(套件对象)
runner.run(suite)
添加整个测试类中的方法
方法一
套件对象.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(测试类名))
#把指定测试类中的测试用例全部添加到测试套件中
方法二
套件对象.addTest(unittest.makeSuite(测试类名))
#1.导包unittest
import unittestfrom unittest1.TestCase.yongli1 import TestDemo2
from unittest1.TestCase.yongli2 import TestDemo1#2.实例化套件对象unittest.TestSuite()
suite=unittest.TestSuite()
#3.添加用例方法,套件对象.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(测试类名))
suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(TestDemo1))
suite.addTest(unittest.makeSuite(TestDemo2))
#4.实例化执行对象unittest.TextTestRunner()
runner=unittest.TextTestRunner()
#5.执行对象执行套件对象,执行对象.run(套件对象)
runner.run(suite)
查看测试结果
TestLoader测试加载:
作用和TestSuite作用一样,组装用例代码,同样也需要使用TextTestRunner()方法去执行
TestLoader加载用例更加方便
1.导包import unittest
2.实例化加载对象并加载用例---->得到的是套件对象
3.实例化执行对象并执行
#1.导包
import unittest
#2.实例化加载对象并加载用例---->得到的是套件对象
suite=unittest.TestLoader().discover('.','yongli*.py') #参数1:用例所在目录,参数2:用例代码文件名
#3.实例化执行对象并执行
runner=unittest.TextTestRunner()
runner.run(suite)
练习
练习1
用例代码
#导包
import unittest
#定义测试类,只要继承unittest.TestCase类,就是测试类
class TestDemo1(unittest.TestCase):#书写测试方法,方法中的代码就是真正的用例代码,方法名必须以test开头def test_method(self):print("测试方法1")
执行代码
import unittestsuite=unittest.TestLoader().discover('./case','test_*.py')
unittest.TextTestRunner().run(suite)
练习2
import unittest
from tools1 import add
class TestDemo(unittest.TestCase):def test_method1(self):if add(1,1) == 2:print("测试通过")else:print("测试失败")def test_method2(self):if add(2,1) == 3:print("测试通过")else:print("测试失败")def test_method3(self):if add(3,4) == 7:print("测试通过")else:print("测试失败")def test_method4(self):if add(4,5) == 9:print("测试通过")else:print("测试失败")
import unittestsuite=unittest.TestLoader().discover('.','test_*.py')unittest.TextTestRunner().run(suite)
fixture说明
代码结构,在用例执行前后会自动执行的代码结构
tpshop登录
1.打开浏览器(一次)
2.打开网页,点击登录(每次)
3.输入用户名,密码,验证码,点击登录(每次)
4.关闭页面(每次)
5.关闭浏览器(一次)
方法级别Fixture:
在每个用例执行前后都会自动调用,方法名是固定的
def setUp(self): #前置方法,每个用例执行前调用
pass
def tearDown(self): #后置方法,每个用例执行之后都会调用
pass
类级别Fixture:
在类中所有的测试方法执行前后,会自动执行的代码,类开始前执行和类执行结束时执行一次
类级别的Fixture需要写作类方法
@classmethod
def setUpClass(cls): #前置方法,类执行前调用
pass
@classmethod
def tearDownClass(cls): #后置方法,类执行之后都会调用
pass
模块级别Fixture:
模块就是代码文件,在代码文件执行前后执行一次
在类外部定义函数
def setUpModule(): #前置
pass
def tearDownpModule(): #前置
pass
Fixture实现
测试用例
import unittestclass TestDemo(unittest.TestCase):@classmethoddef setUpClass(cls):print("打开浏览器")@classmethoddef tearDownClass(cls):print("关闭浏览器")def setUp(self):print("打开网页,点击登录")def tearDown(self):print("关闭页面")def test_method1(self):print("输入用户名密码验证码1,点击登录")def test_method2(self):print("输入用户名密码验证码2,点击登录")def test_method3(self):print("输入用户名密码验证码1,点击登录")
测试运行
import unittestsuite=unittest.TestLoader().discover('.','test_*.py')unittest.TextTestRunner().run(suite)
断言的使用
断言
使用代码自动判断预期结果和实际结果是否相等
练习
import unittest
from tools1 import add
class TestDemo(unittest.TestCase):def test_method1(self):self.assertEqual(2,add(1,1))def test_method2(self):self.assertEqual(3,add(1, 2))def test_method3(self):self.assertEqual(7,add(3, 4))def test_method4(self):self.assertEqual(9,add(4, 5))
import unittest
suite=unittest.TestLoader().discover('.','test_*.py')
unittest.TextTestRunner().run(suite)
实现参数化
参数化环境安装
通过参数的方式来传递数据,从而实现数据和脚本分离,并且可以实现用例的重复执行。(在书写用例方法的时候,测试数据使用变量代替,在执行的时候进行数据传递)
-unittest测试框架,本身不支持参数化,但是可以通过安装unittest扩展插件parameterized来实现。
因为参数化的插件不是unittest自带的,所以想要使用,需要进行安装
安装:pip install -i http://pypi.douban.com/simple parameterized
参数化
1.导包 from parameterized import parameterized
2.修改测试方法,将测试方法中的测试数据使用变量表示
3.组织测试数据,格式[(),(),()],一个元组就是一组测试数据
4.参数化,在测试方法上方使用装饰器@parameterized.expand(测试数据)
5.运行(直接运行TestCase或者使用suite运行)
import unittest
from parameterized import parameterized
from tools1 import addclass TestDemo(unittest.TestCase):list = [(1, 1, 2), (1, 2, 3), (3, 4, 7), (2, 3, 5)]@parameterized.expand(list)def test_method1(self,a,b,expect):self.assertEqual(expect,add(a,b))
练习1
import json
def getDate():with open('../package1/one.json', 'r', encoding='utf-8') as f:list=json.load(f)list1=[]for i in list:list1.append(tuple(i.values()))return list1
import unittest
from parameterized import parameterized
from lianxi2.getDate import getDate
from tools1 import addclass TestDemo(unittest.TestCase):@parameterized.expand(getDate())def test_method1(self,a,b,expect):self.assertEqual(expect,add(a,b))
测试报告和跳过
测试报告
使用第三方的报告模板,生成报告HTMLTestReport,本质是TestRunner
安装
pip install -i http://pypi.doouban.com/simple/ HTMLTestReport
使用
1.导包unittest;HTMLTestReport
2.组装用例(套件,loader)
3.使用HTMLTestReport中的runner执行
4.查看报告
import unittest
from htmltestreport import HTMLTestReportif __name__ == '__main__':#套件suite = unittest.TestLoader().discover('.', 'test_*.py')#运行runner=HTMLTestReport(报告文件目录, 报告标题,其他描述信息)runner=HTMLTestReport('report.html', '测试报告','add')runner.run(suite)
使用绝对路径
将来的项目是分目录书写的,使用相对路径,可能会出现找不到文件的情况,此时需要使用绝对路径
方法:
1.在项目的根目录,创建一个python文件(app.py或者config.py)
2.在这个文件中获取项目的目录,在其他代码中使用路径拼接完成绝对路径的书写
import os
#获取项目绝对路径
path1=os.path.abspath(__file__) #__file__ 是特殊变量,表示当前代码文件名
base_addr=os.path.dirname(path1)
import os
import unittest
from htmltestreport import HTMLTestReport
from base_addr import base_addrif __name__ == '__main__':#套件suite = unittest.TestLoader().discover('.', 'test_*.py')#运行runner=HTMLTestReport(报告文件目录, 报告标题,其他描述信息)#runner=HTMLTestReport('report.html', '测试报告','add')#绝对路径filepath=os.path.join(base_addr,'lianxi2/report/report.html')runner=HTMLTestReport(filepath, '测试报告','add')runner.run(suite)
案例
tools.py
def login(username,password):if username=='admin' and password=='123456':return '登录成功'else:return '登录失败'
测试数据one.json
[{"desc": "正确的用户名和密码","username": "admin","password":"123456","excpet":"登录成功"
}, {"desc": "错误密码","username": "admin","password":"admin","excpet":"登录失败"
}, {"desc": "错误用户名","username": "admin1","password":"123456","excpet":"登录失败"
}]
获取测试数据getDate.py
import json
def getDate():with open('../package1/one.json', 'r', encoding='utf-8') as f:list=json.load(f)list1=[]for i in list:list1.append(tuple(i.values())[1:])return list1
测试用例
import unittest
from parameterized import parameterized
from lianxi2.getDate import getDate
from tools import loginclass TestDemo(unittest.TestCase):@parameterized.expand(getDate())def test_method1(self,a,b,expect):self.assertEqual(expect,login(a,b))
执行并生成测试报告
import os
import unittest
from htmltestreport import HTMLTestReport
from base_addr import base_addrif __name__ == '__main__':#套件suite = unittest.TestLoader().discover('.', 'test_*.py')#运行runner=HTMLTestReport(报告文件目录, 报告标题,其他描述信息)#绝对路径filepath=os.path.join(base_addr,'lianxi2/report/report.html')runner=HTMLTestReport(filepath, '测试报告','login')runner.run(suite)
报告
跳过
对于一些未完成的或者不满足测试条件的测试函数和测试类,可以执行跳过(简单来说,不想执行的代码的存测试方法,可以设置跳过)
直接将测试函数标记成跳过
@unittest.skip(“跳过原因”)
根据条件判断测试函数是否跳过
@unittest.skipIf(判断条件,reason=‘原因’) #判断条件为True,执行跳过
import unittest
from parameterized import parameterized
from lianxi2.getDate import getDate
from tools1 import loginversion=30
class TestDemo(unittest.TestCase):@parameterized.expand(getDate())def test_method1(self,a,b,expect):self.assertEqual(expect,login(a,b))@unittest.skip("跳过举例")def test_method2(self):print("测试方法二")@unittest.skipIf(version>30,"版本大于30跳过")def test_method3(self):print("测试方法三")@unittest.skipUnless(version<30,"版本小于30跳过")def test_method4(self):print("测试方法四")
相关文章:
python-UnitTest框架笔记
UnitTest框架的基本使用方法 UnitTest框架介绍 框架:framework,为了解决一类事情的功能集合 UnitTest框架:是python自带的单元测试框架 自带的,可以直接使用,不需要格外安装 测试人员用来做自动化测试,作…...
书生大模型实战营3
文章目录 L0——入门岛git基础Git 是什么?Git 中的一些基本概念工作区、暂存区和 Git 仓库区文件状态分支主要功能 Git 平台介绍GitHubGitLabGitee Git 下载配置验证下载 Git配置 Git验证 Git配置 Git常用操作Git简易入门四部曲Git其他指令 闯关任务任务1: 破冰活动…...
在CentOS服务器上部署DeepSeek R1
在CentOS服务器上部署DeepSeek R1,并通过公网IP与其进行对话,可以按照以下步骤操作: 一、环境准备 系统要求: CentOS 8+(需支持AVX512指令集)。 硬件配置: GPU版本:NVIDIA驱动520+,CUDA 11.8+。 CPU版本:至少16核处理器,64GB内存。 存储空间:原始模型需要30GB,量…...
C++中常用的十大排序方法之4——希尔排序
成长路上不孤单😊😊😊😊😊😊 【😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于C中常用的排序方法之4——希尔排序的相…...
机器学习day7
自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数 代码 import numpy as np import torch import torch.nn as nn import torch.optim as optimizer import matplotlib.pyp…...
【流媒体】搭建流媒体服务器
搭建Windows Nginx服务器 搭建 下载nginx工具包解压至本地,并在cmd窗口中切换至nginx所在的本地目录修改 conf/nginx.conf 文件,更改其端口号 server中的 listen的端口号从 80改为 8080,因为80经常被其他服务占用,导致无法打开 …...
(电脑版)植物大战僵尸幼儿园版本,开启你的冒险之旅!
欢迎来到植物大战僵尸中文版,园长Jen已准备好迎接你的挑战!在这个充满乐趣和策略的游戏中,你将体验到多种游戏模式,每种模式都带来不同的挑战和乐趣。 游戏模式: 冒险模式:踏上刺激的冒险旅程,…...
民法学学习笔记(个人向) Part.2
民法学学习笔记(个人向) Part.2 民法始终在解决两个生活中的核心问题: 私法自治;交易安全; 3. 自然人 3.4 个体工商户、农村承包经营户 都是特殊的个体经济单位; 3.4.1 个体工商户 是指在法律的允许范围内,依法经…...
解决SetWindowCompositionAttribute使控件文本透明的问题
用以下参数调用该API,能实现类似Aero的模糊透明效果。 参数具体含义见 https://zhuanlan.zhihu.com/p/569258181 http://www.memotech.de/WindowComposition/Text.txt http://www.memotech.de/WindowComposition/WindowComposition.zip DWORD accent[4] { 3,0,0,0 …...
响应式编程与协程
响应式编程与协程的比较 响应式编程的弊端虚拟线程Java线程内核线程的局限性传统线程池的demo虚拟线程的demo 响应式编程的弊端 前面用了几篇文章介绍了响应式编程,它更多的使用少量线程实现线程间解耦和异步的作用,如线程的Reactor模型,主要…...
Altium Designer绘制原理图时画斜线的方法
第一步:检查设置是否正确 打开preferences->PCB Editor ->Interactive Routing->Interactive Routing Options->Restrict TO 90/45去掉勾选项,点击OK即可。如下图所示: 然后在划线时,按下shift空格就能够切换划线…...
Android --- CameraX讲解
预备知识 surface surfaceView SurfaceHolder surface 是什么? 一句话来说: surface是一块用于填充图像数据的内存。 surfaceView 是什么? 它是一个显示surface 的View。 在app中仍在 ViewHierachy 中,但在wms 中可以理解为…...
动态分库分表
1. 动态分库分表的核心目标 解决单库性能瓶颈:通过水平拆分数据,提升并发处理能力。 支持弹性扩展:在不中断服务的前提下,实现数据分片的动态扩容/缩容。 避免跨分片操作:减少跨分片查询(如JOIN、事务&am…...
shell -c
个人博客地址:shell -c | 一张假钞的真实世界 shell -c {string}:表示命令从-c后的字符串读取。在需要使用管道或者重定向需要sudo时很有用,如下: $ sudo find ../*/exportFiles -mtime 15 -name "*" | xargs -I {} r…...
Spring Boot 2 快速教程:WebFlux处理流程(五)
WebFlux请求处理流程 下面是spring mvc的请求处理流程 具体步骤: 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找) 匹配条件包括…...
10.8 LangChain Output Parsers终极指南:从JSON解析到流式处理的规范化输出实践
LangChain Output Parsers终极指南:从JSON解析到流式处理的规范化输出实践 关键词: LangChain Output Parsers、结构化输出、JSON解析、数据校验、流式处理 一、为什么需要规范化输出?大模型输出的“荒野西部”问题 原始输出的三大痛点: 格式不可控:模型可能返回纯文本、…...
G1. Yunli‘s Subarray Queries (easy version)
题目链接:Problem - 2009G1 - Codeforces 题目大意: 给你一个长度为n的整数数组a序列, 然后你可以操作任何次, 将序列里的一个数换成其他任意数字。 后有q次询问, 每一次询问[L, R] 在此区间里, 可最少进行…...
[漏洞篇]SQL注入漏洞详解
[漏洞篇]SQL注入漏洞详解 介绍 把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以达到攻击的目的。…...
【apt源】RK3588 平台ubuntu20.04更换apt源
RK3588芯片使用的是aarch64架构,因此在Ubuntu 20.04上更换apt源时需要使用针对aarch64架构的源地址。以下是针对RK3588芯片在Ubuntu 20.04上更换apt源到清华源的正确步骤: 步骤一:打开终端 在Ubuntu 20.04中,按下Ctrl Alt T打…...
Maven
什么是Maven? Maven是一个项目管理工具,基于POM(Project Object Model,项目对象模型)的概念呢,Maven可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。 Maven包含了一个…...
软件工程概论试题五
一、多选 1.好的软件的基本属性包括()。 A. 效率 B. 可依赖性和信息安全性 C. 可维护性 D.可接受性 正答:ABCD 2.软件工程的三要素是什么()? A. 结构化 B. 工具 C.面向对象 D.数据流! E.方法 F.过程 正答:BEF 3.下面中英文术语对照哪些是正确的、且是属…...
Python量化交易助手:xtquant的安装与应用
Python量化交易助手:xtquant的安装与应用 技术背景和应用场景 在量化交易领域,Python因其强大的库支持和灵活性成为了许多开发者的首选语言。其中,xtquant 是迅投官方开发的一个Python包,专门用于与miniqmt通信,实现…...
opencv图像处理框架
一.课程简介与环境配置 二.图像基本操作 (1)计算机眼中的视觉 1)计算机眼中图像是由一块块组成,每一块又由很多很多个像素点组成,一个像素点的值是在0到255之间,值越大就越亮。 2)RGB表示彩色图像的三个颜色通道(红绿蓝),一张…...
MotionLCM 部署笔记
目录 依赖项 humanml3d: sentence-t5-large 下载数据: 报错:No module named sentence_transformers 继续报错:from transformers.integrations import CodeCarbonCallback 解决方法: 推理相关 GitHub - Dai-W…...
BUUCTF_[安洵杯 2019]easy_web(preg_match绕过/MD5强碰撞绕过/代码审计)
打开靶场,出现下面的静态html页面,也没有找到什么有价值的信息。 查看页面源代码 在url里发现了img传参还有cmd 求img参数 这里先从img传参入手,这里我发现img传参好像是base64的样子 进行解码,解码之后还像是base64的样子再次进…...
LLM - 基于LM Studio本地部署DeepSeek-R1的蒸馏量化模型
文章目录 前言开发环境快速开始LM Studio简单设置模型下载开始对话 模型选择常见错误最后 前言 目前,受限于设备性能,在本地部署的基本都是DeepSeek-R1的蒸馏量化模型,这些蒸馏量化模型的表现可能并没有你想象的那么好。绝大部分人并不需要本…...
Intel 与 Yocto 项目的深度融合:全面解析与平台对比
在嵌入式 Linux 领域,Yocto 项目已成为构建定制化 Linux 发行版的事实标准,广泛应用于不同架构的 SoC 平台。Intel 作为 x86 架构的领导者,在 Yocto 生态中投入了大量资源,为其嵌入式处理器、FPGA 和 AI 加速硬件提供了完整的支持…...
2025-工具集合整理
科技趋势 github-rank 🕷️Github China/Global User Ranking, Global Warehouse Star Ranking (Github Action is automatically updated daily). 科技爱好者周刊 制图工具 D2 D2 A modern diagram scripting language that turns text to diagrams 文档帮助 …...
快速提升网站收录:利用网站新闻发布功能
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/63.html 利用网站新闻发布功能快速提升网站收录是一个有效的策略。以下是一些具体的建议,帮助你更好地利用这一功能: 一、保持新闻更新频率 搜索引擎尤其重视网站的…...
wxss样式模板,全局配置window
1 wxss样式模板 1.1什么是wxss 1.2 rpx 1.3 样式导入 1.4 全局样式 1.5局部样式 2 全局配置 2.1 全局配置window 2.2 window 导航栏区域...
git多人协作
目录 一、项目克隆 二、 1、进入克隆仓库设置 2、协作处理 3、冲突处理 4、多人协作分支的推送拉取删除 1、分支推送(2种) 2、远程分支拉取(2种) 3、远程分支删除 一、项目克隆 git clone 画船听雨眠/test1 (自定义的名…...
Maven全解析:从基础到精通的实战指南
概念: Maven 是跨平台的项目管理工具。主要服务基于 Java 平台的构建,依赖管理和项目信息管理项目构建:高度自动化,跨平台,可重用的组件,标准化的流程 依赖管理: 对第三方依赖包的管理…...
使用Pytorch训练一个图像分类器
一、准备数据集 一般来说,当你不得不与图像、文本或者视频资料打交道时,会选择使用python的标准库将原始数据加载转化成numpy数组,甚至可以继续转换成torch.*Tensor。 对图片而言,可以使用Pillow库和OpenCV库对视频而言…...
除了成本核算,还有哪些财务分析工具可以提高工作效率?
除了成本核算,财务工作中还有多种分析工具可以提高工作效率,以下是详细介绍: 一、数据可视化工具 Power BI:这是一款强大的数据可视化工具,通过创建交互式报表、仪表板和图表来展示财务数据。它易于使用,提…...
【SSM】Spring + SpringMVC + Mybatis
SSM课程,以下为该课程的笔记 bean:IOC容器创建的对象 P12 bean的生命周期 在bean中定义init()和destroy()方法,然后在xml中配置方法名,让bean对象能找到对应的生命周期方法。 或通过实现接口的方式定义声明周期方法。 P13 sett…...
Windows图形界面(GUI)-QT-C/C++ - QT Tab Widget
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 一、概述 1.1 什么是 QTabWidget? 1.2 使用场景 二、常见样式 2.1 选项卡式界面 2.2 动态添加和删除选项卡 2.3 自定义选项卡标题和图标 三、属性设置 3.1 添加页面&…...
pstricks PGFTikz 在CTeX套装中绘图Transparency或Opacity失效的问题
我在CTeX中画图的时候,习惯用Geogebra先画好,然后生成pstricks或PGFTikz代码: 这样不用插入eps或pdf之类的图片,也是一种偷懒的方法。以前往arXiv.org上面传论文也是这样:代码出图,就不用另外上传一幅eps或…...
操作系统和中间件的信息收集
在浏览器中收集操作系统与中间件信息时,主要通过客户端JavaScript(用于操作系统/浏览器信息)和服务器端脚本(用于中间件信息)实现。以下是分步指南: 一、客户端操作系统信息收集(JavaScript&am…...
Android --- handler详解
handler 理解 handler 是一套Android 消息传递机制,主要用于线程间通信。 tips: binder/socket 用于进程间通信。 参考: Android 进程间通信-CSDN博客 handler 就是主线程在起了一个子线程,子线程运行并生成message ,l…...
C++:结构体和类
在之前的博客中已经讲过了C语言中的结构体概念了,重复的内容在这儿就不赘述了。C中的结构体在C语言的基础上还有些补充,在这里说明一下,顺便简单地讲一下类的概念。 一、成员函数 结构体类型声明的关键字是 struct ,在C中结构体…...
初级数据结构:栈和队列
目录 一、栈 (一)、栈的定义 (二)、栈的功能 (三)、栈的实现 1.栈的初始化 2.动态扩容 3.压栈操作 4.出栈操作 5.获取栈顶元素 6.获取栈顶元素的有效个数 7.检查栈是否为空 8.栈的销毁 9.完整代码 二、队列 (一)、队列的定义 (二)、队列的功能 (三)…...
携程Java开发面试题及参考答案 (200道-下)
insert 一行数据的时候加的是什么锁?为什么? 在 MySQL 中,当执行 INSERT 操作插入一行数据时,加锁的情况会因存储引擎和具体的事务隔离级别而有所不同。一般来说,在 InnoDB 存储引擎下,INSERT 操作加的是行级排他锁(Row Exclusive Lock),以下详细说明原因。 行级排他…...
Python从0到100(八十六):神经网络-ShuffleNet通道混合轻量级网络的深入介绍
前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…...
98,【6】 buuctf web [ISITDTU 2019]EasyPHP
进入靶场 代码 <?php // 高亮显示当前 PHP 文件的源代码,通常用于调试或展示代码,方便用户查看代码逻辑 highlight_file(__FILE__);// 从 GET 请求中获取名为 _ 的参数值,并赋值给变量 $_ // 符号用于抑制可能出现的错误信息ÿ…...
54【ip+端口+根目录通信】
上节课讲到,根目录起到定位作用,比如我们搭建一个php网站后,注册系统是由根目录的register.php文件执行,那么我们给这个根目录绑定域名https://127.0.0.1,当我们浏览器访问https://127.0.0.1/register.php时࿰…...
计算机网络 应用层 笔记 (电子邮件系统,SMTP,POP3,MIME,IMAP,万维网,HTTP,html)
电子邮件系统: SMTP协议 基本概念 工作原理 连接建立: 命令交互 客户端发送命令: 服务器响应: 邮件传输: 连接关闭: 主要命令 邮件发送流程 SMTP的缺点: MIME: POP3协议 基本概念…...
解析PHP文件路径相关常量
PHP文件路径相关常量包括以下几个常量: __FILE__:表示当前文件的绝对路径,包括文件名。 __DIR__:表示当前文件所在的目录的绝对路径,不包括文件名。 dirname(__FILE__):等同于__DIR__,表示当前…...
蓝桥与力扣刷题(234 回文链表)
题目:给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true示例 2: 输入&…...
【协议详解】卫星通信5G IoT NTN SIB33-NB 信令详解
一、SIB33信令概述 在5G非地面网络(NTN)中,卫星的高速移动性和广域覆盖特性使得地面设备(UE)需要频繁切换卫星以维持连接。SIB32提供了UE预测当前服务的卫星覆盖信息,SystemInformationBlockType33&#x…...
c语言练习题【数据类型、递归、双向链表快速排序】
练习1:数据类型 请写出以下几个数据的数据类型 整数 a a 的地址 存放a的数组 b 存放a的地址的数组 b的地址 c的地址 指向 printf 函数的指针 d 存放 d的数组 整数 a 的类型 数据类型是 int a 的地址 数据类型是 int*(指向 int 类型的指针) …...