【unittest学习】unittest框架主要功能
1.认识unittest
在 Python 中有诸多单元测试框架,如 doctest、unittest、pytest、nose 等,Python 2.1 及
其以后的版本已经将 unittest 作为一个标准模块放入 Python 开发包中。
2.认识单元测试
不用单元测试框架能写单元测试吗?答案是肯定的。单元测试本质上就是通过一段代
码去验证另外一段代码,所以不用单元测试框架也可以写单元测试。下面就通过例子演示。
创建一个被测试文件 calculator.py。
# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:2023/2/22
"""# 创建一个计算器类
class Calculator:""" 用于完成两个数的加、减、乘、除 """def __init__(self, a, b):self.a = int(a)self.b = int(b)# 加法def add(self):return self.a + self.b# 减法def sub(self):return self.a - self.b# 乘法def mul(self):return self.a * self.b# 除法def div(self):return self.a / self.b
程序非常简单,创建一个 Calculator 类,通过__init__()方法接收两个参数,并做 int 类
型转换。创建 add()、sub()、mul()、div()方法分别进行加、减、乘、除运算。
根据上面实现的功能,创建 test_calculator.py 文件。
# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:2023/2/22
"""from calculator import Calculatordef test_add():c = Calculator(3, 6)result = c.add()assert result == 9, '加法运算失败!'def test_sub():c = Calculator(7, 2)result = c.sub()assert result == 5, '减法运算失败!'def test_mul():c = Calculator(3, 3)result = c.mul()assert result == 10, '乘法运算失败!'def test_div():c = Calculator(6, 2)result = c.div()assert result == 3, '除法运算失败!'if __name__ == '__main__':test_add()test_sub()test_mul()test_div()
运行结果如下:

在测试代码中,首先引入 calculator 文件中的 Calculator 类,并对测试数据进行初始化。
接下来调用该类下面的方法,得到计算结果,并断言结果是否正确。
这样的测试存在着一些问题。首先,我们需要自己定义断言失败的提示;其次,当一
个测试函数运行失败后,后面的测试函数将不再执行;最后,执行结果无法统计。
当然,我们可以通过编写更多的代码来解决这些问题,但这就偏离了我们做单元测试
的初衷。我们应该将重点放在测试本身,而不是其他上面。引入单元测试框架可以很好地
解决这些问题。
下面通过 unittest 单元测试框架重新编写测试用例:
import unittest
from calculator import Calculatorclass TestCalculator(unittest.TestCase):def test_add(self):c = Calculator(3, 6)result = c.add()self.assertEqual(result, 9)def test_sub(self):c = Calculator(7, 2)result = c.sub()self.assertEqual(result, 5)def test_mul(self):c = Calculator(3, 3)result = c.mul()self.assertEqual(result, 10)def test_div(self):c = Calculator(6, 2)result = c.div()self.assertEqual(result, 3)if __name__ == '__main__':unittest.main()
运行结果如下:

