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

python测试工程师 之 unittest框架总结

unittest

  • 学习目标
    • unittest 框架的基本使⽤⽅法(组成)
    • 断⾔的使⽤ (让程序⾃动的判断预期结果和实际结果是否相符)
    • 参数化(多个测试数据, 测试代码写⼀份 传参)
    • ⽣成测试报告
  • 复习python
  • unittest 框架的介绍
    • 核⼼要素(组成)
        • 1. TestCase 测试⽤例, 这个测试⽤例是 unittest 的组成部分,作⽤是 ⽤来书写真正的⽤例代码(脚本)
        • 2. Testsuite 测试套件, 作⽤是⽤来组装(打包)
        • 3. TestRunner 测试执⾏(测试运⾏), 作⽤ 是⽤例执⾏TestSuite(测试套件)的
        • 4. TestLoader 测试加载, 是对 TestSuite(测试套件) 功能的补充, 作⽤是⽤来组装(打包) TestCase(测试⽤例) 的
        • 5. Fixture 测试夹具, 是⼀种代码结构, 书写 前置⽅法(执⾏⽤例之前的⽅法)代码 和后置⽅法(执⾏⽤例之后的⽅法) 代码 ,即 ⽤例执⾏顺序 前置 ---> ⽤例 ---> 后置
  • TestCase 测试⽤例
  • TestSuite 和 TestRunner
    • TestSuite(测试套件)
    • TestRunner(测试执⾏)
    • 整体步骤
    • 代码案例
  • TestLoader 测试加载
  • 练习
    • TestLoader 练习
    • 练习 2
  • Fixture
    • ⽅法级别 Fixture
    • 类级别 Fixture
    • 模块级别Fixture(了解)
    • 登录练习
  • 断言
    • 练习
  • 参数化
    • 使用
    • 练习
  • 测试报告 HTMLTestReport
  • 获取当前路径
  • 案例
    • 测试的方法
    • 测试的数据
    • 读取测试数据
    • 测试用例代码
    • suit报告代码
  • 跳过

学习目标

unittest 框架的基本使⽤⽅法(组成)

断⾔的使⽤ (让程序⾃动的判断预期结果和实际结果是否相符)

参数化(多个测试数据, 测试代码写⼀份 传参)

⽣成测试报告

复习python

在这里插入图片描述

unittest 框架的介绍

什么是框架

  1. framework
  2. 为了解决⼀类事情的功能集合

Unittest 框架

是 Python ⾃带的单元测试框架

  • ⾃带的, 可以直接使⽤, 不需要单外安装
  • 测试⼈员 ⽤来做⾃动化测试, 作为⾃动化测试的执⾏框架,即 管理和执⾏⽤例的

核⼼要素(组成)

1. TestCase 测试⽤例, 这个测试⽤例是 unittest 的组成部分,作⽤是 ⽤来书写真正的⽤例代码(脚本)
2. Testsuite 测试套件, 作⽤是⽤来组装(打包)

TestCase(测试⽤例) 的,即 可以将多个⽤例脚本⽂件 组装到⼀起

3. TestRunner 测试执⾏(测试运⾏), 作⽤ 是⽤例执⾏TestSuite(测试套件)的
4. TestLoader 测试加载, 是对 TestSuite(测试套件) 功能的补充, 作⽤是⽤来组装(打包) TestCase(测试⽤例) 的
5. Fixture 测试夹具, 是⼀种代码结构, 书写 前置⽅法(执⾏⽤例之前的⽅法)代码 和后置⽅法(执⾏⽤例之后的⽅法) 代码 ,即 ⽤例执⾏顺序 前置 —> ⽤例 —> 后置

TestCase 测试⽤例

书写真正的⽤例代码(脚本)
单独⼀个测试⽤例 也是可以执⾏

  • 步骤
  1. 导包 unittest
  2. 定义测试类, 需要继承 unittest.TestCase 类, 习惯性类名以 Test 开头
  3. 书写测试⽅法, 必须以 test 开头
  4. 执⾏

注意事项

  1. 代码⽂件名字 要满⾜标识符的规则
  2. 代码⽂件名 不要使⽤中⽂
