Python:Unittest框架快速入门:用例、断言、夹具、套件、HTML报告、ddt数据驱动

快速看了套Unittest的入门教程

软件测试全套资料赠送_哔哩哔哩_bilibili软件测试全套资料赠送是快速入门unittest测试框架!全实战详细教学,仅此一套!的第1集视频,该合集共计11集,视频收藏或关注UP主,及时了解更多相关视频内容。icon-default.png?t=N7T8https://www.bilibili.com/video/BV19M4y147i6?p=1&vd_source=924f5dad6f2dcb0a3e5dca4604287ecd

整理一下学习时候整理的内容

目录

一、用例编写规则

二、模拟静态的登录数据

三、编写用例

3.1 导入unittest模块

3.2 创建测试类,该类继承unittest.TestCase

3.3 定义测试函数,函数名以test_开头,一个函数表示一个用例

3.4 编写用例

 3.5 普通的比对表达(if)

四、断言assert

4.1 断言方法

五、Fixture 夹具

5.1 测试用例的夹具

5.2 测试类的夹具

5.3 前置工作的数据传递给测试用例

5.3.1 setUp() 实例属性

5.3.2 setUpClass() 类属性

六、收集用例

6.1 TestSuite套件

6.1.1 addTest()方法

6.1.2 addTests()方法

6.2 TestLoader 加载用例

6.2.1 目录 discover

6.2.2 从测试类中加载

6.2.3 从模块名中加载

七、unittestreport - 生成HTML报告

7.1 初始化参数

八、ddt数据驱动

8.1 list_data

8.2 json_data

8.3 yaml


一、用例编写规则

  • 1、导入 unittest模块,被测文件或者其中的类
  • 2、创建一个测试类,并继承unittest.TestCase
  • 3、定义测试函数,函数名以 test_开头(表示一个测试用例)
  • 4、测试用例中:
    • 4.1 测试数据、期望结果
    • 4.2 用例步骤
    • 4.3 断言

二、模拟静态的登录数据

创建一个py文件:login_func.py

封装一个函数,用来进行账号密码登录的场景模拟

# 登录功能场景模拟
def login_check(userName=None, passWord=None):if userName is not None and passWord is not None:if userName == "张三" and passWord == '123456':return {"code": 0, "msg": "登录成功"}else:return {"code": 1, "msg": "登录失败了"}else:return {"code": 1, "msg": "所有的参数不能为空"}

然后基于账号为张三,密码为123456的情况下,去设计几个用例

三、编写用例

3.1 导入unittest模块

unittest是python自带的一个标准库,不需要进行第三方的安装,可以直接在py文件中导入

创建文件:test_开头

这里是模拟登录,调用封装的登录函数,所以命名可以以:test_login.py 进行命名

import unittest # 导入unittest库

3.2 创建测试类,该类继承unittest.TestCase

class TestLogin(unittest.TestCase):pass

3.3 定义测试函数,函数名以test_开头,一个函数表示一个用例

class TestLogin(unittest.TestCase):def test_login_success(self):  # 这个是登录成功的用例函数pass

3.4 编写用例

测试数据、期望结果、用例步骤、断言

什么是断言:我们的期望结果与实际结果的比对,而在调用函数后,得到的返回结果也就是实际结果

要调用对应的函数,就需要去把该函数进行一个导入

from login_func import login_check

在类中的方法调用函数

class TestLogin(unittest.TestCase):def test_login_success(self):  # 这个是登录成功的用例函数# 用例步骤 -- 用例数据act_result = login_check("张三", "123456")

调用函数后获取到返回值,这个返回值就是一个实际结果

 3.5 普通的比对表达(if)

在获取到实际结果以后,就去比对期望结果与实际结果

在上面的用例中,两个参数传递获取到的期望结果是登录成功的

而实际上,要返回的也应该是这个结果

class TestLogin(unittest.TestCase):def test_login_success(self):  # 这个是登录成功的用例函数# 用例步骤 -- 用例数据act_result = login_check("张三", "123456")# 断言 -- 实际结果 与 期望结果的 比对if act_result == {"code": 0, "msg": "登录成功"}:print("实际与期望相等!")else:print("实际与期望不相等!")

