软件测试之单元测试自动化入门基础
单元测试自动化
所谓的单元测试(Unit Test)是根据特定的输入数据,针对程序代码中的最小实体单元的输入输出的正确性进行验证测试的过程。所谓的最小实体单元就是组织项目代码的最基本代码结构:函数,类,模块等。在Python中比较知名的单元测试模块:
-
unittest
-
pytest
-
doctest
-
nose
测试用例
所谓的测试用例(Test Case),就是执行测试的依据和记录,把测试应用程序的操作步骤用文档的形式描述出来的一份文档。文档的格式可以是Excel、markdown、html、xmind网页。
一份合格的测试用例有利于测试人员理清测试思路,确保需要测试的功能周全没有遗漏,方便测试工作的开展和评估测试工作量,同时还可以便于测试人员记录测试数据和测试工作进度,为后续的回归测试提供样本参考,提升测试效率以及后续测试工作的交接。
那么一份合格的测试用例长什么样子或有什么内容呢?
一份合格的测试用例,应该包含测试时间、测试人员、测试模块名、功能点名称、用例ID、用例说明(测试目的)、前置条件、输入数据、预期结果、测试结果(输出结果、实际结果)等。注意:加粗内容为必备的测试用例八要素。
参考文档:
在实际工作中,因为缺陷报告与测试用例作用相似,因此有时候会合并一起或只选择其中一种。
设计方法
那么在工作中,我们一般都应该编写测试用例或者应该怎么设计测试用例来完成我们的测试工作呢?实际上在工作中,测试人员都是基于测试用例的7种基本设计方法来设计与编写测试用例的:
-
等价类划分法:根据输入数据的有效性与无效性设计测试用例。
-
边界值分析法:对等价类划分法的一个补充,从等价类的边缘值(临界点)去寻找错误,基于这些错误来设计测试用例。
-
判定表法:把输入数据的各种可能情况进行组合罗列成一个判断表,以判断表来设计测试用例。
-
因果图法:用图解的方式表示输入数据的各种组合关系,以此写出判定表,从而设计相应的测试用例。
-
正交表法:基于正交表来设计测试用例。
-
场景法:基于流程图展示业务流程或功能的调用流程,对流程图的走向路径设计测试用例。
-
错误推测法:基于经验和直觉,找出程序中认为可能出现的错误来设计测试用例。
一般在工作中,我们比较常用的是等价类划分法与判定表法。
等价类划分法
等价类划分法就是按照测试要求,把具有共同特征的测试数据划分为2类:有效等价类和无效等价类,把测试数据进行分类以后设计测试用例。
-
有效等价类,就是符合程序使用要求或调用代码要求的,能正确使用程序或调用代码的一类数据。
-
无效等价类,就是不符合程序使用要求或调用代码要求的,会导致程序出现异常或结果不正确的一类数据。
使用等价类划分法,可以让我们设计的测试工作更加科学有依据,避免出现穷举测试的情况,减少测试用例的数量。
例如,注册功能中用户名的测试用例,如果功能需求中,要求用户名必须长度为3-11个长度的字符。
系统模块 | 功能点 | 用例ID | 测试目的 | 前置条件 | 输入 | 预期 | 结果 |
---|---|---|---|---|---|---|---|
会员模块 | 用户注册 | 01 | 验证用户名 | 打开用户注册页面 | "abc" | 正确 | |
会员模块 | 用户注册 | 02 | 验证用户名 | 打开用户注册页面 | "abdefgthssaaaaa" | 错误 |
判定表法
判定表是分析和表达多逻辑条件下执行不同操作的情况的工具。而软件测试中的判定表法,就是把输入数据的各种可能情况进行组合罗列成一个判断表格,以判断表来设计测试用例。
判定表的表结构一般有如下2种:横向判断表与纵向判定表。
横向判断表:
条件桩 | 条件项 |
---|---|
动作桩 | 动作项 |
纵向判定表:
条件桩 | 动作桩 |
---|---|
条件项 | 动作项 |
例子,测试一个功能是否能修改文件。
如果使用纵向判定表: | |||
---|---|---|---|
条件1:是否有权限 | 条件2:是否存在 | 结果1:可以修改 | 结果2:不能修改 |
√ | √ | √ | ✖ |
√ | ✖ | ✖ | √ |
✖ | √ | ✖ | √ |
✖ | ✖ | ✖ | √ |
如果使用横向判断表: | ||||
---|---|---|---|---|
条件桩:是否有权限 | ✔ | ✔ | ✖ | ✖ |
条件桩:是否存在 | ✔ | ✖ | ✔ | ✖ |
动作桩:可以修改 | ✔ | ✖ | ✖ | ✖ |
动作桩:不能修改 | ✖ | ✔ | ✔ | ✔ |
单元测试框架-Unittest
Unittest是Python开发中常用于单元测试的内置框架,免安装使用简单方便,其设计的灵感来源于Java的单元测试框架-Junit。
Unittest具备完整的测试结构,支持自动化测试的执行,对测试用例进行组织,并且提供了丰富的断言方法,还提供生成测试报告。
官方文档:unittest --- 单元测试框架 — Python 3.11.5 文档
import unittest print(dir(unittest))
上面的代码中,我们就引入了Unittest模块, 同时可以通过打印发现Unittest框架中内置了大量的工具成员。这些工具成员中除了以下5个以外,其他的都不怎么常用。
-
TestCase(测试用例)
是unittest中最重要的一个类,用于编写测试用例类,是所有测试用例类的父类,实现了测试用例的基本代码。
-
TestSuite(测试套件、测试集)
可以把多个TestCase组织、打包集成到一个测试集中一起执行,TestSuite可以实现多个测试用例的执行。
-
TextTestRunner(测试运行器)
TestSuite本身不具备执行的功能,所以使用TextTestRunner执行测试套件和输出测试结果。
-
TestLoader(测试加载器)
用于加载测试用例TestCase,并生成测试套件TestSuite,实现自动从代码中加载大量测试用例到测试套件中。
-
TestFixture(测试脚手架)
所谓的测试脚手架就是为了开展一项或多项测试所需要进行的准备工作,以及所有相关的清理操作。测试脚手架实际上会在执行一些测试代码之前与之后,让我们编写一些初始化和销毁的代码。
快速入门
测试用例-TestCase
前面讲到TestCase就是提供给我们编写测试用例的测试代码的,那么怎么编写一个测试用例?需要4个步骤即可。
-
导入unittest模块
import unittest
2.定义测试用例类
import unittest
class 测试用例类名(unittest.TestCase): # 所有的测试用例类都必须直接或者间接继承unittest.TestCase."""测试用例"""pass
3.定义测试用例方法(此处的测试用例方法,就是上面所说的测试用例设计方法中的一行信息的测试代码)
import unittest
class 测试用例类名(unittest.TestCase):"""测试用例"""# ....def test_测试方法名(参数): # 测试方法必须以test开头或test_开头pass# ....
4.执行测试用例
unittest.main()
在实际工作中,我们肯定是在项目中进行测试代码的编写或单独编写一个测试项目,但是我们现在刚开始学习,所以我们可以先编写一个例子代码,对其进行测试,以达到学习的目的。
unittest_01_测试用例的编写.py,代码:
import unittest# 被测试的代码单元
def add(x,y):return x+yclass FuncTest(unittest.TestCase):"""测试用例"""def test_01(self):print(add(10, 20))def test_02(self):print(add("hello", "world"))# def test_03(self):# print(add("hello", 20))# 因为pycharm本身内置了执行unittest的功能,所以不适用以下代码也能执行,但是终端下或者使用其他的代码编辑器时,则需要加上。
if __name__ == '__main__':unittest.main()
运行结果:
测试套件-TestSuite
前面我们将到测试套件,主要用于把多个测试用例类打包集成到一个测试集中一起执行。工作中,一个项目往往需要编写非常多的测试用例,而那么多的测试用例也不可能只编写在一个文件中,此时就需要使用测试套件了。2个步骤:
-
通过unittest.TestSuite实例化测试套件对象
suite = unittest.TestSuite()
-
通过addTest方法添加测试用例
-
添加测试用例方法
# 添加测试用例方法 suite.addtest(测试用例类名("测试用例方法名")) # 批量添加测试用例方法 test_data = (测试用例类名("测试用例方法名1"), 测试用例类名("测试用例方法名2")) suite.addtests(test_data)
-
添加测试用例类(一次性添加测试用例的所有test_方法)
# 添加测试用例类 suite.addtest(unittest.makeSuite(测试用例类名)) # 批量添加测试用例类 test_data = (unittest.makeSuite(测试用例类名1), unittest.makeSuite(测试用例类名2)) suite.addTests(test_data)
-
unittest_02_测试套件的基本使用.py,代码:
import unittest
import unittest_01_测试用例的编写 as unittest_01
suite = unittest.TestSuite()
# # 添加测试用例方法
# suite.addTest(unittest_01.FuncTest("test_01"))
# suite.addTest(unittest_01.FuncTest("test_02"))
# # 批量添加测试用例方法
# test_data = (unittest_01.FuncTest("test_01"), unittest_01.FuncTest("test_02"))
# suite.addTests(test_data)
# # 添加测试用例类
# suite.addTest(unittest.makeSuite(unittest_01.FuncTest))
# 批量添加测试用例类
test_data = (unittest.makeSuite(unittest_01.FuncTest), unittest.makeSuite(unittest_01.FuncTest))
suite.addTests(test_data)
TestSuite的作用仅仅是把多个测试用例打包集成到一块,但是并没有提供批量执行测试用例的方法,所以我们需要使用TextTestRunner了。
测试运行器-TextTestRunner
前面说过,TextTestRunner是用于执行测试用例、测试套件和输出测试结果的。2个步骤:
-
实例化运行器对象
-
通过run方法执行测试
unittest_03_测试运行器基本使用.py,代码:
import unittestimport unittest_01_测试用例的编写 as unittest_01suite = unittest.TestSuite()# # 添加测试用例方法
# suite.addTest(unittest_01.FuncTest("test_01"))
# suite.addTest(unittest_01.FuncTest("test_02"))# # 批量添加测试用例方法
# test_data = (unittest_01.FuncTest("test_01"), unittest_01.FuncTest("test_02"))
# suite.addTests(test_data)# # 添加测试用例类
# suite.addTest(unittest.makeSuite(unittest_01.FuncTest))# 批量添加测试用例类
test_data = (unittest.makeSuite(unittest_01.FuncTest), unittest.makeSuite(unittest_01.FuncTest))
suite.addTests(test_data)if __name__ == '__main__':runner = unittest.TextTestRunner()runner.run(suite)
运行结果:
测试加载器-TestLoader
前面说过,用于加载测试用例TestCase,并生成测试套件TestSuite,实现自动从代码中加载大量测试用例到测试套件中。2个步骤:
-
实例化unittest.TestLoader对象
loader = unittest.TestLoader()
-
使用discover方法自动搜索指定目录下指定文件格式的python模块,并把查找到的测试用例组装打包集成到测试组件作为返回值。
loader.discover(目录路径, pattern="文件名格式")
注意:pattern支持
*
号表示0到多个字符。
unittest_04_测试加载器基本使用.py,代码:
import unittest
loader = unittest.TestLoader()
# 在当前目录下,搜索以unittest开头作为文件名的所有python文件,并把文件中的测试用例类打包集成到测试套件中
suite =loader.discover("./", pattern="unittest*.py")if __name__ == '__main__':runner = unittest.TextTestRunner()runner.run(suite)
运行结果:
测试脚手架-TestFixture
前面提到,测试脚手架会在执行一些测试代码之前与之后,让我们编写一些初始化和销毁的代码,主要分三个级别:
-
方法级别:在方法执行前与执行后都提供自动调用的实例方法
setUp和tearDown
-
类级别:在类执行前与执行后都提供自动调用的类方法,不管类中有多少方法,只执行一次。
setUpClass和tearDownClass
-
模块级别:在模块执行前与执行后都提供自动调用的函数,不管模块中有多少类或方法,只执行一次。
setUpModule和tearDownModule
方法级别的脚手架
在测试用例类中提供了2个固定名字的实例方法(setUp与tearDown),用于完成方法执行前与执行后的操作。
unittest_05测试脚手架方法级别的脚手架.py,代码:
import unittest# 被测试的代码单元
def add(x,y):return x+yclass AddTest(unittest.TestCase):"""测试用例"""def setUp(self):print("每个方法执行前都会执行一遍setUp实例方法,用于完成通用的前置操作或初始化工作")def tearDown(self):print("每个方法执行后都会执行一遍tearDown实例方法,用于完成通用的后置操作或销毁工作")def test_01(self):print(add(10, 20))def test_03(self):print(add("hello", 20))# 因为pycharm本身内置了执行unittest的功能,所以不适用以下代码也能执行,但是终端下或者使用其他的代码编辑器时,则需要加上。
if __name__ == '__main__':unittest.main()
运行尝试:
类级别的脚手架
在测试用例类中提供了2个固定名字的类方法(setUpClass与tearDownClass),用于完成类执行前与执行后的操作。
unittest_06测试脚手架类级别的脚手架.py,代码:
import unittest# 被测试的代码单元
def add(x,y):return x+yclass AddTest(unittest.TestCase):"""测试用例"""@classmethoddef setUpClass(cls):print("当前类执行前都会执行一遍setUpClass类方法,用于完成通用的前置操作或初始化工作")@classmethoddef tearDownClass(cls):print("当前类执行后都会执行一遍tearDownClass类方法,用于完成通用的后置操作或销毁工作")def test_01(self):print(add(10, 20))def test_03(self):print(add("hello", 20))# 因为pycharm本身内置了执行unittest的功能,所以不适用以下代码也能执行,但是终端下或者使用其他的代码编辑器时,则需要加上。
if __name__ == '__main__':unittest.main()
模块级别的脚手架
在测试用例类中提供了2个固定名字的函数(setUpModule与tearDownModule),用于完成类执行前与执行后的操作。
unittest_07测试脚手架模块级别的脚手架.py,代码:
import unittestdef setUpModule():print("当前模块执行前都会执行一遍setUpModule函数,用于完成通用的前置操作或初始化工作")def tearDownModule():print("当前模块执行前都会执行一遍tearDownModule函数,用于完成通用的前置操作或初始化工作")# 被测试的代码单元
def add(x, y):return x + yclass AddTest1(unittest.TestCase):"""测试用例"""@classmethoddef setUpClass(cls):print("当前类执行前都会执行一遍setUpClass类方法,用于完成通用的前置操作或初始化工作")@classmethoddef tearDownClass(cls):print("当前类执行后都会执行一遍tearDownClass类方法,用于完成通用的后置操作或销毁工作")def test_01(self):print(add(10, 20))class AddTest2(unittest.TestCase):"""测试用例"""@classmethoddef setUpClass(cls):print("当前类执行前都会执行一遍setUp方法,用于完成通用的前置操作或初始化工作")@classmethoddef tearDownClass(cls):print("当前类执行后都会执行一遍tearDown方法,用于完成通用的后置操作或销毁工作")def test_03(self):print(add("hello", 20))# 因为pycharm本身内置了执行unittest的功能,所以不适用以下代码也能执行,但是终端下或者使用其他的代码编辑器时,则需要加上。
if __name__ == '__main__':unittest.main()
生成HTML格式测试报告(很少使用,基本不使用)
使用HTMLTestRunner模块可以直接生成HTML格式的报告。HTMLTestRunner是一个不再维护的第三方的模块,通过pip工具安装不了,只能下载后手动导入。
HTMLTestRunner官网:HTMLTestRunner - tungwaiyip's software
HTMLTestRunner下载:http://tungwaiyip.info/software/HTMLTestRunner_0_8_2/HTMLTestRunner.py
(我就先跳过)
断言
断言(assertion)是一种在程序中的判断测试用例执行结果是否符合预期结果的方式,所以断言也被称之为“期望”。当程序执行到断言的位置时,对应的断言应该为真。若断言不为真时,程序会中止执行,并给出错误信息。
unittest中常用的断言方法(加粗为重要方法):
断言方法 | 断言描述 |
---|---|
assertEqual(arg1, arg2, msg=None) | 验证arg1=arg2,不等则fail |
assertNotEqual(arg1, arg2, msg=None) | 验证arg1 != arg2, 相等则fail |
assertTrue(expr, msg=None) | 验证expr是true,如果为false,则fail |
assertFalse(expr,msg=None) | 验证expr是false,如果为true,则fail |
assertIs(arg1, arg2, msg=None) | 验证arg1、arg2是同一个对象,不是则fail |
assertIsNot(arg1, arg2, msg=None) | 验证arg1、arg2不是同一个对象,是则fail |
assertIsNone(expr, msg=None) | 验证expr是None,不是则fail |
assertIsNotNone(expr, msg=None) | 验证expr不是None,是则fail |
assertIn(arg1, arg2, msg=None) | 验证arg1是arg2的子串,不是则fail |
assertNotIn(arg1, arg2, msg=None) | 验证arg1不是arg2的子串,是则fail |
assertIsInstance(obj, cls, msg=None) | 验证obj是cls的实例,不是则fail |
assertNotIsInstance(obj, cls, msg=None) | 验证obj不是cls的实例,是则fail |
unittest_09_断言.py,代码:
import unittestdef add(x ,y):return x + yclass AddTest(unittest.TestCase):def test_01(self):res = add(1,2)# 断言结果是否与预期内容相同# self.assertEqual(res, 3, msg="断言失败!一般会错误的结果与原因")# self.assertEqual(res, 2, msg="断言失败!一般会错误的结果与原因")self.assertIn(res, [1, 2], msg="断言失败!一般会错误的结果与原因")if __name__ == '__main__':unittest.main()
跳过
针对开发中有时候针对不同环境或者不同的时间段,不同的代码版本,有时候部分测试用例不希望被执行,则可以使用跳过。
@unittest.skipIf(判断条件表达式, 跳过原因)
unittest_10_跳过.py,代码:
import unittestdef add(x, y):return x + yversion = (2, 7, 0)class AddTest(unittest.TestCase):def setUp(self):print("setUP执行....")@unittest.skipIf(version <= (3, 5, 0), "版本低于3.5,所以不测试test_01")def test_01(self):res = add(1, 2)self.assertIn(res, [1, 3], msg="断言失败!一般会错误的结果与原因")def test_02(self):res = add("a", "B")self.assertEqual(res, "aB", msg="断言失败!一般会错误的结果与原因")if __name__ == '__main__':unittest.main()
参数化
当需要使用多组不同的测试数据测试同一个方法时,可以使用unittest参数化来解决。常用的参数化方法有ddt、paramunittes
pip install parameterized
unittest_11_参数化.py,代码:
import unittest
from parameterized import parameterizeddef add(x, y):return x + yversion = (2, 7, 0)class AddTest(unittest.TestCase):def setUp(self):print("setUP执行....")@parameterized.expand([(10,20), ("a","B"), (50, 20)])def test_00(self, x, y):res = add(x, y)self.assertIn(res, [1, 30, "aB", 70], msg="断言失败!一般会错误的结果与原因")# def test_01(self):# res = add(1, 2)# self.assertIn(res, [1, 3], msg="断言失败!一般会错误的结果与原因")## def test_02(self):# res = add("a", "B")# self.assertEqual(res, "aB", msg="断言失败!一般会错误的结果与原因")## def test_03(self):# print(add("a", 20))if __name__ == '__main__':unittest.main()
数据驱动测试
Data-Driven Tests(DDT)即数据驱动测试,可以实现多个数据对同一个方法进行测试,达到数据和测试代码分离,目的是为了减少测试用例的数量。
基本安装
pip install ddt
直接传递单个数据
unittest_12参数化基于ddt直接传递数据.py,代码:
import unittest
from ddt import ddt, datadef add(a,b):return a+b@ddt
class AddTest(unittest.TestCase):# # 单次传递一个数据到测试用例方法中# @data(100)# @data([1,2,3,4])# @data({"a":1,"b":2})# @data((1,2,3))# # 多次传递一个数据到测试用例方法中# @data(*["a","b","c"]) # 字符串# @data(*[{"a":1}, {"a":2}, {"a":3}]) # 字典# @data(*[[1, 1, 1], [1, 1, 2], [1, 1, 3]])@data([1, 1, 1], [1, 1, 2], [1, 1, 3])def test_01(self, a):print(a)if __name__ == '__main__':unittest.main()
unittest_13_参数化-基于ddt解包传递多个数据.py,使用unpack装饰器解包数据
import unittest
from ddt import ddt, data, unpackdef add(a, b, c):return a + b + c@ddt
class AddTest(unittest.TestCase):@data((1,2,3),(1,2,1),(1,3,1),(1,1,3))@unpackdef test_01(self,a,b,c):add(a,b,c)if __name__ == '__main__':unittest.main()
最后:
我感觉还是测试岗位相对机会多一点,对于我这种普通人,开发的话大家需要认真考量自己的实力,希望大家也能在秋招之际找到一个好工作!
相关文章:
软件测试之单元测试自动化入门基础
单元测试自动化 所谓的单元测试(Unit Test)是根据特定的输入数据,针对程序代码中的最小实体单元的输入输出的正确性进行验证测试的过程。所谓的最小实体单元就是组织项目代码的最基本代码结构:函数,类,模块等。在Python中比较知名…...
93 # 实现 express 错误处理中间件
上一节实现了 express 的中间件,这一节来实现错误处理中间件 执行某一步出错了,统一规定调用 next 传递的参数就是错误信息 先看 express 实现的demo const express require("express"); const app express();app.use("/", (re…...
PHP 创建 MySQL 表
目录 PHP 创建 MySQL 表 使用 MySQLi 和 PDO 创建 MySQL 表 实例 (MySQLi - 面向对象) 实例 (MySQLi - 面向过程) 实例 (PDO) PHP 创建 MySQL 表 一个数据表有一个唯一名称,并有行和列组成。 使用 MySQLi 和 PDO 创建 MySQL 表 CREATE TABLE 语句用于创建 MySQ…...
中兴R5300 G4服务器iSAC管理员zteroot密码遗失的重置方法及IPV6地址启用设置
本文讲解中兴R5300 G4服务器BMC带外iSAC管理员zteroot密码遗失,无法登录时如何对其进行密码重置,以及iSAC启用IPV6地址的方法。 一、重置中兴R5300 G4服务器iSAC管理员zteroot密码 1、通过SSH登录到iSAC,默认用户名:sysadmin&am…...
大数据分布式处理框架Hadoop
大数据是什么 大数据容量常以TB、PB、甚至EB为单位,远超传统数据库的承载能力,无论入库还是查询都出现性能瓶颈。 Hadoop是什么 Hadoop是开源的分布式计算技术框架,用于处理大规模数据和实现分布式存储。 Hadoop核心组件 HDFS(…...
echarts学习总结
一、新建一个简单的Echarts 1、首先新建一个vue2的项目,项目中安装Echarts cnpm install echarts --save2、新建一个ref <template><div ref"myecharts" id"myecharts"></div> </template> 3、引入echarts <scri…...
与初至波相关的常见误解
摘要: 初至波是指检波器首次接收到的波. 对它的误解会使我们失去重要的信息. 1. 波从震源到检波器的传导过程 从震源产生波以后, 有些波通过地面直接传导到检波器, 这些称为直达波 (面波);有些在地层中传播,遇到两种地层的分界面时 产生波的反射,在原来地层中形成一种新波, …...
screenfull全屏、退出全屏、指定元素全屏的使用步骤
文章目录 页面全屏页面全屏完整代码 1.下载插件 建议下载指定版本5.1.0,不然可能有一个报错 npm install --save screenfull5.1.02.页面引入 import screenfull from "screenfull"页面全屏 3.在标签上绑定点击事件 <div click"handleFull"…...
问题 - 谷歌浏览器 network 看不到接口请求解决方案
谷歌浏览器 -> 设置 -> 重置设置 -> 将设置还原为其默认值 查看接口情况,选择 All 或 Fetch/XHR,勾选 Has blocked cookies 即可 如果万一还不行,卸载浏览器重装。 参考:https://www.cnblogs.com/tully/p/16479528.html...
Java:正则表达式的命名捕获组
命名捕获组格式 (?<year>.*)-(?<month>.*)-(?<date>.*)完整示例 package com.example.demo;import java.util.regex.Matcher; import java.util.regex.Pattern;public class RegexTests {public static void main(String[] args) {String text "2…...
ELK 处理 Spring Boot 日志
ELK 处理 Spring Boot 日志,妙啊! 来源:ibm.com/developerworks/cn/java /build-elk-and-use-it-for-springboot -and-nginx/index.html ELK 简介 Logstash Elasticsearch Kibana ELK 实现方案 ELK 平台搭建 安装 Logstash 安装 Elas…...
No152.精选前端面试题,享受每天的挑战和学习
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…...
Flutter:类功能索引(全)
Flutter 类功能索引(全) 本文以表描述形式收录了Flutter中提供的各个类,旨在方便地进行查询相关组件。 本文地址:https://blog.csdn.net/qq_28550263/article/details/133415589 跳转:字母索引 A 组件名称描述Animat…...
电脑技巧:笔记本电脑升级固态硬盘的注意事项,看完你就懂了
目录 1、接口类型 2、接口速率 3、固态硬盘的尺寸 4、发热情况 5、总结 如今的固态硬盘价格越来越便宜了,甚至某品牌4TB的PCIe4.0 M.2还爆出过不到900元的“报恩价”,让不少小伙伴都动了扩容甚至囤货的心思。但对于笔记本电脑用户来说,升…...
TLS/SSL(一)科普之加密、签名和SSL握手
一 背景知识 感悟: 不能高不成低不就备注: 以下内容没有逻辑排版,仅做记录 https基础面经 ① 加密方式 说明: 单向和双向认证遗留: 如何用openssl从私钥中提取公钥? ② 互联网数据安全可靠条件 说明: 二者相…...
UVA-1374 旋转游戏 题解答案代码 算法竞赛入门经典第二版
GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 由于书上给了思路,所以做起来并不难。 即使超时,因为数据量不大(1000个), 我们也可以直接打表直接返回结果。 但是如果想不打表完…...
logback.xml springboot 项目通用logback配置,粘贴即用,按日期生成
<configuration scan"false" scanPeriod"10 seconds"><!-- 定义日志存放的根目录 --><property name"log.dir" value"./logs" /><!-- 彩色日志依赖的渲染类 --><conversionRule conversionWord"clr&q…...
【AI视野·今日CV 计算机视觉论文速览 第256期】Thu, 28 Sep 2023
AI视野今日CS.CV 计算机视觉论文速览 Thu, 28 Sep 2023 Totally 96 papers 👉上期速览✈更多精彩请移步主页 Daily Computer Vision Papers SHACIRA: Scalable HAsh-grid Compression for Implicit Neural Representations Authors Sharath Girish, Abhinav Shriva…...
2023-9-28 JZ26 树的子结构
题目链接:树的子结构 import java.util.*; /** public class TreeNode {int val 0;TreeNode left null;TreeNode right null;public TreeNode(int val) {this.val val;}} */ public class Solution {public boolean HasSubtree(TreeNode root1,TreeNode root2) …...
ElementUI之首页导航+左侧菜单
文章目录 一、Mock.js1.1.什么是Mock.js1.2.安装与配置1.3使用 二、登录注册跳转2.1.在views中添加Register.vue2.2.在Login.vue中的methods中添加gotoRegister方法2.3.在router/index.js中注册路由 三、组件通信(总线)3.1 在main.js中添加内容3.2.在com…...
【Linux学习】04Linux实用操作
Linux(B站黑马)学习笔记 01Linux初识与安装 02Linux基础命令 03Linux用户和权限 04Linux实用操作 05-1Linux上安装部署各类软件 文章目录 Linux(B站黑马)学习笔记前言04Linux实用操作各类小技巧(快捷键)ct…...
一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项
目录 1、求字符串长度函数 1.1、strlen 2、字符串拷贝(cpy)、拼接(cat)、比较(cmp)函数 2.1、长度不受限制的字符串函数 2.1.1、strcpy 2.1.2、strcat 2.1.3、strcmp 2.2、长度受限制的字符串函数 2.2.1、strncpy 2.2.2、strncat 2.2.3、strncmp 3、字符串查找函数…...
计算机视觉与深度学习-循环神经网络与注意力机制-RNN(Recurrent Neural Network)、LSTM-【北邮鲁鹏】
目录 举例应用槽填充(Slot Filling)解决思路方案使用前馈神经网络输入1-of-N encoding(One-hot)(独热编码) 输出 问题 循环神经网络(Recurrent Neural Network,RNN)定义如何工作学习目标深度Elm…...
brew 安装MySQL 5.7
写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成…...
【中国知名企业高管团队】系列22:滴滴
大家好! 今天华研荟的走进中国知名企业高管团队系列带大家认识滴滴。 滴滴公司是出行领域的先行者,也是一个典型样本。通过滴滴公司的名字变迁我们可以感受到滴滴公司的业务发展,这也是整个出行行业公司的发展路径: 第一阶段&a…...
Unity之Hololens如何实现3D物体交互
一.前言 什么是Hololens? Hololens是由微软开发的一款混合现实头戴式设备,它将虚拟内容与现实世界相结合,为用户提供了沉浸式的AR体验。Hololens通过内置的传感器和摄像头,能够感知用户的环境,并在用户的视野中显示虚拟对象。这使得用户可以与虚拟内容进行互动,将数字信…...
IDEA Debug技巧大全,看完就能提升工作效率
作者简介 目录 1.行断点 2.方法断点 3.异常断点 4.字段断点 5.条件表达式 1.行断点 行断点就是平时我们在代码行旁边单击鼠标打上的断点,这个没有什么好说的。关键点在于很多人不知道的,行断点其实是可以右击选择是对改行的全部调用都生效…...
蓝桥等考Python组别六级003
第一部分:选择题 1、PythonL6(15分) 运行下面的程序,输出的值最大可能是()。 importrandom print(random.randint(2,4)*5) 10152030正确答案:C 2、PythonL6(15分) 甲、乙、丙三个人赛跑,已知甲不是第一名,乙不是第二名,名次没有并列的。...
机器学习小白理解之一元线性回归
关于机器学习,百度上一搜一大摞,总之各有各的优劣,有的非常专业,有的看的似懂非懂。我作为一名机器学习的门外汉,为了看懂这些公式和名词真的花了不少时间,还因此去着重学了高数。 不过如果不去看公式&…...
目标检测:FROD: Robust Object Detection for Free
论文作者:Muhammad,Awais,Weiming,Zhuang,Lingjuan,Lyu,Sung-Ho,Bae 作者单位:Sony AI; Kyung-Hee University 论文链接:http://arxiv.org/abs/2308.01888v1 内容简介: 1)方向:目标检测 2)…...
做智慧教室的网站/竞价托管
使用Guice,需要添加第三方的包(guice-3.0.jar和javax.inject.jar) 链接:http://pan.baidu.com/s/1nuMjYOT 密码:1soo 将包导入MyEclipse或eclipse的方法:http://jingyan.baidu.com/article/6079ad0e7e4de12…...
怎么制作外贸网站/东莞网络推广托管
2019独角兽企业重金招聘Python工程师标准>>> 301 Moved Permanently 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服…...
可以做哪些有趣的网站/百度搜索最多的关键词
经过一番调查,我发现这是因为Vue3中的event对象已经升级为全新的EventEmitter,与Vue2中的event对象有所不同,导致了这个问题的出现。如果你也遇到了同样的问题,不要担心,下面我来给大家分享一下解决方法。 ࿰…...
郑州网站建设开拓者/谷歌推广开户多少费用
HTML DOM 访问访问 HTML DOM - 查找 HTML 元素。访问 HTML 元素(节点)访问 HTML 元素等同于访问节点您能够以不同的方式来访问 HTML 元素:通过使用 getElementById() 方法通过使用 getElementsByTagName() 方法通过使用 getElementsByClassName() 方法getElementByI…...
青岛市建设网站/百度网盘手机版
某天无意中看见一道关于Integer的笔试题,问下面的输出结果是多少:package test;public class Test {public static void main(String[] args) {Integer i1 127;Integer i2 127;System.err.println(i1 i2);i1 128;i2 128;System.err.println(i1 i2)…...
山西做网站/代写企业软文
我的Docker专栏 https://blog.csdn.net/weixin_45580378/category_12276045.html docker 镜像 https://registry.hub.docker.com/r/nacos/nacos-server/tags 1.下载nacos镜像 这里下载的是2.0.3 docker pull nacos/nacos-server:2.0.32.查看镜像是否下载成功 如下图 docker…...