"""
学习 TestCase(测试用例) 的使用
"""# 1. 导包 unittest
import unittest# 2. 定义测试类, 只要继承 unittest.TestCase 类, 就是 测试类
class TestDemo(unittest.TestCase):# 3. 书写测试方法, 方法中的代码就是真正用例代码, 方法名必须以 test 开头def test_method1(self):print('测试方法一')def test_method2(self):print('测试方法二')# 4. 执行
# 4.1 在类名或者方法名后边右键运行
# 4.1.1 在类名后边, 执行类中的所有的测试方法
# 4.1.2 在方法名后边, 只执行当前的测试方法# 4.1 在主程序使用使用 unittest.main()  来执行,
if __name__ == '__main__':unittest.main()

TestSuite 和 TestRunner

TestSuite(测试套件)

将多条⽤例脚本集合在⼀起,就是套件, 即⽤来组装⽤例的

1. 导包 unittest
2. 实例化套件对象 unittest.TestSuite()
3. 添加⽤例⽅法

TestRunner(测试执⾏)

1. 导包 unittest
2. 实例化 执⾏对象 unittest.TextTestRunner()
3. 执⾏对象执⾏ 套件对象 执⾏对象.run(套件对象)

整体步骤

1. 导包 unittest
2. 实例化套件对象 unittest.TestSuite()
3. 添加⽤例⽅法
3.1 套件对象.addTest(测试类名('测试⽅法名'))
4. 实例化 执⾏对象 unittest.TextTestRunner()
5. 执⾏对象执⾏ 套件对象 执⾏对象.run(套件对象)

代码案例

# 1. 导包 unittest
import unittest
# 2. 定义测试类, 只要继承 unittest.TestCase 类, 就是测试类
class TestDemo1(unittest.TestCase):# 3. 书写测试⽅法, ⽅法中的代码就是真正⽤例代码,⽅法名必须以 test 开头def test_method1(self):print('测试⽅法1-1')def test_method2(self):print('测试⽅法1-2')
# 1. 导包  unittest
import unittest
from hm_02_testcase1 import TestDemo1
from hm_02_testcase2 import TestDemo2# 2. 实例化套件对象 unittest.TestSuite()
suite = unittest.TestSuite()# 3. 添加用例方法
# 3.1 套件对象.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)

TestLoader 测试加载

作⽤和 TestSuite 作⽤⼀样,组装⽤例代码, 同样也需要使⽤TextTestRunner() 去执⾏
10 个⽤例脚本 makeSuite()

import unittest
# 实例化加载对象并加载⽤例,得到套件对象
# suite = unittest.TestLoader().discover('⽤例所在的⽬录', '⽤例代码⽂件名*.py')
suite = unittest.TestLoader().discover('.','hm_02*.py')
# 实例化执⾏对象并执⾏
# runner = unittest.TextTestRunner()
# runner.run(suite)
unittest.TextTestRunner().run(suite)

练习

TestLoader 练习

1. 创建⼀个⽬录 case, 作⽤就是⽤来存放⽤例脚本,
2. 在这个⽬录中创建 5 个⽤例代码⽂件 , test_case1.py...
3. 使⽤ TestLoader 去执⾏⽤例将来的代码 ⽤例都是单独的⽬录 中存放的
test_项⽬_模块_功能.py

在这里插入图片描述

import unittestclass TestDemo(unittest.TestCase):def test_1(self):print('测试方法1')
import unittestclass TestDemo(unittest.TestCase):def test_1(self):print('测试方法2')
import unittestsuite = unittest.TestLoader().discover('case', 'test*.py')unittest.TextTestRunner().run(suite)

练习 2