依次,就可以去照搬去写第二个方法的用例

    def test_login_failed_no_user(self):act_result = login_check("李四", "123456")# 断言 -- 实际结果 与 期望结果的 比对if act_result == {"code": 1, "msg": "登录失败了"}:print("实际与期望相等!")else:print("实际与期望不相等!")

(用户名错误、密码正确的情况)

四、断言assert

在上述的测试用例中,期望结果与实际结果的比对中是用if来进行

这个if与断言又有什么取别?

以上述的用例,在账号密码正确的用例中,修改if判断中比对的字典中,msg属性的值

if act_result == {"code": 0, "msg": "登录成功!!!"}:

进行测试的结果,执行的结果仍然是以用例通过为标准,但是输出的结果并不符合预期

那么,在if这个模式下,unittest并不会认为我们的用例是失败的

如果,把if转换成unittest的断言,应该如何编写

注释掉代码块中的if代码块

使用:self.assert....

在当前的用例中,需求是需要去比对:期望与返回值结果相等,所以使用断言:

self.assertEqual(self,first,second)

参数1:期望结果

参数2:实际结果

参数3:当实际与期望不相等时,自己希望得到的提示

修改代码

    def test_login_success(self):  # 这个是登录成功的用例函数# 用例步骤 -- 用例数据act_result = login_check("张三", "123456")print(act_result)# 断言 -- 实际结果 与 期望结果的 比对expected = {"code": 0, "msg": "登录成功!!!"}self.assertEqual(expected, act_result, "实际与期望不相等!!!")

测试的结果可以得到一个很明确的报错

AssertionError:断言错误

4.1 断言方法

方法

检查

说明

assertEqual(a,b)

a == b

检查变量a和b是否相等。如果不相等,测试将失败。

assertNotEqual(a,b)

a != b

检查变量a和b是否不相等。如果相等,测试将失败。

assertTrue(x)

bool(x) is True

参数可以为表达式、其他函数的调用,如果结果是true,则断言成功,false则失败

assertFalse(x)

Bool(x) is False

参数可以为表达式、其他函数的调用,如果结果是false,则断言成功,true则失败

assertIs(a,b)

a is b

is比较两个变量的内存地址是否一致,如一致,为true,断言成功,反之失败

assertIsNot(a,b)

a is not b

is比较两个变量的内存地址是否一致,如不一致,断言成功,反之一致则断言失败

assertIsNone(x)

x is None

比较变量x是否是None,如果是,则断言成功,反之失败

assertIsNotNone(x)

x is no None

比较变量x是否是None,如果不是,则断言成功,反之失败

assertIn(a,b)

a in b

比较a成员是否在b容器(字符串、列表、元组、元组、集合等)中的一员,如果是,则断言成功,反之失败

assertNotIn(a,b)

a not in b

比较a成员是否在b容器(字符串、列表、元组、元组、集合等)中的一员,如果不是,则断言成功,反之失败

assertIsInstance(a,b)

isinstance(a,b)

比较a是否是b的实例,如果属于b的实例,则断言通过

例如:变量a="hello",去判断变量a是否是str的实例,返回的结果是true,就断言成功了

assertNotIsInstance(a,b)

not isinstance(a,b)

比较a是否是b的实例,如果不属于b的实例,则断言通过

五、Fixture 夹具

  • 测试用例 级别的夹具
    • 测试用例的准备工作;setup()
    • 测试用例的清理工作:teardown()
  • 测试类 级别的夹具:
    • 测试类的准备工作:setupClass()
    • 测试类的清理工作:teardownClass()
    • 注意:在方法名上要加注解 @classmethod
  • 前置中的 数据传递 到测试用例当中去:
    • 通过设置实例属性、类属性来传递

5.1 测试用例的夹具

测试用例的准备工作;setup()

测试用例的清理工作:teardown()

在测试类中,def两个方法,一个是setup()、一个是tearDown()

    def setUp(self) -> None:print("我是准备工作....")def tearDown(self) -> None:print("我是清理工作")

此时,执行测试用例

用例是被夹子的准备工作和清除工作夹在中间,每一个用例都会被执行

setup()先执行 --> 测试用例 --> tearDown()

5.2 测试类的夹具

测试类的准备工作:setupClass()

测试类的清理工作:teardownClass()

注意:在方法名上要加注解 @classmethod

    @classmethoddef setUpClass(cls) -> None:print("class 我是准备工作....")@classmethoddef tearDownClass(cls) -> None:print("class 我是清理工作")

