【软件测试】python——Unittest
UnitTest 框架
笔记来自于黑马程序员python自动化测试教程,python从基础到Uinttest框架管理测试用例。链接:[黑马程序员python自动化测试教程,python从基础到Uinttest框架管理测试用例](https://www.bilibili.com/video/BV1av411q7dT?spm_id_from=333.788.player.switch&vd_source=ecc19dcfc171f374d54c63c80b6e2a19&p=197)
定义:UnitTest 是 python 自带的一个单元测试框架,可以用来进行单元测试。
作用:自动化脚本(用例代码)执行框架(使用unittest框架莱管理运行多个测试用例的)。
好处:
- 能够组织多个用例去执行
- 提供丰富的断言方法(让程序代码代替人工自动的判断预期结果和实际结果是否相符)
- 能够生成测试报告
组成:
- TestCase
Testcase(测试用例),注意这个测试用例是 unittest框架的组成部分,不是手工和自动化中我们所说的用例(Test case)
主要作用:每个 Testcase(测试用例)都是一个代码文件,在这个代码文件中 来书写 真正的用例代码 - TestSuite
TestSuite(测试套件),用来 管理 组装(打包)多个 TestCase(测试用例)的
- TestRunner
TestRunner(测试执行,测试运行),用来 执行 TestSuite(测试套件)的
- TestLoader
TestLoader(测试加载),功能是对 Testsuite(测试套件)功能的补充管理 组装(打包)多个 Testcase(测试用例)的
- Fixture
Fixture(测试夹具),书写在 Testcase(测试用例)代码中,是一个代码结构,可以在每个方法执行前后都会执行的内容
举例:
登录的测试用例,每个用例中重复的代码就可以写在Fixture 代码结构中,只写一遍,但每次用例方法的执行,都会执行Fixture 中的代 码
1.打开浏览器
2.输入网址
一、TestCase(测试用例)
- 是一个代码文件,在代码文件中 来书写真正的用例代码
- 代码文件的名字必须按照标识符的规则来书写(可以将代码的作用在文件的开头使用注释说明)
步骤
1. 导包(unittest)
2. 自定义测试类
3. 在测试类中书写测试方法
4. 执行用例
代码
python文件:(testcase1.py)
'''
代码的目的:学习 TestCase(测试用例)模块的书写方法
'''
# 1. 导包
import unittest# 2. 自定义测试类,血药继承unittest模块中的TestCase类
class TestDemo1(unittest.TestCase):# 3.书写测试方法,即 用例代码,目前没有真正的用例代码,使用print代替# 书写要求:测试方法必须以test_开头def test_method1(self):print('测试方法1-1‘)def test_method2(self):print('测试方法1-2‘)
python文件:(testcase2.py)
'''
代码的目的:学习 TestCase(测试用例)模块的书写方法
'''
# 1. 导包
import unittest# 2. 自定义测试类,血药继承unittest模块中的TestCase类
class TestDemo2(unittest.TestCase):# 3.书写测试方法,即 用例代码,目前没有真正的用例代码,使用print代替# 书写要求:测试方法必须以test_开头def test_method1(self):print('测试方法2-1‘)def test_method2(self):print('测试方法2-2‘)
二、TestSuite(测试套件) & TestRunner(测试执行)
TestSuite:管理 打包 组装 TestCase 文件的
TestRunner:执行 TestSuite 套件的
步骤
1. 导包(unittest)
2. 实例化(创建对象),套件对象
3. 使用套件对象添加用例方法
4. 实例化运行对象
5. 使用运行对象去执行套件对象
代码
python文件:(suite_runner.py)
'''
学习 TestSuite 和 TestRunner 的使用
'''
# 1. 导包(unittest)
import unittest
# 2. 实例化(创建对象),套件对象
from testcase1 import TestDemo1
from testcase2 import TestDemo2suite = unittest.TestSuite()
# 3. 使用套件对象添加用例方法
# 方式一:套件对象.addTest(测试类名('方法名')) # 建议测试类名和方法名直接复制,不要手写
suite.addTest(TestDemo1('test_method1'))
suite.addTest(TestDemo1('test_method2'))
suite.addTest(TestDemo2('test_method1'))
suite.addTest(TestDemo2('test_method2'))
# 方式二:套件对象.addTest(unittest.makeSuite(测试类名))
suite.addTest(unittest.makeSuite(TestDemo1))
suite.addTest(unittest.makeSuite(TestDemo2))
# 4. 实例化运行对象
runner = unittest.TextTestRunner()
# 5. 使用运行对象去执行套件对象
# 运行对象.run(套件对象)
runner.run(suite)
运行结果解释
三、TestLoader(测试加载)
TestLoader(测试加载),作用和 Testsuite 的作用是一样的,对 Testsuite 功能的补充,用来组装测试用例的
比如:
如果 Testcase 的代码文件有很多,(10,20,30)
步骤
1. 导包(unittest)
2. 实例化测试加载对象并添加用例 ---> 得到的是suite对象
4. 实例化运行对象
5. 运行对象去执行套件对象
代码实现
在一个项目中 TestCase的代码,一般放在一个单独的目录中
'''
TestLoader的使用
'''
# 1. 导包
import unittest# 2. 实例化加载对象并添加用例
# unittest.TestLoader().discover('用例所在路径', pattern='用例的代码文件名.py')
# 用例所在的路径建议使用相对路径,用例的代码文件名可以使用 *(任意多个任意字符) 通配符# 使用自己创建的加载对象TestLoader()
suite = unittest.TestLoader().discover('./case', pattern='test*.py')
# 使用默认加载对象defaultTestLoader
suite = unittest.defaultTestLoader.discover('./case', pattern='test*.py')# # 3. 实例化运行对象
# runner = unittest.TextTestRunner()
# # 4. 执行
# runner.run(suite)# 可以将3,4布变为一步
unittest.TextTestRunner().run(suite)
四、Fixture(测试夹具)
Fixture(测试夹具)是一种代码结构
在某些特定的情况下 会自动执行
方法级别【掌握】
在每个测试方法(用例代码)执行前后都会自动调用的结构
# 方法执行之前
def setUp(self):# 每个测试方法执行之前都会执行pass# 方法执行之后
def tearDown(self):# 每个测试方法执行之后都会执行pass
类级别【掌握】
在每个测试类中,所有方法执行前后,都会自动调用的结构(在整个类中,执行之前执行之后各一次)
# 类级别的Fixture方法,是一个类方法# 类中所有方法之前@classmethoddef setUpClass(cls):pass# 类中所有方法之后@classmethoddef tearDownClass(cls):pass
模块级别【了解】
模块:代码文件
在每个代码文件执行前后执行的代码结构
#模块几倍的需要写在类的外边直接定义函数即可
# 代码文件之前
def setUpModule():pass# 代码文件之后
def tearDownModule():pass
方法级别和类级别的 前后的方法,不需要同时出现,根据用例代码的需要自行的选择使用
案例——登录
1. 打开浏览器(整个测试过程中就打开一次浏览器) —— 类级别
2. 输入网址(每个测试方法都需要一次)—— 方法级别
3. 输入用户名密码验证码点击登录(不同的测试数据)测试方法
4. 关闭当前页面(每个测试方法都需要一次)—— 方法级别
5. 关闭浏览器(整个测试过程中就关闭一次浏览器) —— 类级别
--------------------------------------------------------------------------------------------------------
1. 打开浏览器(整个测试过程中就打开一次浏览器) —— 类级别
2. 输入网址(每个测试方法都需要一次)—— 方法级别
3. 输入用户名密码验证码点击登录(不同的测试数据)测试方法
4. 关闭当前页面(每个测试方法都需要一次)—— 方法级别
2. 输入网址(每个测试方法都需要一次)—— 方法级别
3. 输入用户名密码验证码点击登录(不同的测试数据)测试方法
4. 关闭当前页面(每个测试方法都需要一次)—— 方法级别
2. 输入网址(每个测试方法都需要一次)—— 方法级别
3. 输入用户名密码验证码点击登录(不同的测试数据)测试方法
4. 关闭当前页面(每个测试方法都需要一次)—— 方法级别
2. 输入网址(每个测试方法都需要一次)—— 方法级别
3. 输入用户名密码验证码点击登录(不同的测试数据)测试方法
4. 关闭当前页面(每个测试方法都需要一次)—— 方法级别
5. 关闭浏览器(整个测试过程中就关闭一次浏览器) —— 类级别
-
代码
import unittestclass TestLogin(unittest.TestCase):def setUp(self):'''每个测试方法之前执行'''print('-----2. 输入网址。。。')def tearDown(self):'''每个测试方法之后执行'''print('-----4. 关闭当前页面。。。')@classmethoddef setUpClass(cls) -> None:'''所有测试方法之前执行'''print('-----1. 打开浏览器。。。')@classmethoddef tearDownClass(cls) -> None:'''所有测试方法之后执行'''print('-----5. 关闭浏览器。。。')def test_login1(self):print('-----3. 输入正确用户名密码验证码,点击登录1')def test_login2(self):print('-----3. 输输入错误用户名密码验证码,点击登录2')
运行结果
五、断言
概念:让程序代替人工自动判断预期结果与实际结果是否相符断言的结果有两种:
> True:案例通过
> False:案例不通过
在unittest中使用断言,都需要通过self.断言方法来验证
1、常见的断言方法
序号 | 断言方法 | 断言描述 |
---|---|---|
1 | assertTrue(expr, msg=None) | 验证expr是true,如果为false,则fail |
2 | assertFalse(expr, msg=None) | 验证expr是false,如果为true,则fail |
3 | assertEqual(expected, actual, msg=None) | 验证expected==actual,不等则fail【掌握】 |
4 | assertNotEqual(first, second, msg=None) | 验证first!=second,相等则fail |
5 | assertIsNone(obj, msg=None) | 验证obj是None,不是则fail |
6 | assertIsNotNone(obj, msg=None) | 验证obj不是None,是则fail |
7 | assertIn(member, container, msg=None) | 验证是否member in container【掌握】 |
8 | assertNotIn(member, container, msg=None) | 验证是否member not in container |
python文件:tools.py
def login(username, password):if username == 'admin' and password == '123456':return '登陆成功'else:return '登陆失败'
python文件:assert.py
import unittestfrom tools import loginclass TestLogin(unittest.TestCase):def test_username_password_ok(self):self.assertEqual('登陆成功', login('admin', '123456'))def test_username_error(self):self.assertEqual('登陆失败', login('root', '123456'))def test_password_error(self):self.assertEqual('登陆失败', login('admin', '123123'))def test_username_password_error(self):self.assertEqual('登陆失败', login('aaa', '123123'))
2、参数化
参数化:在测试方法中,使用变量来代替具体的测试数据,然后使用传参的方法将测试数据传递给方法的变量
好处:相似的代码不需要多次书写工作场景:- 测试数据一般放在json文件中- 使用代码读取json文件,提取我们想要的数据 ---> [(), ()] or [[], []]
安装插件
unittest 框架 本身不支持 参数化,想要使用参数化,需要安装插件来完成
- 联网安装pip install parameterized
- 代码
- 导包 unittest/parameterized
- 定义测试类
- 书写测试方法(用到的测试数据用变量替代)
- 组织测试数据并传参
# 1.导包 unittest / parameterized
import unittest
from parameterized import parameterized
from tools import login# 4.组织测试数据
# 【注】列表中有几组数据,就是几个测试用例
data = [('admin', '123456', '登陆成功'),('root', '123456', '登陆失败'),('admin', '123123', '登陆失败'),('aaa', '123123', '登陆失败')
]# 2.定义测试类
class TestLogin(unittest.TestCase):# 4.参数化装饰器 @parameterized.expand(data)@parameterized.expand(data)# 3.书写测试方法(用到的测试数据用变量替代)def test_login(self, username, password, expect):self.assertEqual(expect, login(username, password))
代码结果:
【注】data中的数据和函数的参数列表中的参数要保持一致
若从data.json文件中导入所需要的数据,代码如下:
# python文件:data.json
[{"desc": "正确的用户名和密码","username": "admin","password": "123456","expect": "登陆成功"},{"desc": "错误的用户名","username": "root","password": "123456","expect": "登陆失败"},{"desc": "错误的密码","username": "admin","password": "123123","expect": "登陆失败"},{"desc": "错误的用户名和密码","username": "aaa","password": "123123","expect": "登陆失败"}
]
# 1.导包 unittest / parameterized
import unittest
import json
from parameterized import parameterized
from tools import login# 4.组织测试数据
# 方式二:从文件中读取测试数据
def build_data():data = []with open('data.json', 'r', encoding='utf-8') as f:result = json.load(f)for item in result:data.append((item.get('username'), item.get('password'), item.get('expect')))return data# 2.定义测试类
class TestLogin(unittest.TestCase):# 4.参数化装饰器 @parameterized.expand(data)@parameterized.expand(build_data())# 3.书写测试方法(用到的测试数据用变量替代)def test_login(self, username, password, expect):self.assertEqual(expect, login(username, password))
六、跳过
对于一些未完成的或者不满足测试条件的测试函数和测试类,可以跳过执行
代码书写在TestCase文件中
1、使用方法
# 直接将测试函数标记成跳过
@unittest.skip('跳过的原因')# 根据条件判断测试函数是否跳过
@unittest.skipIf(condition, reason)
import unittestversion = 30class TestDemo(unittest.TestCase):@unittest.skip('跳过测试方法1')def test_method1(self):print('TestCase1-1')@unittest.skipIf(version > 20, '版本大于20不用测试')def test_method2(self):print('TestCase1-2')def test_method3(self):print('TestCase1-3')
七 、测试报告
-
自带的测试报告
只有单独运行TestCase的代码,才会生成测试报告
-
第三方的测试报告-HTMLTestRunner【重点】
-
HTMLTestRunner介绍
- HTMLTestRunner是一个第三方的类库,用来执行测试用例并生成HTML格式的测试报告
- 网上有多种不同的实现版本,用法都类似,只是生成的HTML报告样式有差别
- 注意:下载的文件要与Python的版本兼容(有些版本只支持Python2.x)
本课程中介绍两种模板文件,HTMLTestRunner.py 和 HTMLTestRunner_PY3.py HTMLTestRunner.py:样式比较简单,不需要依赖外部JS和CSS文件 HTMLTestRunner_PY3.py:样式比较美观,需要依赖外部JS和CSS文件
-
使用方法
1. 获取第三方的 测试运行类模块, 将其放在代码的目录中 2. 导包 unittest 3. 可以使用套件对象,加载对象,去添加用例方法 4. 实例化 第三方的运行对象 并运行套件对象
-
代码
# 1.获取第三方的测试运行类模块, 将其放在代码的目录中 # 2.导包unittest import unittest from HTMLTestRunner import HTMLTestRunner# 3.可以使用套件对象,加载对象,去添加用例方法 suite = unittest.defaultTestLoader.discover('.', pattern='parameter.py') # 4.实例化第三方的运行对象并运行套件对象 HTMLTestRunner(stream=open('report.html', 'wb')).run(suite) # stream=sys.stdout, 测试报告的文件对象(open),注意:要用 wb 打开 (必填) # verbosity=1, 报告的详细程度,默认 1-简略,2-详细 (选填) # title=None, 测试报告的标题 (选填) # description=None, 描述信息,python版本,pycharm版本 (选填)
-
- 组织用例文件(Testcase 里边),书写参数化,书写断言,书写 Fixture,书写 跳过,
- 如果单个测试测试文件,直接运行,得到测试报告,如果有多个测试文件,需要组装运行生成测试报告
- 使用 套件对象组装,或者使用 加载对象组装
- 运行对象 运行
4.1 运行对象 = 第三方的运行类(文件对象(打开文件需要使用 wb 方式))
4.2 运行对象.run(套件对象)
相关文章:

【软件测试】python——Unittest
UnitTest 框架 笔记来自于黑马程序员python自动化测试教程,python从基础到Uinttest框架管理测试用例。链接:[黑马程序员python自动化测试教程,python从基础到Uinttest框架管理测试用例](https://www.bilibili.com/video/BV1av411q7dT?spm_i…...
Maven:详解 clean 和 install 命令的使用
clean 的主要功能是清理项目构建过程中生成的所有临时文件和输出文件。具体来说,clean 阶段会删除 target 目录及其所有内容。 clean 阶段的具体功能 删除 target 目录: target 目录是 Maven 构建过程中默认的输出目录,存放所有构建生成的文件…...
HTTP与RPC
一、概念 HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种应用层协议,主要用于在Web服务器之间传输html页面和其他Web资源。 RPC(Remote Procedure Call,远程过程调用) 是一种通用的远程调用通信协议&#…...

解决蓝牙键盘按键错乱的问题
最近发现我的蓝牙键盘按下的键盘与实际不符,于是就上网搜索答案,网上的方法都试了一遍 最后想着准备退货,没想到客服直接给我解决了 原因很简单,就是之前误触了键盘的某些按键导致的 每个键盘品牌的按键因该都不同的,可…...

MiL.k X Biggie 奇妙宇宙来袭!
MiL.k 和亚航奖励计划联手推出 MiL.k X BIGGIE 奇妙宇宙,为亚航会员和 MiL.k 用户提供神奇的 Web3 体验。这款沉浸式体验位于 The Sandbox 的 MiL.k Land,提供趣味游戏,解锁令人兴奋的新奖励。 亚航吉祥物 BIGGIE 和他友好的机舱服务员将引导…...
云服务器中删除非空目录(包含文件和子目录)rm -rf <directory_name>
在云服务器中删除目录可以使用 rm 命令。如果您需要删除一个非空目录(包含文件和子目录),可以使用以下命令: rm -rf <directory_name>参数解释: -r:递归删除,即删除目录及其所有内容&am…...

1991-2024年经管类国自然、国社科立项名单(附68份国自然标书)-最新出炉 附下载链接
很全!1991-2024年经管类国自然、国社科立项名单(附68份国自然标书) 下载链接-点它👉👉👉:很全1991-2024年经管类国自然、国社科立项名单(附68份国自然标书).zip 资源介…...

Flutter问题记录 - 布局中莫名其妙的白线/缝隙
文章目录 前言开发环境问题描述问题分析解决方案最后 前言 最近客服反馈了一个奇怪的问题,有个用户反馈其他问题时给了应用截图,然后他发现这截图中有一条奇怪的白线。他在自己手机上没有发现这个问题,于是提工单反馈到我这。 开发环境 Fl…...
从零学习大模型(七)-----LoRA(中)
自注意力层中的 LoRA 应用 Transformer 的自注意力机制是模型理解输入序列之间复杂关系的核心部分。自注意力层通常包含多个线性变换,包括键(Key)、查询(Query) 和 值(Value) 三个权重矩阵的线…...

Java知识巩固(十二)
I/O JavaIO流了解吗? IO 即 Input/Output,输入和输出。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。数据传输过程类似于水流,因…...

一家光伏企业终止,恐不具行业代表性,市占率仅为2.35%
海达光能终止原因如下:报告期内海达光能销售金额较所在行业第二名亚玛顿相差两倍以上,公司毛利率更是远低于行业龙头福莱特,恐难以说明公司行业代表性。在企业竞争上,公司2021年度的市场占有率约为2.35%,公司未来光伏玻…...

企业计算机监控软件是什么?6款电脑监控软件分享!提升企业管理效率,吐血推荐!
嘿,各位企业管理者和IT小伙伴们! 您是否曾担忧员工在工作时间内效率低下?是否对公司的数据安全感到不安? 别担心,今天我们就来聊聊企业计算机监控软件,它就像是企业的"超级侦探",帮…...

VisionPro —— CogOCRMaxTool工具详解
CogOCRMaxTool的作用: CogOCRMaxTool:是一个字符识别工具,主要用于字符识别,它能够根据已训练的字符样本读取灰度图像中的字符,并返回读取结果。 一:工具位置 二:添加图片 三:工具的初始页面 将识别框拖到需要识别处…...

网站安全问题都有哪些,分别详细说明
网站安全问题涉及多个方面,以下是一些常见的网站安全问题及其详细说明: 数据泄露 问题描述:数据泄露是指网站存储的用户敏感信息(如用户名、密码、信用卡信息等)被非法获取。黑客可能通过SQL注入、XSS攻击等手段窃取这…...

DiskGenius一键修复磁盘损坏
下午外接磁盘和U盘都出现扇区损坏,估计就是在开着电脑,可能是电脑运行的软件还在对磁盘进行读写,不小心按到笔记本关机键,重新开机读写磁盘分区变得异常卡顿,估摸就是这个原因导致扇区损坏。在进行读写时,整…...

Matlab实现鼠群优化算法优化回声状态网络模型 (ROS-ESN)(附源码)
目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 鼠群优化算法(Rat Swarm Optimization, ROS)是一种基于老鼠群体行为的群体智能优化算法。ROS通过模拟老鼠在寻找食物时的聚集、分散和跟随行为,来探索解空间并寻找最优解。该算…...

nfs作业
一、作业要求 1、开放/nfs/shared目录,供所有用户查询资料 2、开放/nfs/upload目录,为192.168.xxx.0/24网段主机可以上传目录, 并将所有用户及所属的组映射为nfs-upload,其UID和GID均为210 3、将/home/tom目录仅共享给192.168.xxx.xxx这台…...

Linux 基础io_理解文件系统_软硬链接_动静态库
一.磁盘 1.磁盘物理结构 盘片 磁盘可以有多个磁片,每个磁片有两个盘面,每个盘面都对应一个磁头,都可以存储数据。 磁道 扇区 磁道是指在盘面上,由磁头读写的数据环形轨道。每个磁道都是由一圈圈的圆形区域组成,数据…...
大语言模型参数传递、model 构建与tokenizer构建(基于llama3模型)
文章目录 前言一、传递参数构建1、构建模型参数2、构建数据参数3、构建训练参数4、类似parse方式解析数据、模型、训练参数五、构建tokenizer与model1、tokenizer与model调用代码2、tokenizer实现2、model实现前言 上一篇说到huggingface的参数传递理论方法,本篇文章应用与ll…...
使用 `screen` + `nohup` 实现高效日志记录和多环境任务管理
使用 screen nohup 实现高效日志记录和多环境任务管理 在深度学习模型训练中,特别是在服务器上运行长时间的任务时,有效的任务管理和日志记录至关重要。我们通常需要在后台运行多个任务,同时为每个任务配置不同的 conda 环境。通过结合使用…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

GAN模式奔溃的探讨论文综述(一)
简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...
Android屏幕刷新率与FPS(Frames Per Second) 120hz
Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数,单位是赫兹(Hz)。 60Hz 屏幕:每秒刷新 60 次,每次刷新间隔约 16.67ms 90Hz 屏幕:每秒刷新 90 次,…...