1. 定义⼀个 tools 模块, 在这个模块中 定义 add 的⽅法,可以对两个数字求和,返回求和结果
2. 书写⽤例, 对 add() 函数进⾏测试
1, 1, 2
1, 2, 3
3, 4, 7
4, 5, 9
-----
之前的测试⽅法,直接⼀个 print
这个案例中的 测试⽅法,调⽤ add 函数, 使⽤ if 判断,来判断
预期结果和实际结果是否相符
预期结果 2 3 7 9
实际结果 调⽤ add()
import unittestfrom tools import addclass TestAdd(unittest.TestCase):def test_1(self):"""1,1,2"""if 2 == add(1, 1):print(f'用例 {1}, {1}, {2}通过')else:print(f'用例 {1}, {1}, {2}不通过')def test_2(self):if 3 == add(1, 2):print(f'用例 {1}, {2}, {3}通过')else:print(f'用例 {1}, {2}, {3}不通过')def test_3(self):if 7 == add(3, 4):print(f'用例 {3}, {4}, {7}通过')else:print(f'用例 {3}, {4}, {7}不通过')def test_4(self):if 9 == add(4, 5):print(f'用例 {4}, {5}, {9}通过')else:print(f'用例 {4}, {5}, {9}不通过')
from hm_06_test_add import TestAddsuite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestAdd))unittest.TextTestRunner().run(suite)

Fixture

代码结构, 在⽤例执⾏前后会⾃动执⾏的代码结构
tpshop 登录
1. 打开浏览器 (⼀次)
2. 打开⽹⻚,点击登录 (每次)
3. 输⼊⽤户名密码验证码1,点击登录 (每次, 测试⽅法)
4. 关闭⻚⾯ (每次)
2. 打开⽹⻚,点击登录 (每次)
3. 输⼊⽤户名密码验证码2,点击登录 (每次, 测试⽅法)
4. 关闭⻚⾯ (每次)
2. 打开⽹⻚,点击登录 (每次)
3. 输⼊⽤户名密码验证码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 tearDownModule():pass

登录练习

import unittestclass TestLogin(unittest.TestCase):def setUp(self) -> None:print('2. 打开网页, 点击登录')def tearDown(self) -> None:print('4. 关闭网页')@classmethoddef setUpClass(cls) -> None:print('1. 打开浏览器')@classmethoddef tearDownClass(cls) -> None:print('5. 关闭浏览器')def test_1(self):print('3. 输入用户名密码验证码1,点击登录 ')def test_2(self):print('3. 输入用户名密码验证码2,点击登录 ')def test_3(self):print('3. 输入用户名密码验证码3,点击登录 ')

断言

使用代码自动的判断预期结果和实际结果是否相符
assertEqual(预期结果,实际结果)
- 判断预期结果和实际结果是否相等,如果相等, 用例通过,如果不相等,抛出异常, 用例不通过
assertIn(预期结果,实际结果)
- 判断预期结果是否包含在 实际结果中, 如果存在,用例通过, 如果不存在,抛出异常,用例不通过
class TestAssert(unittest.TestCase):def test_equal_1(self):self.assertEqual(10, 10)  # 用例通过def test_assert_2(self):self.assertEqual(10, 11)  # 用例不通过def test_in(self):# self.assertIn('admin', '欢迎 admin 登录')  # 包含 通过# self.assertIn('admin', '欢迎 adminnnnnnnn 登录')  # 包含 通过# self.assertIn('admin', '欢迎 aaaaaadminnnnnnnn 登录')  # 包含 通过# self.assertIn('admin', '欢迎 adddddmin 登录')  # 不包含 不通过self.assertIn('admin', 'admin')  # 包含 通过
from hm_02_assert import TestAssertsuite = unittest.TestSuite()suite.addTest(unittest.makeSuite(TestAssert))
unittest.TextTestRunner().run(suite)

练习

1. 定义一个 tools 模块, 在这个模块中 定义 add 的方法,可以对两个数字求和,返回求和结果
2. 书写用例, 对 add() 函数进行测试
1, 1, 2
1, 2, 3
3, 4, 7
4, 5, 9
class TestAdd(unittest.TestCase):def test_1(self):self.assertEqual(2, add(1, 1))def test_2(self):self.assertEqual(3, add(1, 2))def test_3(self):self.assertEqual(7, add(3, 4))def test_4(self):self.assertEqual(9, add(4, 5))