引入 unittest 模块。如果想用 unittest 编写测试用例,那么一定要遵守它的“规则”。
(1)创建一个测试类,这里为 TestCalculator 类,必须要继承 unittest 模块的 TestCase
类。
(2)创建一个测试方法,该方法必须以“test”开头。
接下来的测试步骤与前面测试代码相同。
首先,调用被测试类,传入初始化数据。
其次,调用被测试方法,得到计算结果。通过 unittest 提供的 assertEqual()方法来断言
结果是否与预期结果相同。该方法由 TestCase 父类提供,由于继承了该类,所以可以通过
self 调用。
最后,调用 unittest 的 main()来执行测试用例,它会按照前面的两条规则查找测试用例
并执行。
3.unittest重要的概念
unittest 文档中有四个重要的概念:Test Case、Test Suite、Test Runner 和 Test Fixture。只有理解了这几个概念,才能理解单元测试的基本特征。
1.Test Case
Test Case 是最小的测试单元,用于检查特定输入集合的特定返回值。unittest 提供了
TestCase 基类,我们创建的测试类需要继承该基类,它可以用来创建新的测试用例。
2.Test Suite
测试套件是测试用例、测试套件或两者的集合,用于组装一组要运行的测试。unittest
提供了 TestSuite 类来创建测试套件。
3.Test Runner
Test Runner 是一个组件,用于协调测试的执行并向用户提供结果。Test Runner 可以使
用图形界面、文本界面或返回特殊值来展示执行测试的结果。
unittest 提供了 TextTestRunner类运行测试用例,为了生成 HTML 格式的测试报告,后面会选择使用 HTMLTestRunner 运行类。
4.Test Fixture
Test Fixture 代表执行一个或多个测试所需的环境准备,以及关联的清理动作。例如,
创建临时或代理数据库、目录,或启动服务器进程。unittest 中提供了 setUp()/tearDown()、
setUpClass()/tearDownClass()等方法来完成这些操作。
在理解了上面几个概念之后,我们对前面的测试用例做如下修改:
import unittest
from calculator import Calculatorclass TestCalculator(unittest.TestCase):# 测试用例前置动作def setUp(self):print("test start:")# 测试用例后置动作def tearDown(self):print("test end")def test_add(self):c = Calculator(3, 5)result = c.add()self.assertEqual(result, 8)def test_sub(self):c = Calculator(7, 2)result = c.sub()self.assertEqual(result, 5)def test_mul(self):c = Calculator(3, 3)result = c.mul()self.assertEqual(result, 10)def test_div(self):c = Calculator(6, 2)result = c.div()self.assertEqual(result, 3)if __name__ == '__main__':# 创建测试套件suit = unittest.TestSuitesuit.addTest(TestCalculator('test_add'))suit.addTest(TestCalculator("test_sub"))suit.addTest(TestCalculator("test_mul"))suit.addTest(TestCalculator("test_div"))# 创建测试运行器runner = unittest.TextTestRunner()runner.run(suit)
首先,创建一个测试类并继承 TestCase 类,在该类下面创建一条以“test”开头的方法
为测试用例。这个前面已有说明,这里再次说明是为了强调它的重要性。
其次,在测试类中增加了 setUp()/tearDown()方法,用于定义测试用例的前置和后置动
作。因为在当前测试中暂时用不上,所以这里定义了一些简单的打印。
接下来,是测试用例的执行,这里做了很大的改动。首先,抛弃了 unittest 提供的 main()
方法,而是调用 TestSuite 类下面的 addTest()来添加测试用例。因为一次只能添加一条用例,
所以需要指定测试类及测试方法。然后,再调用 TextTestRunner 类下面的 run()运行测试套
件
这样做确实比直接使用 main()方法要麻烦得多,但也并非没有优点。
首先,测试用例的执行顺序可以由测试套件的添加顺序控制,而 main()方法只能按照
测试类、方法的名称来执行测试用例。例如,TestA 类比 TestB 类先执行,test_add()用例比
test_div()用例先执行。
其次,当一个测试文件中有很多测试用例时,并不是每次都要执行所有的测试用例,
尤其是比较耗时的 UI 自动化测试。因而通过测试套件和测试运行器可以灵活地控制要执行
的测试用例。
执行结果如下:
test start:
test end
test start:
test end
test start:
test endRan 4 tests in 0.013s
FAILED (failures=1)
10 != 9
预期:9
实际:10
<点击以查看差异>Traceback (most recent call last):File "C:\Users\Administrator\PycharmProjects\AutoFunction\test_calculator.py", line 28, in test_mulself.assertEqual(result, 10)
AssertionError: 9 != 10test start:
test end
从执行结果可以看到,setUp/tearDown 作用于每条测试用例的开始之处与结束之处。
4.断言方法
在执行测试用例的过程中,最终测试用例执行成功与否,是通过测试得到的实际结果
与预期结果进行比较得到的。unittest 框架的 TestCase 类提供的用于测试结果的断言方法如
下表所示。