执行顺序:setUpClass() --> 用例1--> 用例2 --> tearDownClass()

5.3 前置工作的数据传递给测试用例

需求:在前置工作中的数据,如何作为参数传递给测试用例?

现在有一个测试类的夹具和一个测试方法夹具

    @classmethoddef setUpClass(cls) -> None:print("class 我是准备工作....")def setUp(self) -> None:print("我是准备工作....")

那么,就需要设置成实例属性、类属性

5.3.1 setUp() 实例属性

    def setUp(self) -> None:print("我是准备工作....")self.name = "张三"self.pwd = "123456"

在方法中添加两个实例

在测试用例中,通过:self.xxx的方式访问

    def test_login_success(self):  # 这个是登录成功的用例函数act_result = login_check("张三", "123456")print("从前置当中获取准备好的变量")print(self.name)print(self.pwd)

5.3.2 setUpClass() 类属性

在这个前置方法中,需要定义为类属性

    @classmethoddef setUpClass(cls) -> None:print("class 我是准备工作....")# cls.class_xxxxcls.class_name = "class_张三"

在测试用例的方法中,也直接通过self.变量名访问

        print("从class前置当中获取准备好的变量")print(self.class_name)

六、收集用例

测试用例会分布在不同的包、不同的模块(.py)中。

我们需要收集所有的测试用例,一并执行,并生成测试报告。

  • TestSuite类:测试用例集合
  • TestLoader类:测试用例收集

使用TestLoader类收集用例,加载到TestSuite类当中,最后执行TTestSuite中的用例即可

需求:把两个py文件中的测试用例,收集起来后,统一运行

代码:(把原有的py文件中,另外一个测试用例剪切到第二个py文件中)

模拟登录成功的py文件1

import unittest
from login_func import login_checkclass TestLogin(unittest.TestCase):def test_login_success(self):  # 这个是登录成功的用例函数act_result = login_check("张三", "123456")expected = {"code": 0, "msg": "登录成功"}self.assertEqual(expected, act_result, "实际与期望不相等!!!")

模拟登录失败的py文件2

import unittest
from login_func import login_checkclass TestNoLogin(unittest.TestCase):def test_login_failed_no_user(self):act_result = login_check("李四", "123456")expected = {"code": 1, "msg": "登录失败了"}self.assertEqual(expected, act_result, "实际与期望不相等!!!")

6.1 TestSuite套件

unittest.TestSuite()

添加用例到套件中的方法:

  • 方法一:addTest(测试类名("用例名"))
    • 添加一个测试用例
    • 每次只能添加一个
  • 方法二:addTests([测试类名("用例名"),测试类名("用例名")])
    • 添加一个用例的列表

第一步:独立创建一个py文件:main.py

导入:unittest

实例化TestSuite()

import unittests = unittest.TestSuite()

6.1.1 addTest()方法

实例化之后,调用addTest()方法,而参数是我们的测试用例,但是测试用例分布在其他的文件当中,所以需要对测试用例的类进行一个导入

# 导入测试用例
from test01 import TestLogin