参数化

  • 通过参数的方式来传递数据,从而实现数据和脚本分离。并且可以实现用例的重复执行。(在书写用例方法的时候,测试数据使用变量代替,在执行的时候进行据说传递)
  • unittest 测试框架,本身不支持参数化,但是可以通过安装unittest扩展插 件 parameterized 来实现。

环境准备

因为参数化的插件 不是 unittest 自带的,所以想要使用 需要进行安装
Python 中 包(插件,模块) 的安装,使用 pip 工具
pip install parameterized
pip install -i https://pypi.douban.com/simple/ parameterized
# 在终端(cmd)中执行

使用

1. 导包 from para... import para...
2. 修改测试方法,将测试方法中的测试数据使用 变量表示
3. 组织测试数据,格式 [(), (), ()], 一个元组就是一组测试数据
4. 参数化,在测试方法上方使用装饰器 @parameterized.expand(测试数据)
5. 运行(直接 TestCase 或者 使用 suite 运行)
import unittestfrom tools import add
from parameterized import parameterizeddata = [(1, 1, 2), (1, 2, 3), (2, 3, 5), (4, 5, 9)]class TestAdd(unittest.TestCase):@parameterized.expand(data)def test_add(self, a, b, expect):print(f'a:{a}, b:{b}, expect:{expect}')self.assertEqual(expect, add(a, b))if __name__ == '__main__':unittest.main()

练习

将测试数据 定义为 json 文件, 读取 json 文件,完成参数化

json 文件

[[1, 1, 2],[1, 2, 3],[2, 3, 5],[4, 5, 9],[10, 20, 30]
]

读取 json 文件

import json
from app import BASE_DIRdef build_add_data():with open('../data/add_data.json') as f:data = json.load(f)  # [[], [], []]  ---> [(), ()]return datadef build_add_data_1():with open('../data/add_data_1.json') as f:data_list = json.load(f)  # [{}, {}, {}]  ----> [(), ()]new_list = []for data in data_list:  # data 字典# 字典中的值,是否都需要a = data.get('a')b = data.get('b')expect = data.get('expect')new_list.append((a, b, expect))return new_listdef build_add_data_2():with open(BASE_DIR + '/data/add_data_1.json') as f:data_list = json.load(f)  # [{}, {}, {}]  ----> [(), ()]new_list = []for data in data_list:  # data 字典# 字典中的值,是否都需要new_list.append(tuple(data.values()))return new_listdef build_login_data():with open(BASE_DIR + '/data/login_data.json', encoding='utf-8') as f:data_list = json.load(f)  # [{}, {}] ---> [()]new_list = []for data in data_list:# 字典中的 desc 不需要username = data.get('username')password = data.get('password')expect = data.get('expect')new_list.append((username, password, expect))return new_listif __name__ == '__main__':# print(build_add_data_2())print(build_login_data())
import unittestfrom common.read_data import build_add_data_2
from tools import add
from parameterized import parameterizeddata = [(1, 1, 2), (1, 2, 3), (2, 3, 5), (4, 5, 9)]class TestAdd(unittest.TestCase):# @parameterized.expand(build_add_data())# @parameterized.expand(build_add_data_1())@parameterized.expand(build_add_data_2())def test_add(self, a, b, expect):print(f'a:{a}, b:{b}, expect:{expect}')self.assertEqual(expect, add(a, b))if __name__ == '__main__':unittest.main()

测试报告 HTMLTestReport

使用第三方的报告模版,生成报告 HTMLTestReport, 本质是 TestRunner
- 安装
pip install -i https://pypi.douban.com/simple/ HTMLTestReport
- 使用
1. 导包 unittest、HTMLTestReport
2. 组装用例(套件, loader )
3. 使用 HTMLTestReport 中的 runner 执行套件
4. 查看报告
import unittestfrom htmltestreport import HTMLTestReport
from hm_04_pa1 import TestAdd# 套件suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestAdd))# 运行对象
# runner = HTMLTestReport(报告的文件路径后缀.html, 报告的标题, 其他的描述信息)
# runner = HTMLTestReport('test_add_report.html', '加法用例测试报告', 'xxx')
# runner = HTMLTestReport('./report/test_add_report.html', '加法用例测试报告', 'xxx')
runner = HTMLTestReport('report/test_add_report.html', '加法用例测试报告', 'xxx')
runner.run(suite)

