测开整合
怎么测试微信发红包功能?如何设计测试用例?(米哈游)page 92
功能测试。1.输入校验:金额和个数输入框仅输入数字。金额边界值为0.01到200。拼手气红包最多只能发100个。直接输入小数点自动补0。2.红包描述支持中英文、符号、表情,限制字符数。3.业务逻辑验证:红包发放后是否能被他人领取。验证余额不足红包发送失败,且不会扣除用户余额的钱。支持用户自选支付方式,余额不足是否匹配其他支付方式。
性能测试。1.网络不稳定下,测试发红包抢红包响应时间和页面跳转时间。2.测试收发红包手机耗电量情况。
兼容性测试。在iOS和Android以及电脑端验证抢红包功能。
哈喽单车扫描设计测试用例(米哈游)page 92
需求分析。1.业务流程:扫码解锁和手动输入车辆编号解锁。解锁分为白天光线充足和夜间低光环境,需自动调起手电筒。此外如果存在正在进行订单或未支付订单,则不允许解锁。2.测试点。白天扫码是否成功。夜间扫码是否支持调起手电筒,并保证识别。相机和手电筒权限的处理。
测试用例。测试用例1:白天扫码解锁成功。前提条件: 手机在光线充足的环境中;相机和手电筒权限均已授权;不存在正在运行或未支付订单。步骤:打开哈啰单车App,进入扫码解锁界面。对准车上二维码进行扫描。预期结果:App成功识别二维码;执行解锁流程,反馈解锁成功;解锁后订单状态更新正常。
测试用例2:夜间扫码解锁成功(自动调起手电筒)。前提条件: 手机处于低光环境;相机和手电筒权限均已授权;不存在订单冲突。步骤:在夜间环境下打开App扫码界面。检查App是否自动调用手机手电筒;对准车上二维码扫描。预期结果:手电筒自动开启;App正确识别二维码并完成解锁流程;解锁成功提示及订单状态更新正确。
测试用例3:二维码模糊或无效导致扫码失败。步骤:使用模糊或损坏的二维码进行扫描。预期结果:App无法识别二维码,并给出友好的错误提示(例如“二维码无法识别,请调整距离或光线后重试”)。测试用例4:未授权相机或手电筒权限。步骤:禁用相机或手电筒权限后进入扫码界面。尝试扫码操作。预期结果:App检测到权限问题后,弹出权限申请或友好提示,提示用户开启相应权限后再操作。
测试用例5:存在正在运行或未支付订单时的扫码解锁。步骤:在已有订单未完成(或未支付)的情况下,尝试进行扫码解锁。预期结果:App应阻止新的解锁操作,并明确提示用户需要先处理当前订单。
redis测试场景(米哈游)page 80
功能测试。1.基本命令,set get incr decr del的正确性。2.数据结构测试,string list set z set hash的查找插入删除。3.过期策略,expire ttl persist命令。
持久化测试。rdb和aof完整性。
压力测试。用redis-benchmark模拟大量并发请求。
Web端点击上传图片出现问题(米哈游)page 80
问题复现。描述问题发生具体步骤,确认问题是否在所有环境都复现。确认测试环境是否与预期一致。
前端排查。1.控制台日志,用开发者工具检查,观察是否有js错误。2.事件绑定,验证上传按钮的点击事件是否正常绑定。3.网络请求,在network面板查看点击上传后是否有请求发出,检查状态码。
后端接口测试。用postman手动调用上传接口,检查返回数据格式和状态码,确认用户权限是否足够,以及图片大小。
进程和线程,举出对应的生活中的例子(米哈游)page 79
进程是独立运行的程序,有自己的内存空间和资源,线程是进程内部执行单元,共享进程资源。
如餐厅和服务员。餐厅有独立厨房、菜单,每个餐厅相互独立,彼此不共享厨房。服务员在同一家餐厅工作,共享厨房等资源,但各自负责接单、上菜任务。如果一位服务员出问题,其他服务员继续服务;如果整个餐厅出现问题,所有服务员受到影响。
数据库加了一条索引后怎么测试(米哈游)page 79
验证索引正确性。用mysql命令show index from检查索引覆盖的列,验证唯一性。
查询执行计划验证。用EXPLAIN FORMAT=JSON查看查询执行计划,确认查询用了索引,检查扫描类型、过滤类型和返回行数。
性能测试。记录查询时间、cpu io消耗。并评估写操作性能,因为索引会增加写操作开销。
性能测试中怎么看索引生效,以及加索引后怎么定量分析性能提升(米哈游)page 79
如何验证索引生效。用EXPLAIN FORMAT=JSON命令,查看索引使用情况,查看key列;扫描类型,是否由全表扫描变为索引扫描或范围扫描;扫描行数应大幅下降。
定量分析性能提升。1.基准测试。建立测试环境与生产环境相似,使用相同查询语句和并发量。2.指标,响应时间,吞吐量如qps、tps,资源使用率,cpu内存和磁盘io。
Mysql设计需要考虑哪些问题(米哈游)page 79
需求分析。1.业务需求。清楚业务场景,数据量预估,读写比例。2.数据模型设计。构建合理的ER图,确定表结构,字段类型。
表结构和索引设计。合理设计字段,考虑字段长度、数据类型,设计合适索引,单列索引、覆盖索引、联合索引。
分库分表方案。
前后端分离和不分离的优缺点(米哈游)page 79
前后端分离。1.优点。团队分工明确,定义接口进行协同。技术灵活性,前端可以选择react、vue等框架,后端可以选择Java python等技术栈。多端复用。2.缺点,架构复杂度增加,维护api接口文档,接口版本管理、跨域问题。
不分离。1.优点。架构简单。2.缺点。可维护性差。
查询接口通过id查询信息设计用例(米哈游)page 78
功能测试。1.正常查询,使用一个存在的有效id查询,验证接口能够正确返回数据。预期结果: 返回状态码200。2.不存在的id,返回空数据或提示“未找到记录”。
参数校验。1.非法字符,预期结果: 返回错误提示。2.数据类型验证,传入非整数类型的数据,预期结果: 返回数据类型错误提示或转换错误。
边界值测试。测试id的边界值,对最小值和最大值能返回正确的数据或合理的错误。
浏览器解析html、js、cs文件顺序(米哈游)page 78
HTML:首先解析,构建 DOM 树。 CSS:在 HTML 解析过程中并行下载,解析成 CSSOM,必须在渲染前完成。 JS:默认同步执行(会阻塞 HTML 解析),但通过 async 和 defer 可实现异步加载或延迟执行。
针对原神中的甘雨角色设计测试用例(米哈游)page 78
功能测试。1.基础攻击与连招测试,验证普通攻击的动画、伤害计算。蓄力攻击:测试蓄力时间、蓄力状态下的动画表现、伤害计算。2.元素技能测试,验证技能触发条件,元素爆发确认激活条件。3.数值计算,检查甘雨在不同等级、装备、命座加成下的基础属性。
性能测试。1.动画流畅性在大规模战斗或特效密集场景下,验证甘雨角色的技能动画。2.响应时间测试,测试玩家输入指令到技能实际释放之间的延迟。
边界测试。模拟连续、多次、快速触发技能输入,验证系统能否正确处理。
好的断言需要考虑哪些要素(米哈游)page 78
可读性,没有额外注释的情况下,快速理解测试逻辑。
错误提示信息,断言失败时,应提供足够的信息来帮助定位问题。
有一个接口,输入json格式,键值对的形式,输出需要拼接成key:value,怎么测试。(米哈游)page 78
1.正常场景。多个键值对: 输入 { “name”: “Alice”, “age”: “30” },预期输出 “name:Alice, age:30”。单个键值对: 输入 { “city”: “Beijing” },预期输出 “city:Beijing”。
2.边界情况。空 JSON: 输入 {},预期输出可能为空字符串或者返回特定提示信息。 键或值为空: 如 { “name”: “” } 或 { “”: “value” },验证接口如何处理。
3.异常和错误场景。非法 JSON 格式: 输入格式错误的 JSON 数据(比如漏掉引号、逗号),检查接口的错误处理机制。
python字典?怎么把字典转json文件?(米哈游)
import json
data = {
"name": "Alice",
"age": 30,
"city": "New York"
}
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
对yield的了解—工作原理(米哈游)page 77
生成器函数。当函数中出现 yield 语句时,该函数就不再是一个普通的函数,而变成了一个生成器函数。
执行流程:暂停与恢复。首次调用:当第一次调用生成器对象的 next() 方法时,函数从头开始执行,直到遇到第一个 yield。 暂停状态:遇到 yield 后,函数会返回 yield 后面表达式的值,并暂停执行,同时保存当前的局部变量、执行指针和上下文环境。
惰性求值。yield 可以实现数据的“惰性生成”,即在每次需要数据时才计算下一个值。
底层实现。CPython 中,生成器的状态(如局部变量、执行指针)都保存在一个栈帧中。当执行到 yield 时,该栈帧被挂起;调用 next() 后,栈帧恢复执行。
python的装饰器与生成器(米哈游)page 77
装饰器是一个高阶函数或类,它接受一个函数(或类)作为参数,并返回一个经过增强或修改后的新函数。用于日志记录。
生成器是使用 yield 关键字定义的特殊函数,每次调用生成器函数时,不是一次性返回所有结果,而是按需生成一个结果。用于动态生成测试数据。
优惠券转赠 设计测试用例(米哈游)page 77
成功转赠优惠券。用户A选择一个有效、可转赠的优惠券。 用户A发起转赠,指定存在且符合条件的用户B。预期结果: 优惠券从用户A账户扣除; 优惠券正确添加到用户B账户; 转赠成功信息和交易记录生成。
转赠部分数量优惠券(如支持部分转赠)步骤: 用户A拥有多个同类型优惠券。 用户A选择部分数量进行转赠给用户B。 预期结果: 转赠数量从用户A账户中扣除; 用户B账户中增加相应数量的优惠券; 系统正确记录部分转赠细节。
转赠给不存在的用户。步骤: 用户A输入一个不存在的用户ID进行转赠。 预期结果: 系统返回错误信息,“目标用户不存在”。
转赠已过期优惠券。步骤: 用户A选择一个已过期的优惠券发起转赠。 预期结果: 系统拒绝转赠,并提示优惠券已过期,不能转赠。
转赠已使用或部分使用优惠券。步骤: 用户A尝试转赠已经使用或部分使用的优惠券。 预期结果: 系统校验状态,禁止转赠操作,提示“优惠券已使用”。
jmeter的断言类型知道哪些吗(米哈游)page 77
响应断言(Response Assertion) 用于验证返回的响应数据是否包含预期的文本、正则表达式、响应码或响应消息,是最常用的断言类型。
持续时间断言(Duration Assertion) 用来判断请求响应时间是否在预设的时间阈值内,帮助识别性能瓶颈。
大小断言(Size Assertion) 用于校验响应数据的字节数是否在预期范围内,防止返回的数据异常过大或过小。
举个例子,什么情况下才用他做缓存?在举个生活中的实际例子(米哈游)page 77
想象一下你每天早晨需要喝牛奶。如果你每次喝牛奶都跑到超市去买,不仅浪费时间,而且每次的购买成本也会增加。因此,你会选择一次性购买足够几天用的牛奶,存放在冰箱里。下次需要时,就可以直接从冰箱中取出,这样既方便又节省时间。
类比说明: 冰箱:相当于缓存,用来存放常用、读取频繁但不需要立即更新的“数据”(牛奶)。 超市:相当于数据库,每次从这里获取数据速度较慢且成本较高。
在淘宝上有一个秒杀活动,写一下测试用例?(米哈游)page 76
1.用户登录与进入秒杀页面。前置条件: 用户已注册并存在有效账号 测试步骤: 打开淘宝首页 使用有效账号密码登录 进入秒杀活动页面 预期结果: 登录成功后,用户可正常访问秒杀页面 页面显示秒杀活动的商品信息、活动时间及倒计时
2.秒杀活动页面展示。前置条件: 秒杀活动在预定时间内。测试步骤: 在活动开始前访问秒杀页面 检查页面是否显示商品详情、活动规则、倒计时及参与入口(灰显或不可点击状态) 预期结果: 页面展示所有预设信息,倒计时准确显示 秒杀按钮在活动未开始前为不可点击状态
3.倒计时功能准确性。前置条件: 秒杀活动设定开始时间。测试步骤: 进入秒杀页面,观察倒计时显示 确认倒计时数字每秒递减,直至0 预期结果: 倒计时准确无误,在倒计时结束后秒杀按钮变为可点击状态
4.秒杀开始瞬间响应。前置条件: 秒杀活动倒计时归零,活动开始 测试步骤: 在活动开始瞬间点击秒杀按钮 预期结果: 系统在极短时间内响应,提示用户“正在抢购” 若库存充足,则立即锁定商品;否则提示“库存不足”
性能与并发测试。前置条件: 秒杀活动临近开始,预期用户数激增 测试步骤: 使用性能测试工具(如JMeter、LoadRunner)模拟数千甚至上万用户同时访问秒杀页面 模拟秒杀按钮点击请求 预期结果: 页面响应时间在可接受范围内
如果有三个进程写入一个文件,你会怎么做?用到哪些东西来解决这个问题(米哈游)page 76
文件锁。利用操作系统提供的文件锁机制(例如 Unix 系统下的 fcntl 或 flock,以及 Windows 下相应的锁定 API),在每次写入前先获取锁,写入完成后释放锁。
进程间互斥机制。用系统级的信号量(semaphore)或互斥锁(mutex),这些同步原语可以在多个进程间共享。
日志聚合或写入代理。设计一个专门的日志聚合进程。其他进程将写入请求(或日志数据)发送到这个聚合进程,比如通过消息队列(Message Queue)或 socket 通信,由聚合进程统一管理文件写入。
OOP的缺点(米哈游)page 76
过度设计与复杂性。鼓励通过继承、抽象和多态来构建系统,过深的继承层次和复杂的对象关系会使代码难以理解、调试和维护。
性能开销。动态绑定、虚函数调用以及大量对象的创建和销毁会带来一定的性能负担。
并发和线程安全问题。OOP 中常常存在多个对象共享状态的情况,而共享可变状态在多线程环境下容易引发竞态条件和其他线程安全问题。
python里面的内存是怎么释放的(GC)(米哈游)page 76
引用计数。每个 Python 对象内部都有一个引用计数器,用来记录有多少个引用指向该对象。当一个对象的引用计数归零时,说明没有变量再指向它,此时对象会立即被销毁,内存随之释放。
垃圾回收。引用计数虽然有效,但它无法处理循环引用的问题——例如,两个对象互相引用,即使它们外部没有其他引用指向它们,计数也不会归零。为了解决这一问题,CPython 实现了基于“分代收集(Generational Collection)。对象被分为几个“代”,新创建的对象位于第一代(新生代),如果经过一次垃圾回收依然存活,则会晋升到更高的一代。
C++中Static修饰的成员函数有什么特点?(米哈游)page 76
类级别的函数。直接通过类名调用,无需实例化对象。
没有this指针。由于静态成员函数不依赖于对象实例,所以它们没有this指针。
仅能访问静态成员。静态成员函数只能直接访问类中的其他静态成员(无论是数据成员还是成员函数)。
不可声明为虚函数。
C++中一个有一个矩阵,有一个 a的指针,这个指针代表什么?我想让这个指针指向第三行第十列,怎么操作?(米哈游)page 75
指向指针的指针。双重指针 a 实际上保存的是指针数组的地址。
下标是从 0 开始计数的,所以第三行对应下标 2,第十列对应下标 9。int* p = &a[2][9];
对vector了解多少,vector底层实现,占用内存是否一定连续?vector如果加了上万个数据后又立马弹出去,vector容量会变化吗?(米哈游)page 75
1.动态数组。维护三个关键数据成员:指针:指向一块连续分配的内存区域,该区域用来存储元素。size:当前存储的元素个数。capacity:当前内存块所能容纳的最大元素个数。
扩容机制。插入新元素导致size超过capacity时,vector会:
分配一块更大的内存区域(通常是当前容量的倍数,这样可以保证摊销插入操作的时间复杂度为常数)。将原有元素从旧内存拷贝或移动到新内存区域。释放旧的内存区域。
2.标准要求std::vector的元素必须在内存中连续存储。例外情况:vector
3.容量(capacity)并不会因为弹出元素(例如调用 pop_back() 或 clear())而自动缩减。也就是说,如果你插入上万个数据后再弹出,虽然 size 会减为 0 或接近 0,但内部预分配的内存(即 capacity)仍然保持不变。
mysql主键和唯一键的区别,唯一键可不可以是null,字符串可不可以为空(米哈游)page 75
主键不能为null。一个表中只能有一个主键,可以由单个或多个字段(复合主键)组成。主键会自动创建聚集索引。
唯一键允许 NULL,一个表可以有多个唯一键。
字符串是否可以为空。在 MySQL 中,空字符串(”“)是一个合法的值,代表该字段有数据,只不过是空的;而 NULL 则表示缺失或未知数据。认情况下 MySQL 并不会禁止空字符串,可以为字段添加 CHECK 约束,在插入或更新数据时,如果字段值为空字符串,就会报错。
一个case(测试用例)包含哪些部分 (米哈游)page 75
前置条件。执行该用例前必须满足的环境状态。
测试步骤。输入数据和操作流程。
预期结果。系统或模块应呈现的状态或输出。
你玩过什么游戏吗? (米哈游)page 59
我手机端、电脑端、主机端都在玩,手机端如和平精英、王者荣耀,电脑端如赛博朋克2077、艾尔登法环、原神,主机端如旷野之息、战神。