语法格式:addTest(类名("用例名")

import unittest
# 导入测试用例
from test_login import TestLogin
from test_no_login import TestNoLogin
s = unittest.TestSuite()
s.addTest(TestLogin("test_login_success"))
s.addTest(TestNoLogin("test_login_failed_no_user"))
print(f"实例{s},类型{type(s)}")

6.1.2 addTests()方法

格式:addTests([测试类名("用例名"),测试类名("用例名")])

import unittest
# 导入测试用例
from test_login import TestLogin
from test_no_login import TestNoLogin
s = unittest.TestSuite()
s.addTests([TestLogin("test_login_success"),TestNoLogin("test_login_failed_no_user")])
print(f"实例{s},类型{type(s)}")

但是无论是addTest还是addTests,如果在用例过多的情况下,书写是非常麻烦的

所以,有了一个新的东西:TestLoader加载用例

6.2 TestLoader 加载用例

可以通过:类名、模块名、目录 三种方式去收集用例到测试套件中

  • 方法一:目录(常用)
    • unittest.TestLoader().discover(搜索目录)
      • 默认在:test*.py 中搜索用例
  • 方法二:类名
    • unittest.TestLoader().loadTestsFromTestCase(测试类名)
      • 注意:测试类名不需要加引号
  • 方法三:模块名
    • unittest.TestLoader().loadTestsFromModule(模块名)
      • 注意:模块名不需要加入引号(需要要导入模块)

6.2.1 目录 discover

在自动化的时候,用例会集中的写在某一个py包下面,所以对目录是比较具体化的

在目录下,会添加多个用例

所以通过指定的目录,去默认搜索全部的测试用例

但是在目录下面有很多个py文件,每个py文件也不一定都是测试用例

所以,需要对文件名也要有一定的过滤

默认:如果py的文件名以:test*.py开头,就会对这些文件进行搜索

Code

import unittest# 1、实例化load
load = unittest.TestLoader()
# 2、使用discover方法:搜索指定目录,用变量接收结果
s = load.discover("test01")
# 3、打印出的s很长,可以用for循环来阅读
for i in s:print(i)print("\n")

6.2.2 从测试类中加载

格式:unittest.TestLoader().loadTestsFromTestCase(测试类名)

import unittest
from test_login import TestLogin
from test_no_login import TestNoLogin
# 1、实例化load
load = unittest.TestLoader()
# 2、从测试类中加载(在文件顶部需要先导入测试类)
s1 = load.loadTestsFromTestCase(TestLogin)
s2 = load.loadTestsFromTestCase(TestNoLogin)

这个时候有两个类,然后分开导入就有了两个套件

但是需求:把两个套件合并到一个套件里面去

把s1和s2合并到addTests

# 3、实例化测试套件
s = unittest.TestSuite()
s.addTests([s1, s2])
print(s)

6.2.3 从模块名中加载

格式:unittest.TestLoader().loadTestsFromModule(模块名)

也需要先导入模块,这里就不是导入类了        

import unittest
# 导入两个模块
import test_login
import test_no_login# 1、实例化load
load = unittest.TestLoader()
# 2、从模块名当中进行导入
s1 = load.loadTestsFromModule(test_login)
s2 = load.loadTestsFromModule(test_no_login)
# 3、实例化测试套件
s = unittest.TestSuite()
s.addTests([s1, s2])  # 合并到大套件
print(s)

七、unittestreport - 生成HTML报告

使用unittestreport第三方库生成不同的HTML报告

第三方库地址:unittestreport · PyPIicon-default.png?t=N7T8https://pypi.org/project/unittestreport/

安装命令(支持py3.6+):pip install -U unittestreport

report库提供了三种不同的HTML测试报告样式

准备代码

import unittest
# 1、实例化load
load = unittest.TestLoader()
# 2、使用discover方法:搜索指定目录,用变量接收结果
s = load.discover("test01")

开始进行操作:

参考文档地址:二、HTML测试报告生成 - unittestreport 使用文档icon-default.png?t=N7T8https://unittestreport.readthedocs.io/en/latest/doc2_report/

1、导入TestRunner

from unittestreport import TestRunner

2、收集用例

# 1、实例化load
load = unittest.TestLoader()
# 2、使用discover方法:搜索指定目录,用变量接收结果
s = load.discover("test01")

3、运行用例,生成报告

# 3、运行用例,生成报告
runner = TestRunner(s)

4、执行run()方法,生成报告文件

# 4、执行run方法,生成报告
runner.run()

5、代码

import unittest
from unittestreport import TestRunner
# 1、实例化load
load = unittest.TestLoader()
# 2、使用discover方法:搜索指定目录,用变量接收结果
s = load.discover("test01")# 3、运行用例,生成报告
runner = TestRunner(s)# 4、执行run方法,生成报告
runner.run()

7.1 初始化参数

关于TestRunner初始化参数

在使用TestRunner创建测试运行程序时,可以通过以下参数来,自定义报告的相关内容

suites: 测试套件(必传)

filename: 指定报告文件名

report_dir:指定存放报告路径

title:指定测试报告的标题

templates: 可以指定1,2,3三个风格的模板

tester:测试人员名称

1、修改TestRunner()方法的参数

# 3、运行用例,生成报告
runner = TestRunner(s,filename='模拟登录测试',title="ChangFeng的测试报告",templates=2,tester='长风沛雨')

完整点的代码

import unittest
from unittestreport import TestRunner
# 1、实例化load
load = unittest.TestLoader()
# 2、使用discover方法:搜索指定目录,用变量接收结果
s = load.discover("test01")# 3、运行用例,生成报告
runner = TestRunner(s,filename='模拟登录测试',title="ChangFeng的测试报告",templates=2,tester='长风沛雨')# 4、执行run方法,生成报告
runner.run()

templates属性值的可选项为【1,2,3】对应了三种不同的样式风格

八、ddt数据驱动

ddt(data driven test) 数据驱动测试的设计思想

应用场景

        同一个流程,多组数据形成多条用例

Python第三方库:

使用 unittestreport库的ddt模块

ddt、json_data、list_data、yaml_data

注意点:测试报告中,用例的描述信息设置(title或者desc字段或者用例文档注释)

本文使用的是:unittestreport的数据驱动

8.1 list_data

举例使用:

1、创建一个文件来存储数据

创建文件:data.py

这里提供5组数据

all_case_data = [# 以字典存储,用户名、密码、期望结果{"title": "登录成功","userName": "张三","passWord": "123456","msg": {"code": 0, "msg": "登录成功"}},{"title": "密码错误","userName": "张三","passWord": "123456789","msg": {"code": 1, "msg": "登录失败了"}},{"title": "账号错误","userName": "李四","passWord": "123456","msg": {"code": 1, "msg": "登录失败了"}},{"title": "账号为空","userName": None,"passWord": "123456","msg": {"code": 1, "msg": "所有的参数不能为空"}},{"title": "密码为空","userName": "张三","passWord": None,"msg": {"code": 1, "msg": "所有的参数不能为空"}}
]

2、创建一个test_use_ddt.py文件

新建的该文件是用来运行上面的数据来跑用例

然后创建一个类,该类基础TestCase,调用login_fuc的方法

import unittestfrom login_func import login_checkclass TestLoginPython(unittest.TestCase):def test_login(self):# 导入login_check()的方法act_result = login_check("张三", "123456")expected = {"code": 0, "msg": "登录成功"}self.assertEqual(expected, act_result, "实际与期望不相等!!!")

3、引入、装饰ddt

引入

from unittestreport import ddt, list_data

在类上装饰ddt

@ddt
class TestLoginPython(unittest.TestCase):

4、定义、接收测试数据

4.1 导入数据

from data import all_case_data

4.2 在用例方法上,把数据传给注解@list_data(),并在方法内用一个参数进行接收

@ddt
class TestLoginPython(unittest.TestCase):@list_data(all_case_data)def test_login(self, case):

而参数case,是接收到的每一组字典,那么,输入的数据就不用写死,只需要用到字典中的属性即可

4.3 调用数据

@ddt
class TestLoginPython(unittest.TestCase):@list_data(all_case_data)def test_login(self, case):# 导入login_check()的方法act_result = login_check(case.get("userName"), case.get("passWord"))self.assertEqual(case.get("msg"), act_result, "实际与期望不相等!!!")

数据获取语法:字典.get("属性")

5、该文件完整代码

import unittestfrom login_func import login_check
from unittestreport import ddt, list_data
from data import all_case_data@ddt
class TestLoginPython(unittest.TestCase):@list_data(all_case_data)def test_login(self, case):# 导入login_check()的方法act_result = login_check(case.get("userName"), case.get("passWord"))self.assertEqual(case.get("msg"), act_result, "实际与期望不相等!!!")

然后可以测试运行一下

一共有5条测试用例

而在用例的测试后缀中是添加了001开始的编号

但是,在测试的结果、测试的报告中,希望可以看到每个用例的含义

这个时候,在前面data.py文件中,字典里面的title属性就有了用处

6、返回main.py文件,生成测试报告

前面已经是写过了,不需要再修改了

import unittest
from unittestreport import TestRunner
# 1、实例化load
load = unittest.TestLoader()
# 2、使用discover方法:搜索指定目录,用变量接收结果
s = load.discover("test01")# 3、运行用例,生成报告
runner = TestRunner(s,filename='模拟登录测试',title="ChangFeng的测试报告",templates=2,tester='长风沛雨')# 4、执行run方法,生成报告
runner.run()

执行一下

8.2 json_data

如果需要用json_data来进行测试,就需要修改数据的格式,在前面8.1中,使用的是python的数据格式,这个json_data则需要修改为json格式

json与python数据类型的注意事项

json的写法:

字符串是双引号的

使用 null 来表示python中的 None

使用 true 和 false 表示布尔值

1、新建data.json文件

键入json类型的数据

[{"title": "登录成功","userName": "张三","passWord": "123456","msg": {"code": 0, "msg": "登录成功"}},{"title": "密码错误","userName": "张三","passWord": "123456789","msg": {"code": 1, "msg": "登录失败了"}},{"title": "账号错误","userName": "李四","passWord": "123456","msg": {"code": 1, "msg": "登录失败了"}},{"title": "账号为空","userName": null,"passWord": "123456","msg": {"code": 1, "msg": "所有的参数不能为空"}},{"title": "密码为空","userName": "张三","passWord": null,"msg": {"code": 1, "msg": "所有的参数不能为空"}}
]

2、读取json数据

2.1 同样需要引入json.data

2.2 同样需要在用例上注解@json

2.3 注解方法传入的参数是json的相对路径或者绝对路径

import unittest
from login_func import login_check
from unittestreport import ddt, json_data@ddt
class TestLoginPython(unittest.TestCase):@json_data(r"C:\Users\13195\Desktop\3ban_py\unittest\test01\data.json")def test_login(self, case):# 导入login_check()的方法act_result = login_check(case.get("userName"), case.get("passWord"))self.assertEqual(case.get("msg"), act_result, "实际与期望不相等!!!")

8.3 yaml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/190171.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab GUI界面实现ZieglerNicholas调节PID参数

1、内容简介 略 11-可以交流、咨询、答疑 ZieglerNicholas、PID、GUI 2、内容说明 GUI界面实现ZieglerNicholas调节PID参数 通过ZieglerNicholas调节PID参数,设计了GUI 3、仿真分析 略 4、参考论文 略 链接:https://pan.baidu.com/s/1yQ1yDfk-_…

单片机定时器讲解和实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、计数器是什么?二、单片机定时器结构2.1***两个8位如何合成16位,16位如何分成两个8位***2.2 计数器的位数组合?2.3 定时功…

常用网络命令ping、arp、tracert、route的详细用法,弄懂立马成大神

你们好,我的网工朋友。 做网工,你遇到最多的问题是啥?大部分人的回答都是网络故障吧。 所以有很多朋友多次问到,如何检测网络故障和对网络进行基础的操作。比如:网络经常掉线、网络时好时坏,ip地址冲突、…

通过Malloc 和 Free 的具体实现 加深对C指针 的理解(笔记)

【彻底搞懂C指针】Malloc 和 Free 的具体实现 https://danluu.com/malloc-tutorial/ 进程间的通信 : ①共享内存 ② 消息传递 (内核实现) 分配策略 (实现方面) by DUCK sbrk() malocal实现的主要函数 man sbrk 查看 数据结构 一个参考代码 https…

pytorch基础语法问题

这里写目录标题 pytorch基础语法问题shapetorch.ones_like函数和torch.zeros_like函数y.backward(torch.ones_like(x), retain_graphTrue)torch.autograd.backward参数grad_tensors: z.backward(torch.ones_like(x))来个复杂例子z.backward(torch.Tensor([[1., 0]])更复杂例子实…

1.0.0 IGP高级特性简要介绍(OSPF-下篇)

二、OSPF_精细的路由控制 1.OSPF数据库上限 简介 ​ OSPF技术要求同一个区域内的路由器保存着相同的LSDB信息。 ​ 但随着网络上路由数量不断增加,一些路由器由于系统资源有限,不能再承载如此多的路由信息,这种状态就被称为数据库超限&am…

STM32GPIO——上拉、下拉电阻

如上两个图所示,标号2都为上拉、下拉电阻部分,阻值约为30k~50k欧,通过对应开关进行控制,开关由寄存器控制。 当引脚外部的器件没有干扰引脚的电压时,即没有外部的上、下拉电压,引脚的电平由引脚内部上、下…

【机器学习】八、规则学习

知识图谱与基本概念 基本概念 规则学习定义:从训练数据中学习出一组能用于对未见示例进行判别的规则。 规则定义:规则一般是:语义明确、能描述数据分布所隐含的客观规律或领域概念。 逻辑规则定义:⊕←?1⋀?2⋀?3…⋀??⊕…

下载并安装DevEco Studio 3.1,初尝鸿蒙编程

摘自华为官网 DevEco Studio 3.1配套支持HarmonyOS 3.1版本及以上的应用及服务开发,提供了代码智能编辑、低代码开发、双向预览等功能,以及轻量构建工具DevEco Hvigor 、本地模拟器,持续提升应用及服务开发效率。 下载 官网下载地址 HUAWEI…

理解快速排序

理解快速排序 首先了解以下快速排序 快速排序(QuickSort)是一种常用的排序算法,属于比较排序算法的一种。它是由英国计算机科学家Tony Hoare于1960年提出的,是一种分而治之(divide and conquer)的算法。 …

模拟ASP.NET Core MVC设计与实现

前几天有人在我的《ASP.NET Core框架揭秘》读者群跟我留言说:“我最近在看ASP.NET Core MVC的源代码,发现整个系统太复杂,涉及的东西太多,完全找不到方向,你能不能按照《200行代码,7个对象——让你了解ASP.…

css实现进度条

预期样式 方法一 <script setup> import { ref } from "vue"; // import ScreenLeft from "./ScreenLeft/index.vue"; const width ref("76.5%"); </script><template>Screen<div class"progress-contain">…

详解数据仓库之拉链表(原理、设计以及在Hive中的实现)

最近发现一本好书&#xff0c;读完感觉讲的非常好&#xff0c;首先安利给大家&#xff0c;国内第一本系统讲解数据血缘的书&#xff01;点赞&#xff01;近几天也会安排朋友圈点赞赠书活动(ง•̀_•́)ง 0x00 前言 本文将会谈一谈在数据仓库中拉链表相关的内容&#xff0c;包…

ZYNQ_project:key_beep

通过按键控制蜂鸣器工作。 模块框图&#xff1a; 时序图&#xff1a; 代码&#xff1a; /*1位按键消抖 */ module key_filter (input wire sys_clk ,input wire sys_rst_n ,input wire key_in ,output …

springboot项目使用Swagger3

一、Swagger介绍 号称世界上最流行的Api框架&#xff1b;Restful Api 文档在线自动生成工具>Api文档与API定义同步更新直接运行&#xff0c;可以在在线测试API 接口支持多种语言&#xff1a;&#xff08;java&#xff0c;Php…&#xff09; 二、Swagger3 准备工作 1、在p…

VsCode 安装 GitHub Copilot插件 (最新)

##在线安装&#xff1a; 打开Vscode扩展商店&#xff0c;输入 "GitHub Copilot " ,选择下载人数最多的那个。&#xff08;这个是你写一部分代码或者注释&#xff0c;Ai自动帮你提示/补全代码&#xff09;,建议选择这个 注意下面有个和他类似的 "GitHub Copilo…

BMVC 23丨多模态CLIP:用于3D场景问答任务的对比视觉语言预训练

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/abs/2306.02329 摘要&#xff1a; 训练模型将常识性语言知识和视觉概念从 2D 图像应用到 3D 场景理解是研究人员最近才开始探索的一个有前景的方向。然而&#xff0c…

APS、SAP解析BOM批量核对(我的APS项目三)

APS提供了解析BOM接口 SAP从CU50中解析了BOM 博主开发了一个程序&#xff0c;把两边的BOM数据拉到一起来比对&#xff0c;从最初的一个车型&#xff0c;增加到5个车型&#xff0c;最后成型是30个车型&#xff0c;几乎覆盖了F1、F2的全部车型。 并且程序还实现了消息提醒功能&…

Kotlin(十) 空指针检查、字符串内嵌表达式以及函数默认值

空指针检查 我们在之前的章节里&#xff0c;有定义一个Study的类&#xff0c;它有两个函数&#xff0c;一个doHomework(),一个readBooks()。然后我们定义个doStudy函数&#xff0c;来调用它们&#xff0c;代码如下&#xff1a; fun doStudy(study: Study) {study.doHomework(…

直播间自动发言机器人的运行分享,与开发需要到的技术分析

先来看实操成果&#xff0c;↑↑需要的同学可看我名字↖↖↖↖↖&#xff0c;或评论888无偿分享 一、引言 随着人工智能技术的不断发展&#xff0c;自动发言机器人已经成为了当今社交媒体领域的重要组成部分。它们能够自动化地发布内容、回复用户评论和消息&#xff0c;大大提高…