使用绝对路径

将来的项目是分目录书写的, 使用相对路径,可能会出现找不到文件的情况,此时需要使用 绝对路径
方法:
1. 在项目的根目录,创建一个 Python 文件(app.py 或者 config.py)
2. 在这个文件中 获取项目的目录,在其他代码中使用 路径拼接完成绝对路径的书写

获取当前路径

在这里插入图片描述

import os# __file__ 特殊的变量,表示当前代码文件名
# path1 = os.path.abspath(__file__)
# print(path1)
# path2 = os.path.dirname(path1)
# print(path2)# BASE_DIR = os.path.dirname(os.path.abspath(__file__))
BASE_DIR = os.path.dirname(__file__)if __name__ == '__main__':print(BASE_DIR)

案例

1, 对登录函数进行测试, 登录函数 定义在 tools.py 中
2, 在 case 目录中书写用例对login 函数进行测试, 使用断言
3, 将 login 函数的测试数据定义在 json 文件中,完成参数化, data 目录中
4, 生成测试报告 report 目录中

测试的方法

def login(username, password):if username == 'admin' and password == '123456':return '登录成功'else:return '登录失败'def add(a, b):return a + b

测试的数据

[{"desc": "正确的用户名和密码","username": "admin","password": "123456","expect": "登录成功"},{"desc": "错误的用户名","username": "root","password": "123456","expect": "登录失败"},{"desc": "错误的密码","username": "admin","password": "123123","expect": "登录失败"},{"desc": "错误的用户名和密码","username": "root","password": "123123","expect": "登录失败"}
]

读取测试数据

def build_login_data():with open(BASE_DIR + '/data/login_data.json', encoding='utf-8') as f:data_list = json.load(f)  # [{}, {}] ---> [()]new_list = []for data in data_list:# 字典中的 desc 不需要username = data.get('username')password = data.get('password')expect = data.get('expect')new_list.append((username, password, expect))return new_list

测试用例代码

import unittestfrom common.read_data import build_login_data
from tools import login
from parameterized import parameterizedclass TestLogin(unittest.TestCase):@parameterized.expand(build_login_data())def test_login(self, username, password, expect):print(f'username: {username}, password: {password}, expect: {expect}')self.assertEqual(expect, login(username, password))

suit报告代码

import unittestfrom app import BASE_DIR
from case.test_login import TestLogin
from htmltestreport import HTMLTestReportsuite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestLogin))runner = HTMLTestReport(BASE_DIR + '/report/login_report.html', '登录测试报告', 'V1.0')
runner.run(suite)

跳过

跳过:对于一些未完成的或者不满足测试条件的测试函数和测试类,可以跳过执行(简单来说, 不想执行的测试方法,可以
设置为跳过)
- 直接将测试函数标记成跳过
@unittest.skip('跳过的原因')
- 根据条件判断测试函数是否跳过
@unittest.skipIf(判断条件, reason='原因') # 判断条件为 True, 执行跳过
class TestSkip(unittest.TestCase):@unittest.skip('没什么原因,就是不想执行')def test_1(self):print('方法一')@unittest.skipIf(version >= 30, '版本号大于等于 30, 测方法不用执行')def test_2(self):print('方法二')def test_3(self):print('方法三')if __name__ == '__main__':unittest.main()
import unittestfrom hm_06_skip import TestSkipsuite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestSkip))unittest.TextTestRunner().run(suite)

相关文章:

python测试工程师 之 unittest框架总结

unittest 学习目标unittest 框架的基本使⽤⽅法(组成)断⾔的使⽤ (让程序⾃动的判断预期结果和实际结果是否相符)参数化(多个测试数据, 测试代码写⼀份 传参)⽣成测试报告 复习pythonunittest 框架的介绍核⼼要素(组成)1. TestCase 测试⽤例, 这个测试⽤例是 unittest 的组成部…...

微服务中的相关概念