断言方法的使用如下所示:
# _*_ coding:utf-8 _*_import unittestclass TestAssert(unittest.TestCase):def test_equal(self):self.assertEqual(2 + 2, 4)self.assertEqual("python", "python")self.assertNotEqual("hello", "python")def test_in(self):self.assertIn("hello", "hello world")self.assertNotIn("hi", "hello")def test_true(self):self.assertTrue(True)self.assertFalse(False)if __name__ == '__main__':unittest.main()
运行上面的测试用例,即可通过测试结果推断出这些断言方法是如何使用的。
5.测试用例的组织与 discover 方法
我们可以在一个测试文件中定义多个测试类,只要它们遵循测试用例的“规则”,main()
方法就可以找到并执行它们。但是,我们要测试的类或方法可能有很多。
下面开发一个功能,用于判断某年是否为闰年。创建 leap_year.py 文件。
# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:2023/2/23
"""class LeapYear:"""计算某年是否为闰年"""def __init__(self, year):self.year = int(year)def answer(self):year = self.yearif year % 100 == 0:if year % 400 == 0: # 整百年能被 400 整除的是闰年return "{0}是闰年".format(year)else:return "{0}不是闰年".format(year)else:if year % 4 == 0: # 非整百年能被 4 整除的是闰年return "{0}是闰年".format(year)else:return "{0}不是闰年".format(year)
创建对应的测试文件 test_leap_year.py
# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:2023/2/23
"""
import unittest
from leap_year import LeapYearclass TestLeapYear(unittest.TestCase):def test_2000(self):ly = LeapYear(2000)self.assertEqual(ly.answer(), "2000是闰年")def test_2004(self):ly = LeapYear(2004)self.assertEqual(ly.answer(), "2004是闰年")def test_2017(self):ly = LeapYear(2017)self.assertEqual(ly.answer(), "2017不是闰年")def test_2100(self):ly = LeapYear(2100)self.assertEqual(ly.answer(), "2100不是闰年")if __name__ == '__main__':unittest.main()
显然,这里的判断闰年功能(leap_year.py)和计算器功能(calculator.py)并不相关,
它们的代码分别写在两个文件当中,所以对应的测试用例最好分开,分别为test_calculator.py
和 test_leap_year.py。
当前目录结构如下:

如何执行多个测试文件呢?unittest中的TestLoader类提供的discover()方法可以从多个
文件中查找测试用例。
该类根据各种标准加载测试用例,并将它们返回给测试套件。正常情况下,不需要创
建这个类的实例。unittest 提供了可以共享的 defaultTestLoader 类,可以使用其子类或方法
创建实例,discover()方法就是其中之一。
discover(start_dir,pattern='test*.py',top_level_dir=None)
找到指定目录及其子目录下的所有测试模块,只有匹配的文件名才能被加载。如果启
动的不是顶层目录,那么顶层目录必须单独指定。
start_dir :待测试的模块名或测试用例目录。
pattern='test*.py' :测试用例文件名的匹配原则。此处匹配文件名以“test”开头
的“.py”类型的文件,星号“*”表示任意多个字符。
top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,则默认为 None。
现在通过 discover()方法重新实现 run_tests.py 文件的功能。
import unittest
# 定义测试用例的目录为当前目录中的AutoFunction/目录
test_dir = './AutoFunction'
suits = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')
if __name__ == '__main__':runner = unittest.TextTestRunner()runner.run(suits)
discover()方法会自动根据测试用例目录(test_dir)查找测试用例文件(test*.py),并
将找到的测试用例添加到测试套件中,因此,可以直接通过 run()方法执行测试套件 suits。
这种方式极大地简化了测试用例的查找,我们需要做的就是按照文件的匹配规则创建测试
文件即可。
6.测试用例的执行顺序
测试用例的执行顺序涉及多个层级:多个测试目录 > 多个测试文件 > 多个测试类 >
多个测试方法(测试用例)。unittest 提供的 main()方法和 discover()方法是按照什么顺序查
找测试用例的呢?
我们先运行一个例子,再解释 unittest 的执行策略。
# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:date:2023/2/23
"""import unittestclass TestBdd(unittest.TestCase):def setUp(self):print('test TestBdd:')def test_ccc(self):print('test ccc')def test_aaa(self):print('test aaa')class TestAdd(unittest.TestCase):def setUp(self):print("test TestAdd:")def test_bbb(self):print("test bbb")if __name__ == '__main__':unittest.main()
执行结果如下:

无论执行多少次,结果都是一样的。通过上面的结果,相信你已经找到 main()方法执
行测试用例的规律了。
因为unittest默认根据ASCII码的顺序加载测试用例的(数字与字母的顺序为0~9,A~Z,
a~z),所以 TestAdd 类会优先于 TestBdd 类被执行,test_aaa()方法会优先于 test_ccc()方法
被执行,也就是说,它并不是按照测试用例的创建顺序从上到下执行的。
discover()方法和 main()方法的执行顺序是一样的。对于测试目录与测试文件来说,上
面的规律同样适用。test_aaa.py 文件会优先于 test_bbb.py 文件被执行。所以,如果想让某
个测试文件先执行,可以在命名上加以控制。
除命名外,有没有其他办法控制测试用例的执行顺序呢?答案是肯定的,前面也有介
绍,我们可以声明测试套件 TestSuite 类,通过 addTest()方法按照一定的顺序来加载测试用
例。
修改上面的例子如下:
# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:date:2023/2/23
"""import unittestclass TestBdd(unittest.TestCase):def setUp(self):print('test TestBdd:')def test_ccc(self):print('test ccc')def test_aaa(self):print('test aaa')class TestAdd(unittest.TestCase):def setUp(self):print("test TestAdd:")def test_bbb(self):print("test bbb")if __name__ == '__main__':# 构造测试集suite = unittest.TestSuite()suite.addTest(TestBdd("test_aaa"))suite.addTest(TestAdd("test_bbb"))suite.addTest(TestBdd("test_ccc"))# 执行测试runner = unittest.TextTestRunner()runner.run(suite)
执行结果如下:

现在的执行顺序与 addTest()方法加载测试用例的顺序相同。不过,当测试用例非常多
时,不推荐用这种方法创建测试套件,原因前面也有说明,最好的方法是通过命名控制执
行顺序。如果测试用例在设计时不产生相互依赖,那么测试用例的执行顺序就没那么重要
了。
7.跳过测试和预期失败
在运行测试时,有时需要直接跳过某些测试用例,或者当测试用例符合某个条件时跳
过测试,又或者直接将测试用例设置为失败。unittest 提供了实现这些需求的装饰器。
无条件地跳过装饰的测试,需要说明跳过测试的原因:
unittest.skip(reason)
如果条件为真,则跳过装饰的测试:
unittest.skipIf(condition, reason)
当条件为真时,执行装饰的测试:
unittest.skipUnless(condition, reason)
不管执行结果是否失败,都将测试标记为失败:
unittest.expectedFailure()
举例如下:
import unittestclass MyTest(unittest.TestCase):@unittest.skip("直接跳过测试")def test_skip(self):print("test aaa")@unittest.skipIf(3 > 2, "当条件为真时跳过测试")def test_skip_if(self):print('test bbb')@unittest.skipUnless(3 > 2, "当条件为真时执行测试")def test_skip_unless(self):print('test ccc')@unittest.expectedFailuredef test_expected_failure(self):self.assertEqual(2, 3)if __name__ == '__main__':unittest.main()
执行结果如下:
Skipped: 直接跳过测试
Skipped: 当条件为真时跳过测试
test ccc
Ran 4 tests in 0.010s
OK (skipped=2, expected failures=1)
上面的例子创建了四条测试用例。
第一条测试用例通过@unittest.skip()装饰,直接跳过测试。
第二条测试用例通过@unittest.skipIf()装饰,当条件为真时跳过测试;3>2 条件为真
(True),所以跳过测试。
第三条测试用例通过@unittest.skipUnless()装饰,当条件为真时执行测试;3>2 条件为
真(True),执行测试。
第四条测试用例通过@unittest.expectedFailure 装饰,不管执行结果是否失败,都将测
试标记为失败,但不会抛出失败信息。
8.Fixtuer(测试夹具)
我们可以把 Fixture 看作夹心饼干外层的两片饼干,这两片饼干就是 setUp/tearDown,
中间的奶油就是测试用例。除此之外,unittest 还提供了更大范围的 Fixture,如测试类和模
块的 Fixture。
# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
"""
import unittestdef setUpModule():print("test module start >>>>>>>>>>>>>>")def tearDownModule():print("test module end >>>>>>>>>>>>>>")class MyTest(unittest.TestCase):@classmethoddef setUpClass(cls):print("test class start =======>")@classmethoddef tearDownClass(cls):print("test class end =======>")def setUp(self):print("test case start -->")def tearDown(self):print("test case end -->")def test_case1(self):print("test case1")def test_case2(self):print("test case2")if __name__ == '__main__':unittest.main()
执行结果如下:
test module start >>>>>>>>>>>>>>
test class start =======>
test case start -->
test case1
test case end -->
test case start -->
test case2
test case end -->
test class end =======>
test module end >>>>>>>>>>>>>>
Ran 2 tests in 0.005s
OK
setUpModule/tearDownModule:在整个模块的开始与结束时被执行。
setUpClass/tearDownClass:在测试类的开始与结束时被执行。
setUp/tearDown:在测试用例的开始与结束时被执行。
需要注意的是,setUpClass/tearDownClass 为类方法,需要通过@classmethod 进行装饰。
另外,方法的参数为 cls。其实,cls 与 self 并没有什么本质区别,都只表示方法的第一个
参数。
相关文章:

【unittest学习】unittest框架主要功能
1.认识unittest在 Python 中有诸多单元测试框架,如 doctest、unittest、pytest、nose 等,Python 2.1 及其以后的版本已经将 unittest 作为一个标准模块放入 Python 开发包中。2.认识单元测试不用单元测试框架能写单元测试吗?答案是肯定的。单…...

京东测开岗3+1面经+经验分享,拿到offer,月薪34k....
现在,招聘黄金时间已经来临,在网上看了很多大佬的面经,也加了很多交流群,受到了很多朋友的提点,今天终于轮到我来分享面经啦,之前面试了几家公司,最后拿到了京东测试岗的 offer,这里…...

后端接收格式为x-www-form-urlencoded的数据
1.x-www-form-urlencoded是什么? x-www-form-urlencoded纸面翻译即所谓url格式的编码,是post的默认Content-Type,其实就是一种编码格式,类似json也是一种编码传输格式。form表单中使用 form的enctype属性为编码方式࿰…...

LeetCode 707. 设计链表
LeetCode 707. 设计链表 难度:middle\color{orange}{middle}middle 题目描述 设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:valvalval 和 nextnextnext。valvalval 是当前节点的值,nextnextnext 是指向下…...

HTTP的主要作用是什么
1、客户与服务器建立连接; 2、客户向服务器提出请求; 3、服务器接受请求,并根据请求返回相应的文件作为应答; 4、客户与服务器关闭连接。 HTTP的性质: 1、HTTP是一种无状态协议,即服务器不保留与客户交…...

SpringBoot系列-- @Enable 模块驱动
Enable 模块驱动 Enable 模块驱动是以 Enable 为前缀的注解驱动编程模型。所谓 “模块” 是指具备相同领域的功能组件集合,组合所形成一个独立的单元。比如 WebMVC 模块、AspectJ 代理模块、Caching (缓存)模块、JMX (Java 管理扩…...

PHP程序员适合创业吗?
创业是一件自然而然的事,不需要人为选择。 只要你是一个努力能干主动的人,当你在一个行业深耕5年之后,就会发现人生发展的下一步就是创业。当然如果行业合适的话。 什么叫行业合适呢? 就是创业的成本并不那么高,不需…...

2023年CDGA考试-第12章-元数据(含答案)
2023年CDGA考试-第12章-元数据(含答案) 单选题 1.元数据架构的类型主要有四种下列哪项不属于分布式元数据架构的优点? A.减少了批处理 B.元数据的质量完全取决于源系统 C.最大程度的减少了实施和维护所需的工作量 D.元数据总是尽可能保持最新且有效 答案 B 2.元数据管理是…...

数据结构之顺序表篇
一、顺序表概念 二、顺序表各类接口实现 *顺序表初始化 **顺序表销毁 ***顺序表插入操作 ****顺序表删除操作 *****顺序表查找操作 ******顺序表实现打印操作 三、顺序表整体实现源码 *SeqList.h **SeqList.c ***test.c 一、顺序表概念 讲顺序表之前先引入线性表概念ÿ…...

ZBC通证月内已翻倍,Nautilus Chain 上线前夕的“开门红”
近日,Zebec Protocol生态通证ZBC迎来了大涨,据悉该通证月内最高涨幅接近了100%,为一众投资者、社区用户、Zepoch节点等带来了可观的回报,并为生态发展注入了十足的信心。我们看到,Zebec Protocol生态在近期宣布了“销毁…...

人工智能练习题:激活函数需要满足的条件、提高CNN的泛化能力、CNN输出特征图大小计算
文章目录1.激活函数需要满足的条件2.提高CNN泛化能力的方法3.CNN输出特征图大小计算第一次用ChatGPT,不得不说在处理大学生作业上,ChatGPT比国内的作业软件好用多了(感叹)。 1.激活函数需要满足的条件 通常情况下,激活…...

KingbaseES Json 系列三:Json数据操作函数一
KingbaseES Json 系列三--Json数据操作函数一(JSONB_EACH,JSONB_EACH_TEXT,JSONB_OBJECT_KEYS,JSONB_EXTRACT_PATH,JSONB_EXTRACT_PATH_TEXT,JSON_EACH,JSON_EACH_TEXT,JSON_OBJECT_KEYS,JSON_EXTRACT_PATH,JSON_EXTRACT_PATH_TEXT) JSON 数据类型是用来存储 JSON(JavaScript O…...

《设计模式》单例模式
《设计模式》单例模式 单例模式是一种常用的设计模式,其主要优点有: 提供了对唯一实例的全局访问。单例模式保证了整个系统中只有一个实例,这样就可以方便地对该实例进行访问和操作,避免了多个实例之间的冲突和不一致。避免了重…...

C/C++每日一练(20230224)
目录 1. 字符串排序 2. Excel表列名称 3. 颠倒二进制位 附录: 位移运算符 左移运算符<< 1.无符号 2.有符号 右移运算符>> 1.无符号 2.有符号 程序测试 1. 字符串排序 编写程序,输入若干个字符串。 要求: (1&#x…...

基于YOLO的酸枣病虫害检测识别实践
在我前面的博文中对于农作物病虫害的检测识别已经做过了,不过那个主要是针对水稻的,文章如下:《基于yolov5的轻量级水稻虫害目标检测项目实践》感兴趣的话可以自行移步阅读。这里主要是针对酸枣常见的几种病虫害检测检测识别,首先…...

WAF:ModSecurity on Nginx(15)
预备知识 Nginx概述 Nginx ("engine x") 是一个高性能的HTTP和 反向代理 服务器,也是一个 IMAP/POP3/SMTP服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代…...

Qt 第3课、Qt 中的字符串类
1、C 标准库 STL STL 是意义上需要与C 一同发布的标准库STL 是一套以模板技术完成的 C类库STL 中包含了常用的算法和数据结构STL 包含了字符串类 2、Qt 和 STL STL 的具体实现依赖于编译器生产厂商STL 的 “标准” 只是其接口是标准的 — 相同的全局函数 — 相同的算法类和数…...

Vulnhub靶场----6、DC-6
文章目录一、环境搭建二、渗透流程三、思路总结一、环境搭建 DC-6下载地址:https://download.vulnhub.com/dc/DC-6.zip kali:192.168.144.148 DC-6:192.168.144.154 靶机描述:选择带k01的密码后面会用到 访问192.168.144.154&…...

华为OD机试真题Python实现【去重求和】真题+解题思路+代码(20222023)
去重求和 给定一个数组,编写一个函数, 计算他的最大N个数和最小N个数的和, 需要对数组进行去重。 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 输入 第一行输入M,M表示数组大小 第二行输入M个数,表示数组内容 第三行输入N表示需要…...

lammps教程:Ovito选择特定晶粒的方法
大家好,我是小马老师。 本文介绍如何使用ovito提取特定的晶粒。 在多晶的lammps模拟中,可能会对某一个特定晶粒的变形情况进行分析,此时,需要找到这个晶粒,并进行单独分析。 ovito有专用的晶粒识别命令,…...

DevEco Studio 3.1 Beta1版本发布——新增六大关键特性,开发更高效
智能代码编辑、端云一体化开发、低代码开发个性化…… 六大新增关键特性,开发更高效,体验更觉妙! 立即点击链接下载,做DevEco Studio 3.1 Beta1版本尝鲜者! 下载链接:HUAWEI DevEco Studio和SDK下载和升级 …...

【蓝桥杯每日一题】二分算法
🍎 博客主页:🌙披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 蓝桥杯 🌙我与杀戮之中绽放,亦如黎明的花…...

Spring Batch 高级篇-并行步骤
目录 引言 概念 案例 转视频版 引言 接着上篇:Spring Batch 高级篇-多线程步骤,了解Spring Batch多线程步骤后,接下来一起学习一下Spring Batch 高级功能-并行步骤 概念 并行步骤,指的是某2个或者多个步骤同时执行。比如下…...

对spring的@Cacheable缓存理解
1 什么是缓存第一个问题,首先要搞明白什么是缓存,缓存的意义是什么。对于普通业务,如果要查询一个数据,一般直接select数据库进行查找。但是在高流量的情况下,直接查找数据库就会成为性能的瓶颈。因为数据库查找的流程…...

力扣-市场分析
大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:1158. 市场分析二、解题1.错误示范①提交SQL运行结果2.正确示范①提交SQL运行结果3.错误示范②提交SQL运行结果4.正确示范②提交SQL运行结果5.其他总结前…...

【2357. 使数组中所有元素都等于零】
来源:力扣(LeetCode) 描述: 给你一个非负整数数组 nums 。在一步操作中,你必须: 选出一个正整数 x ,x 需要小于或等于 nums 中 最小 的 非零 元素。nums 中的每个正整数都减去 x。 返回使 n…...

什么品牌的游戏蓝牙耳机比较好?玩游戏延迟低的蓝牙耳机推荐
游戏耳机的出现其实最主要的作用就是让玩家能够更专注的沉浸在游戏世界内,在声音层面去享受游戏的沉浸感,游戏最重要的就是操作灵敏,需要快速通过声音来判断敌人走向,所以小编特意整理了一期玩游戏延迟低的蓝牙耳机。 一、南卡小…...

day 33 状态压缩dp
二维状态压缩dp对于解决哈密顿回路问题的状态压缩dp只能计算固定起点到其他点的总方案数或最小路径等回路计数小蓝现在在第一栋教学楼,他想要访问每栋教学楼正好一次,最终回到第一栋教学楼(即走一条哈密尔顿回路)可看做࿱…...

扬帆优配|超3600股飘绿,人民币贬值近300点!外资净卖近38亿
今天早盘,A股整体震动调整,白马蓝筹股体现较弱,上证50、沪深300指数均跌超1%。 盘面上,国防军工、造纸、数字钱银、IT设备等板块逆势活跃,酿酒、酒店餐饮、钙钛矿电池、有色等板块跌幅居前。两市半日成交4577亿&#x…...

【编程基础之Python】6、Python基础知识
【编程基础之Python】6、Python基础知识Python基础知识Python的基本要素模块语句表达式注释Python的代码格式Python基础知识 Python 是一种高级的、动态的、解释型的编程语言,具有简单易学、开发效率高、可读性强等特点,广泛应用于数据科学、Web 开发、…...