Eureka Eureka 是由 Netflix 开发的一个服务发现和注册中心,广泛应用于微服务架构中。Eureka 主要用于管理和协调分布式服务的注册和发现,确保各个服务之间能够方便地找到并通信。它是 Netflix OSS(Netflix Open Source Software&#xff09…...

常见的设计模式

设计模式是一套被反复使用的、代码设计经验的总结。它们被用来解决软件开发中的某些常见问题,提高代码的可维护性、可扩展性和重用性。设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。以下是一些常见的设计模式及其简要说明: …...

Camtasia2024中文版最新电脑录屏剪辑神器!

大家好,今天我要安利一个我最近超级喜欢的工具——Camtasia2024中文版!这款软件真的太棒了,它让我的视频编辑工作变得更加轻松和高效。如果你也对视频制作感兴趣,那么一定要尝试一下这款神器哦! Camtasia2024win-正式…...

【性能优化】表分区实践最佳案例

背景 随着数字化建设的持续深入,企业的业务规模迎来了高速发展,其数据规模也呈现爆炸式增长,如果继续使用传统解决方案,将所有数据存储在一个表中,对数据的查询和维护效率将是一个巨大的挑战,在这个背景下…...

力扣SQL50 项目员工 I ROUND AVG

Problem: 1075. 项目员工 I 👨‍🏫 参考题解 Code select project_id,ROUND(AVG(e.experience_years),2) as average_years FROMproject as p LEFT JOINemployee as e ONp.employee_id e.employee_id GROUP BYp.project_id;...

nuscenes 数据集学习笔记

目录 数据信息类型: 数据信息类型: Map & Camera(png), Lidar(激光雷达) & Radar(雷达)(pcd), Json 文件结构(以v1.0-mini为例): maps: 存放Map的png文件samples: 存放Camera, Lidar, Radar关键非结构化数据信息, 带标注sweeps: 存放Camera, Lidar, Radar 次要非结构…...

在Windows上用MinGW编译OpenCV项目运行全流程

一、准备软件 OpenCV源码CMake工具MinGW工具链(需要选用 posix 线程版本:原因见此) 二、操作步骤 官网提供了VC16构建版本的二进制包,但是没有给出GCC编译的版本。所以如果使用MinGW进行构建,那就只能从源码开始构建…...

用Vite基于Vue3+ts+DataV+ECharts开发数据可视化大屏,即能快速开发又能保证屏幕适配

数据可视化大屏 基于 Vue3、Typescript、DataV、ECharts5 框架的大数据可视化(大屏展示)开发。此项目vue3实现界面,采用新版动态屏幕适配方案,全局渲染组件封装,支持数据动态刷新渲染、内部DataV、ECharts图表都支持自…...

大二学生眼中的Netty?基于Netty实现内网穿透!

爷的开场白 掘金的朋友们大家好!我是新来的Java练习生 CodeCodeBond! 这段时间呢,博主在学习Netty,想做一个自己感兴趣好玩的东西,那就是内网穿透!!(已经实现主要代理功能但有待优化…...

JavaStringBuffer与StringBuilder

StringBuffer、StringBuilder 文章目录 StringBuffer、StringBuilderStringBuffer和StringBuilder的理解可变性分析对于String对于StringBuilder 常用方法执行效率对比 StringBuffer和StringBuilder的理解 String 不可变的字符序列 StringBuffer 可变的字符序列 JDK1.0声明&…...

云徙科技助力竹叶青实现用户精细化运营,拉动全渠道销售额增长

竹叶青茶以其别具一格的风味与深厚的历史底蕴,一直被誉为茶中瑰宝。历经千年的传承与创新,竹叶青不仅坚守着茶叶品质的极致追求,更在数字化的浪潮中,率先打破传统,以科技力量赋能品牌,成为茶行业的领军者。…...

深度揭秘:深度学习框架下的神经网络架构进化

深度学习框架下的神经网络架构经历了从基础到复杂的显著进化,这一进程不仅推动了人工智能领域的突破性进展,还极大地影响了诸多行业应用。本文旨在深入浅出地揭示这一进化历程,探讨关键架构的创新点及其对现实世界的影响。 引言:…...

MySQL的DML语句

文章目录 ☃️概述☃️DML☃️添加数据☃️更新和删除数据☃️DML的重要性 ☃️概述 MySQL 通用语法分类 ● DDL: 数据定义语言,用来 定义数据库对象(数据库、表、字段) ● DML: 数据操作语言,用来对数据库表中的数据进行增删改 …...

Wireshark的基本用法以及注意事项

Wireshark 是一个流行的网络协议分析工具,可以捕获和分析网络数据包。以下是一些常见的 Wireshark 的用法: 安装和启动:首先需要下载和安装 Wireshark。安装完成后,可以通过启动 Wireshark 应用程序来打开它。 选择网络接口&…...

集团门户网站的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,论坛管理,集团文化管理,基础数据管理,公告通知管理 前台账户功能包括:系统首页,个人中心,论坛&#xff0…...

Tomcat基础详解

第一篇:Tomcat基础篇 lecture:邓澎波 一、构建Tomcat源码环境 工欲善其事必先利其器,为了学好Tomcat源码,我们需要先在本地构建一个Tomcat的运行环境。 1.源码环境下载 源码有两种下载方式: 1.1 官网下载 https://…...

【Python爬虫】爬取名人名言页面并进行简单的数据清洗(入门级)

目录 资源链接 一、网站选择 二、数据爬取要求 三、数据清洗要求 四、实现代码 1.数据采集 2.数据清洗 资源链接 下面有笔者所放的源码下载链接,读者可自行下载: 链接:https://pan.baidu.com/s/1YmTdlnbSJLvLrrx92zz6Qg 提取码&…...

Microsoft Visual C++ Redistributable 【安装包】【高速下载】

方法1、可以从官方下载,如下图 Visual C Redistributable for Visual Studio 2015 但是此链接只有一个版本 方法2 已经下载好并且已经整理好了2008--2022的所有版本点击下方链接即可高速下载 如果是win7-win8-win10-win11直接可以下载2015--2022版本&#xff0c…...

MFC绘制哆啦A梦

文章目录 OnPaint绘制代码完整Visual Studio工程下载其他卡通人物绘制 OnPaint绘制代码 CPaintDC dc(this); // 用于绘画的设备上下文CRect rc;GetWindowRect(rc);int cxClient rc.Width();int cyClient rc.Height();// 辅助线HPEN hPen CreatePen(PS_DOT, 1, RGB(192, 192,…...

网络编程(TCP协议,UDP协议)

目录 网络编程三要素 IP IPv4 InetAddress类 端口号 协议 UDP协议 UDP协议发送数据 UDP协议接收数据 UDP的三种通信方式(代码实现) TCP协议 TCP通信程序 三次握手和四次挥手 练习 1、客户端:多次发送数据服务器:接收多次接收数据,并打印 2、客户端…...

读取Jar包下文件资源的问题及解决方案

问题 项目A代码调用到Resouces下的文件a.sh,打包成Jar包后,项目B调用对应方法时,出现报错,找不到a.sh文件路径,原来的代码可能是: URL resource getClass().getClassLoader().getResource("a.sh&qu…...

C++ 反转一个二进制串

描述 一个32位有符号整数,用二进制编码来表示。现需要将该二进制编码按位反转,计算出反转后的值。 示例1 输入: 1 返回值: -2147483648 说明: 00000000 00000000 00000000 00000001 翻转后为 10000000 000000…...

黑神话悟空-吉吉国王版本【抢先版】

在中国的游戏市场中,一款名为“黑神话悟空”的游戏引起了广泛的关注。这款游戏以中国传统的神话故事“西游记”为背景,创造了一个令人震撼的虚拟世界。今天,我们要来介绍的是这款游戏的一种特殊版本,那就是吉吉国王版本。 在吉吉国…...

【尚庭公寓SpringBoot + Vue 项目实战】预约看房与租约管理(完结)

【尚庭公寓SpringBoot Vue 项目实战】预约看房与租约管理(完结) 文章目录 【尚庭公寓SpringBoot Vue 项目实战】预约看房与租约管理(完结)1、业务说明2、接口开发2.1、预约看房管理2.1.1.保存或更新看房预约2.1.2. 查询个人预约…...

java拼图小游戏项目

创建一个Java拼图小游戏是一个有趣且富有教育意义的项目,可以锻炼你的编程技能。以下是开发一个基本拼图游戏可能需要考虑的几个步骤: 项目规划: 确定游戏的基本规则和玩法。设计游戏的界面和用户交互。 环境搭建: 确保你的开发环…...

[C++][数据结构][跳表]详细讲解

目录 0.什么是跳表?1.SkipList的优化思路2.SkipList的效率如何保证?3.SkipList实现4.SkipList VS 平衡搜索树 && Hash 0.什么是跳表? SkipList本质上也是一种查找结构,用于解决算法中的查找问题,跟平衡搜索树…...

tinyxml

github下载相关的软件包,其中有四个文件需要主要需要关注就是分别是tinyxml12.cpp,tinyxml12.h,rss网页xml文件,还有就是官方给的test文件tinyxmltest.cpp。 example1就是提供一个打开文件的方式 int example_1() {XMLDocument …...

Docker(三)-Docker常用命令

1.run run命令执行流程:2.帮助启动类命令 2.1 启动docker systemctl start docker2.2 停止docker systemctl stop docker2.3 重启docker systemctl restart docker2.4查看docker状态 systemctl status docker2.5开机启动 systemctl enable docker2.6查看docker概要信息 …...

[MRCTF2020]PixelShooter

一个apk文件 jeb打开发现是apk文件 apk游戏逆向必须知道的知识: 一般关键数据在 Assets/bin/data/managed/assembly-csharp.dll这个文件里面 我不知道jeb为什么这里我没有 apk是个压缩包 直接解压 这个文件解压也可以发现flag {Unity_1S_Fun_233}...

wordpress 登录美化/网络营销怎么做

随便挑了一张看起来比较高端的图片有些朋友可能玩过按键精灵,一个用来操作键盘鼠标完成一些自动化工作的软件。其实如果你学了Python的话,完全用不着按键精灵这种东西了。因为广泛的Python类库里,就有PyAutoGUI这样可以变成控制键盘鼠标的类库…...

做身份证网站/市场推广方案怎么做

Angular 中的路由 一、 Angular 创建一个默认带路由的项目 命令创建项目 ng new ng-demo --skip-install 创建需要的组件 ng g component components/home ng g component components/news ng g component components/newscontent找到 app-routing.module.ts 配置路由 引入…...

做视频赚钱的网站有哪些/灰色seo关键词排名

问:怎么看CPU的位数? 答:使用例如EVEREST、鲁大师等此类软件能够检测到,以下以我电脑的截图来分析一下: 以上表示既支持32位系统,又支持64位系统; 问:我们说的32位操作系统指的是什么…...

仿百度 wordpress/百度认证营销顾问

常用的数据分析方法 对比分析法 分组分析法 平均分析法 交叉分析法 杜邦分析法 漏斗图分析法 数据分析作用与对应的分析方法 数据分析作用基本方法数据分析方法现状分析细分对比分析、平均分析、综合评价分析原因分析细分分组分析、结构分析、交叉分析、杜邦分析、漏斗图分析…...

wordpress支持视频播放/如何制作小程序

类似问题答案2015年湖南科技学院计算机科学与技术专业在河南录取分数线学校 地 区 专业 年份 批次 类型 分数 湖南科技学院 河南 计算机科学与技术 2015 二批 理科 495 学校 地 区 专业 年份 批次 类型 分数 湖南科技学院 河南 计算机科学与技术 2016 二批 理科 495 湖南科技学…...

怎样设置默认网站/360推广登录

介绍效率已成为及时完成工作的关键因素。一个人不应该花超过合理的时间去完成事情。尤其是当任务涉及基本编码时。使用Pandas库能节省你的时间。Pandas是一个开源包。它有助于用Python语言执行数据分析和数据操作。此外,它还为我们提供了灵活的数据结构。目录Pandas…...