软件质量保证与测试

软件测试基础

1、软件测试的目的和意义?

目的:

  • 验证软件需求和功能是否得到了完整的实现
  • 尽可能早的发现软件中的bug
  • 尽可能多的发现软件中的bug
  • 验证软件是否可以发布
  • 对软件的质量、性能、效率做出合理的评估
  • 预防用户使用中可能出现的问题
  • 预防下一个版本可能出现的问题

以最少的人力、物力和时间找出软件中潜在的各种错误和缺陷,通过修正各种错误和缺陷提高软件质量,回避软件发布后由于潜在的软件缺陷和错误造成的隐患所带来的商业风险

意义:

  • 保证发布出去的产品达到了一定的质量标准
  • 验证软件是否满足规定的需求
  • 弄清预期结果与实际结果之间的差别
  • 降低软件质量风险
2、软件测试的定义

软件测试:在规定的条件下对程序进行操作,以发现程序错误。通过“人工”或“自动化”的手段,来测试某个程序或系统,进而检验其是否满足规定的需求或是弄清预期结果与实际结果之间的差别

3、软件测试的原则
  • 所有测试都应追溯到用户需求
  • 应该尽早地和不断进行软件测试
  • 完全测试是不可能的,测试需要终止
  • 测试不能显示软件潜在的缺陷
  • 充分注意测试中的集群现象
  • 程序员应避免检查自己写的程序
  • 尽量避免测试的随意性
4、什么是软件缺陷(bug)
  • 从软件内部看,软件缺陷是软件产品开发或维护过程中所存在的错误、毛病、等各种问题;从外部看。软件缺陷是系统所需要实现的某种功能的失效或违背
  • 软件缺陷是软件产品中所存在的问题,最终表现为用户所需要的功能没有完全实现,没有满足用户的需求

软件缺陷示例:

  • 软件未达到软件需求规格说明书表明的功能
  • 软件的功能超出了软件需求规格说明书指明的范围
  • 软件未达到软件需求规格说明书未指明而应达到的目标
  • 软件出现了软件需求规格说明书指明不会出现的错误
  • 软件测试人员认为软件难以理解、不易使用、运行速度慢,或者最终用户认为不好
5、简述错误、缺陷、故障之间的关系

错误:软件错误即人为错误,指软件开发人员在开发软件的过程中无意间犯下的技术错误,正是这些错误导致软件工作产品的缺陷,相对于软件本身是外部行为。错误在整个软件开发周期很可能扩散,需求阶段发生的错误在设计期有可能被放大,在编写代码时还会进一步扩大。编写代码时有可能出现错误,这种错误叫做缺陷(bug)

缺陷:软件缺陷是存在于软件(文档、数据、程序)之中的那些不希望或不可接受的偏差。缺陷是错误的结果(缺陷是错误的表现),缺陷很难捕获

故障:在一个计算机程序中出现的不正确的步骤、过程或数据定义常称为故障。是指软件运行时丧失了在规定的限度内执行所需功能的能力,执行输出错误结果,导致失效

软件错误——》软件缺陷——》软件故障——》软件失效

  • 软件错误是一种人为错误,一个软件错误必定产生一个或多个软件缺陷
  • 当一个软件缺陷被激活时,便产生一个软件故障;同一个软件故障在不同条件下被激活,可能产生不同的软件故障
  • 软件故障如果没有容错措施加以处理,便不可避免地导致软件失效;同一个软件故障在不同的条件下可能产生不同的软件失效
6、缺陷(bug)的来源有哪些
  • 规格说明书缺陷
  • 功能缺陷
  • 数据缺陷
  • 系统缺陷
  • 代码缺陷
  • 加工缺陷
7、缺陷分为哪四级 有哪些不同的状态

级别:

  • 致命错误
  • 严重错误
  • 一般错误
  • 较小错误

状态:

  • 激活状态
  • 已修正状态
  • 关闭或非激活状态
8、简述在软件开发生命周期中提前测试的好处
  • 尽早发现和修复错误
  • 尽早发现缺陷
  • 提高软件质量
  • 确保软件的功能复合需求
  • 提高软件的可靠性和稳定性
  • 降低软件维护成本
9、在V模型中,软件开发的各阶段和软件测试活动有什么关系

image-20240519013706707.png

  • 单元测试:即模块测试,按照详细设计设定好的最小测试单元进行的测试,是白盒测试
  • 集成测试:即模块间的测试,测试概要设计中各模块之间的接口和软件与硬件之间的接口是否正确,是灰盒测试
  • 系统测试:包括冒烟测试、系统测试、回归测试,

①冒烟测试:验证产品或系统的“基本功能”流程,是否正常。

②系统测试:检测系统的“功能”、“性能”、“界面”、“可靠性”、“兼容性”等等是否满足软件需求分析对系统的要求,是黑盒测试。

③回归测试:在发布新版本后,测试其以前的功能仍然正常,同时,检测其修改后的缺陷是否复合软件需求分析的功能。

  • 验收测试:即交付测试,确保软件实现能否满足客户需求分析的要求,是黑盒测试
10、软件测试包括哪些阶段
  • 单元测试:对软件组成单元进行测试。其目的是检验软件基本组成单位的正确性。测试的对象是软件设计的最小单位
  • 集成测试:对系统的接口及集成后的功能进行正确性检测的测试工作。集成主要目的是检查软件单位之间的接口是否正确
  • 系统测试:对功能、性能以及软件所运行的软硬件环境进行测试,包括回归测试和冒烟测试
  • 验收测试:确保软件准备就绪,按照项目合同、任务书、双方约定的验收依据文档,向软件购买者展示该软件系统满足原始需求

软件质量保证

1、软件质量的概念

软件质量是软件特性的综合,指软件满足规定或潜在用户需求的能力,其主要从内部质量、外部质量、使用质量和过程质量这四个方面来衡量

2、在软件质量模型中,一般包括哪些软件质量特性

软件的质量特性主要有六个大的特性,其中每个特性中又有一些子特性

功能性:软件在指定条件下使用时,满足用户明确或隐含需求的能力

  • 适合性:软件为指定的任务和用户目标提供一组合适功能的能力
  • 互操作性:软件与一个或更多的规定系统进行交互的能力
  • 安全性:软件保护信息和数据的能力,以使未授权的人员或系统不能阅读或修改这些信息和数据,而不拒绝授权
  • 依从性:软件遵循与各种特性相关的标准、约定或法规以及类似规定的能力。这些标准要考虑国际标准。

可靠性:软件在指定条件下使用时,维护规定的性能级别的能力

  • 成熟性:软件为避免由软件中错误而导致失效的能力
  • 容错性:在软件出现故障或者违反指定接口的情况下,软件维持规定的性能级别的能力
  • 易恢复性:在失效发生的情况下,软件重建规定的性能级别并恢复受直接影响的数据的能力

易用性

  • 易理解性:软件使用户能理解软件是否合适,以及如何能将软件用于特定的任务和使用环境的能力
  • 易学性:软件使用户能操作和控制它的能力
  • 易操作性:软件使用户能操作和控制它的能力

效率:在规定条件下,相对于所用资源的数量,软件可提供适当性能的能力

  • 时间特性:在规定条件下,软件执行其功能时,提供适当的响应和处理时间以及吞吐率的能力
  • 资源利用性:在规定条件下,软件执行其功能时,使用合适的资源数量和类别的能力

可维护性

  • 稳定性
  • 易分析性
  • 易更改性
  • 易测试性

可移植性

  • 易安装性
  • 易替换性
  • 适应性
  • 一致性
3、软件生命周期中包括哪些质量,简述他们之间的关系

image-20240519030243387.png

  • 过程质量:过程的完善程度和标准执行的力度
  • 内部质量:开发过程中,过程产品的质量
  • 外部质量:完整的系统运行表现出的质量特性。
  • 使用质量:用户在实际使用环境中对产品的感受
4、CMM的全称是什么 CMM分为几级 简述他们之间的关系

CMM为Capability Maturity Model for software(软件能力成熟度模型)

理念:

  • 加强过程控制,认为只要开发的过程按照规定动作执行,就可以很大程度上降低软件开发的质量、进度风险。而过程质量控制的主要手段就是检视
  • 根据经验数据指导新的软件开发项目。CMM定义了监控软件开发过程是否规范的一系列指标,如软件生产率、检视缺陷密度、遗留缺陷密度等,并总结了同业的一些经验数据。当执行实际项目时,以这些经验数据指引开发过程,尽量使开发的关键质量指标落入经验数据区间。同时进行进一步分析总结,对质量目标进行修正,用以指导后续的新项目。通过在一个个的项目逐渐总结修正,最终得到一套适合自己的质量目标
  • 基于传统的瀑布软件开发模型

等级:

  • 初始级:软件过程是无序的,有时甚至是混乱的,对过程几乎没有定义,成功取决于个人努力。管理是反应式的
  • 可重复级:建立了基本的项目管理过程来跟踪费用、进度和功能特性。制定了必要的过程纪律,能重复早先类似应用项目取得的成功经验
  • 已定义级:已将软件管理的工程两方面的过程文档化、标准化,并综合成该组织的标准软件过程。所有项目均使用经批准、剪裁的标准软件过程来开发和维护软件,软件产品的生产在整个软件过程是可见的
  • 量化管理级:分析对软件过程和产品质量的详细度量数据,对软件过程和产品都有定量的理解与控制。管理有一个作出结论的客观依据,管理能够在定量的范围内预测性能
  • 优化管理级:过程的量化反馈和先进的新思想、新技术促使过程持续不断改进

关系:CMM为软件的过程能力提供了一个阶梯式的改进框架,它基于以往软件工程的经验教训,提供了一个基于过程改进的框架图

5、软件质量管理体系ISO9000-3的核心内容主要包括哪些
  • 合同评审
  • 需方需求规格说明
  • 开发计划
  • 质量计划
  • 设计和实现
  • 测试和确认
  • 验收
  • 复制
  • 交付和安装
  • 维护

软件测试类型及方法综述

1、单元测试、集成测试、系统测试、验收测试的基本概念

单元测试:指对软件中的最小可测试单元进行检查和验证

集成测试:主要用来测试模块与模块之间的接口,同时还要测试一些主要业务功能

系统测试:测试系统是否符合“需求规格说明书”

验收测试:确保软件准备就绪,按照项目合同、任务书、双方约定的验收依据文档,向软件购买者展示该软件系统满足原始需求

2、功能测试和性能测试的基本概念和内容

功能测试:确保软件符合基于项目需求的功能规范

  • 单元测试:确保应用程序的每个组件(或“单元”)按预期工作
  • 冒烟测试:确定每个功能是否正常工作
  • 安全性测试:检查并确定微小的修改是否解决了本应被解决的问题
  • 回归测试:确保某些更新不会导致新问题出现
  • 系统测试:是一种高级测试,它显示了系统是否满足技术、功能和业务需求
  • 用户验收测试:通常在一系列测试中最后执行,它需要确保应用程序能够适用于真实的场景

性能测试:消除任何阻碍性能顺利工作的因素

  • 负载测试:检查系统允许载流量和最大载流量
  • 耐久性测试:检查一段时间内的负载是否正常、确保系统稳定运行
  • 性能测试容量测试:确定加载大量数据时应用程序的工作效率
  • 可扩展性测试:确保软件能够处理不断增长的用户或数据
  • 压力测试:确定硬件资源(如CPU、内存和磁盘空间)对软件的最大支持量
3、手工测试和自动化测试、静态测试和动态测试、白盒测试和黑盒测试、回归测试、 冒烟测试、随机测试的基本概念
  • 手工测试:由质量保障工程师手工完成

  • 自动化测试:利用测试脚本、代码和软件测试工具自动实现全部或部分测试

  • 静态测试:不运行被测程序本身,通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性

  • 动态测试:通过运行被测程序来检查运行结果与预期结果的差异,并分析运行效

    率和健壮性等指标;这种方法包括三部分:构造测试用例、执行程序、分析程序的输出结果

  • 白盒测试:能够看清事物的内部,即了解事物的内部结构和运行机制,通过剖析事物的内部结构和运行机制,来处理和解决问题

  • 黑盒测试:没有办法或不用了解事物的内部结构和运行机制,而把整个事物看成一个整体——黑盒子,通过分析事物的输入与输出以及周边条件来分析和处理问题

  • 回归测试:对软件的新版本测试时,重新执行上一个版本测试时的用例

  • 冒烟测试:对一个新版本进行系统大规模的测试之前,先验证一下软件的基本功能是否实现,是否具备可测性

  • 随机测试:测试中所有的输入数据都且是随机生成的,其目的是模拟用户的真实操作,并发现一些边缘性的错误

测试用例写作

1、测试用例的写作规范
  • 用例编号

(1)规则:是由字符和数字组成的字符串,具有唯一性、易识别性。

(2)不同阶段的测试用例的用例编号

系统测试用例:产品编号ST系统测试项名系统测试子项名XXX(具体用例序号)

集成测试用例:产品编号IT集成测试项名集成测试子项名XXX(具体用例序号)

单元测试用例:产品编号UT单元测试项名单元测试子项名XXX(具体用例序号)

  • 测试项目

(1)规则:对应测试用例编号中的测试子项名

(2)不同阶段的测试用例项目的具体规则

系统测试用例:对应一个功能点(功能测试)、性能指标(性能测试)界面中控件(GUI测试)等,即软件需求项

集成测试用例:集成后的模块功能名或者内部的接口名

单元测试用例:被测试的函数名

  • 测试标题:体现测试的出发点、关注点以及测试用例期望的测试结果;

将测试项目和测试标题串在一起表示的是在“测试标题”情况下测试“测试项目”。

  • 重要级别/优先级别:用例的重要级别一般分为3个等级:高、中、低,具体划分依据:

(1)高级别:对应保证系统基本功能、核心业务、重要特性、实际使用频率比较高的测试用例;

(2)中级别:对应重要程度介于高和低之间的测试用例;

(3)低级别:对应实际使用频率不高,对系统业务功能影响不大的模块或功能的测试用例。

缺陷管理

1、软件缺陷的概念

软件缺陷就是软件产品中所存在的问题,最终表现为用户所需要的功能没有完全实现,没有满足用户的需求

2、软件缺陷产生的原因
  • 需求解释或纪录错误
  • 用户需求定义错误
  • 设计说明存在错误
  • 编码说明、程序代码有误
  • 硬件或软件系统上存在错误
  • 文档错误、内容不正确或拼写错误
3、软件缺陷报告的描述方法(软件缺陷的属性)
  • 缺陷标识:每一个缺陷都有唯一的标识
  • 缺陷类型
  • 缺陷严重程度:

Critical:严重程度最高,导致系统崩溃的缺陷

Major:严重程度较高,导致一些主要功能不能实现

Minal:严重程序一般,导致一些次要功能丧失

Cosmetic:严重程度不高,对系统功能没有影响

  • 缺陷状态:

New :新发现的缺陷

Open:缺陷被确认并安排开发人员处理

Deferred:被确定,但延期修改缺陷

Fixed:开发人员确认修复,等待测试人员处理

Closed:测试人员确定缺陷修复

Rejected:开发人员拒绝缺陷修复

  • 缺陷起源:

Requirement:需求阶段

Architecture:构架阶段

Design:设计阶段

Code:编码阶段

Test:测试阶段

  • 缺陷来源:

Requirment:需求阶段被引起

Architecture:构架阶段被引起 Design:设计阶段被引起 Code:代码阶段被引起 Test:测试阶段被引起 Integration:集成阶段被引起

  • 缺陷根源:

缺陷的种类

4、简述软件缺陷的处理跟踪过程

缺陷的发现——》缺陷的报告——》缺陷的分类和优先级分配——》缺陷的分配——》缺陷的修复——》缺陷的验证——》缺陷的回归测试——》缺陷报告的审查和分析——》缺陷的文档化——》改进与预防措施

5、对软件缺陷报告有哪些处理方式

(1)提交:测试人员发现缺陷后,将缺陷提交给测试组长

(2) 分配:测试负责人收到测试人员提交的缺陷后,交给开发人员

(3) 确认:开发者收到转移的缺陷后,会与团队甚至测试人员讨论确定该缺陷是否为缺陷

(4) 拒绝/延期:如果经协商,该缺陷不是真正的缺陷,则拒绝处理并关闭该缺陷;如果经过协商确定是真正的缺陷,可以根据缺陷的严重程度或优先级等选择立即处理或推迟处理。

(5)处理:显影剂修正缺陷

(6) Retest:开发者修正缺陷后,测试者重新测试(retest),检查缺陷是否确实被修改了。如果没有正确修改,请重新提交缺陷

(7) 关闭:测试人员重新测试后,如果缺陷已被正确纠正,则关闭缺陷,完成整个缺陷处理

静态测试与动态测试

1、静态测试与动态测试的概念
  • 静态测试:一种不通过执行程序而分析程序执行的技术
  • 动态测试:对软件系统运行行为进行分析, 包含程序在受控的环境下使用特定的输入进行正式的运行,和期望的结果比较以检查系统运行是正确还是不正确
2、静态测试的对象包括哪些?
  • 代码
  • 程序
  • 文档
3 、静态测试技术有哪些?各种技术是如何实施测试的?

各阶段的评审、静态分析、代码检查、程序分析、软件质量度量等,其中评审通常有人来执行;代码检查程序分析、软件质量度量等即可人工完成,也可用工具来完成

4、静态测试可以发现文档或代码中的哪些缺陷?

文档缺陷

  • 不一致性:文档之间或与代码之间可能存在不一致的描述或要求。
  • 遗漏:文档可能遗漏了某些重要的功能描述、操作流程或约束条件。
  • 错误:文档中的信息可能是错误的,如错误的语法、拼写错误或逻辑错误。
  • 模糊性:文档中的描述可能不够清晰,导致读者对要求或功能产生误解。
  • 不完整性:文档可能未涵盖所有必要的信息或步骤,导致读者无法全面理解产品或系统。

代码缺陷

  • 语法错误:代码可能包含不符合编程语言语法的部分,导致编译器无法成功编译。
  • 拼写错误:变量名、函数名或关键字可能存在拼写错误,导致程序无法正确执行。
  • 逻辑错误:代码中的逻辑可能不正确,如条件判断错误、循环逻辑错误等,导致程序行为不符合预期。
  • 性能问题:代码可能存在性能瓶颈,如过多的冗余计算、不恰当的数据结构选择等,导致程序运行效率低下。
  • 安全性问题:代码可能存在安全漏洞,如缓冲区溢出、SQL注入等,导致系统容易受到攻击。
  • 可读性问题:代码可能缺乏注释、命名不规范或结构不清晰,导致其他开发人员难以理解和维护。
  • 可维护性问题:代码可能过度复杂、模块间耦合度高或缺乏必要的文档,导致后期修改和维护困难。
  • 设计问题:代码可能未遵循良好的设计原则,如高内聚低耦合、单一职责原则等,导致系统结构不合理、难以扩展或修改。

静态测试通过检查代码和文档的静态特性(即不执行程序)来发现这些缺陷。常用的静态测试技术包括代码审查、静态分析工具和自动化代码检查工具等。这些技术可以帮助开发人员和测试人员在早期阶段发现潜在的问题,从而避免在后期产生更大的损失。

5、有哪些静态测试工具
6、简述通用的评审过程
  • 计划:主要活动是管理者或评审组长选择主持人和评审员、分配角色、为正式的评审类型(比如审查)定义入口准则和出口准则以及选择需要进行评审的文档或文档章节
  • 启动评审:主要活动包括分发文档、向评审员解释评审的目标、过程和被评审的文档(针对更正式的评审类型)
  • 个人评审(个人准备):主要是评审人员学习评审对象,并根据提供的基础文档检查评审对象,然后记录文档的不足、问题或意见
  • 问题交流和分析:主要是针对个人评审阶段发现的潜在缺陷或问题进行充分的讨论,如果确认是缺陷,那么作者需要进行相应的修改
  • 修改和报告:需要对确认的问题进行修复。修复完成后还需要有人检查缺陷是否已解决、收集度量和检查出口准则(针对更正式的评审类型)。同时在正式的评审中,还需要对评审过程和评审结果进行评估,为评审的过程改进提供依据
7、静态测试的主要依据有哪些

(1) 需求规格说明书:这是软件开发过程中的关键文档之一,它详细描述了软件应满足的功能需求和非功能需求。静态测试人员会依据需求规格说明书,检查软件的源代码、设计文档等是否符合规定的需求。

(2) 软件设计说明书:该文档描述了软件的整体架构、模块划分、接口设计、数据结构等设计信息。静态测试人员会依据软件设计说明书,检查代码是否按照设计要求进行编写,是否存在设计上的缺陷或不一致。

(3) 源程序:静态测试的核心是对源程序进行静态分析,检查其语法、结构、过程、接口等是否正确。测试人员会分析源代码,查找可能存在的错误,如语法错误、逻辑错误、数据一致性问题等。

(4) 编程标准和规范:软件开发通常遵循一定的编程标准和规范,以确保代码的可读性、可维护性和可移植性。静态测试人员会依据这些标准和规范,检查代码是否遵循了相应的编程约定和最佳实践。

(5) 静态测试工具:静态测试还可以使用专门的静态测试工具,如SonarQube、ESLint、Checkstyle等,这些工具可以自动化地检查代码中的潜在问题,如潜在的错误、代码风格问题、安全漏洞等。

白盒、黑盒测试

1、白盒测试方法有哪些?各种方法是如何设计测试用例的
  • 逻辑覆盖法

语句覆盖

判定(分支)覆盖

条件覆盖

判定-条件覆盖

条件组合覆盖

路径覆盖

  • 基本路径法

程序流程图分析

计算程序环路复杂度

导出测试用例

准备测试用例

生成基本路径集

  • 循环语句的测试
  • 程序插装法
2、黑盒测试方法有哪些?各种方法是如何设计测试用例的

(1) 等价类划分法:在等价类划分法设计测试用例的过程中,需要使用两个过程:分类和抽象

分类:将输入域按照相同特性或者类似功能进行分类,即把所有可能的输入数据,按照输入域划分成若干部分(子集)

抽象:在各个子类中抽象出相同特性并用实例来表 征这个特性。这样,就可以从每一个子集中选取少数具有代表性的数据作为测试用例

(2) 边界值分析法:是对输入的边界值进行测试。在测试过程中,错误大都发生在输入范围的边界上。在测试用例设计中,需要对输入的条件进行分析,并提取其中的边界值,通过对这些边界值的测试来查出更多的错误

输出域测试用例设计流程:确定有几类输出结果;确定每类输出结果的边界点 ;划定边界邻域delta;每个边界对应3个测试数据;单边界设计测试用例

(3) 因果图法(Cause-Effect Graphing):利用图解法分析输入的各种组合情况来设计测试用例。它适合于检查程序输入条件的各种情况的组合所对应的 输出是否与预期相符。因果图法最终生成的是判定表

(4) 错误推测方法:列举出程序中所有可能出现的错误和容易发生的错误;根据对这些错误的分析来选择和设计测试用例,设计 中需要利用不同测试阶段的经验

(5) 功能图法的测试用例设计过程:依据系统流程图导出状态迁移图,定义系统流程经历的一系列状态,及状态迁移所依赖的输入、输出数据;依据状态迁移图导出逻辑功能表,定义所有的由输入、输出以及状态迁移所生成、所需要的节点和路径,描述出实现功能图的基本路径组合

(6) 场景法:

根据说明,描述出程序的基本流及各项备选流

根据基本流和各项备选流生成不同的场景

对每一个场景生成相应的测试用例

3、白盒测试的逻辑覆盖法、基本路径法 设计测试用例

逻辑覆盖:根据被测程序的逻辑结构设计测试用例,测试的重点在于判定框

语句覆盖:设计若干条测试用例,使程序中每条可执行语句(所有的方框)至少执行一次

判定覆盖:设计测试用例,使程序中的每个逻辑判断的取真和取假的分支至少经历一次

条件覆盖:设计若干测试用例,使程序的每个判定中的每个条件的可能取值至少满足一次

基本路径法:在程序控制流图的基础上,通过分析控制结构的环路复杂性,导出基本可执行路径集合,从而设计出相应的测试用例的方法

4、黑盒测试的等价类划分法、边界值分析法、因果图法设计测试用例

等价类划分:依据需求将输入划分成若干个等价类,从等价类中选定一个测试用例,如果该用例通过,则表明整个等价类通过

例如:学生成绩录入系统,分数X为0到100的整数。

有效等价类:0≤X≤100(50)

无效等价类:X≤0(-5),X≥100(200)

边界值分析法:边界值分析法是对等价类划分法的补充,一般从等价类的边界寻找错误,正好等于边界值,刚好小于边界值,刚好大于边界值作为测试数据

特殊:0/空是特殊的值,在考虑边界值的时候也要考虑这个特殊值

例如:学生成绩录入系统,分数X为0到100的整数。

上边界:99,100,101

下边界:-1,0,1

因果图法:描述输入条件的组合以及每种组合对应的输出的图形化工具

单元测试

1、单元测试的概念

单元测试是对软件基本组成单元进行的测试

2、单元测试的对象是什么?单元测试的依据是什么

测试的对象是软件设计最小单位,一个类、一个组件、一个菜单、一个显示界面或者能够独立完成的具体功能都可以是一个单元。

单元测试的依据是模块功能规格说明书

3、单元测试的具体目标是什么

单元测试是编写测试代码,用来检测特定的、明确的、细颗粒的功能。单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复、改进或重构之后的正确性,保证单元模块的代码、功能、结构正确且可靠

4、单元测试有哪几个任务?每个任务的具体测试内容是什么

任务主要包括:模块接口测试、模块局部数据结构测试、模块中所有独立执行通路测试、模块的各条错误处理通路测试、模块边界条件测试

模块接口测试:

  • 具体测试内容:检查被测模块与其他模块或系统之间的接口是否按照设计要求进行交互。确保模块接收到的输入参数类型、数量、顺序等符合预期,并且模块输出的数据也符合接口规定的格式和要求
  • 重要性:模块接口是模块间通信的桥梁,接口测试是确保模块能够正确协作的基础

模块局部数据结构测试:

  • 具体测试内容:检查模块内部的数据结构(如变量、数组、链表、树等)在使用过程中是否保持完整和正确。验证数据结构的初始化、赋值、修改和删除等操作是否按照预期执行
  • 重要性:局部数据结构是模块内部数据处理的基础,对其进行测试有助于发现内存泄漏、数组越界、野指针等常见问题

模块中所有独立执行通路测试:

  • 具体测试内容:测试模块中所有可能的执行路径,确保每条路径都能够被覆盖并产生正确的结果。这通常通过设计多个测试用例来实现,每个测试用例覆盖不同的执行路径
  • 重要性:独立执行通路测试有助于发现因控制流错误导致的程序错误,如逻辑错误、循环错误等。

模块的各条错误处理通路测试:

  • 具体测试内容:检查模块在出现错误时是否能够按照设计要求进行错误处理。这包括检查错误条件的检测机制、错误信息的输出方式以及错误恢复策略等
  • 重要性:错误处理是确保程序稳定性和可靠性的重要手段,对其进行测试有助于提高程序的容错能力和可维护性

模块边界条件测试:

  • 具体测试内容:针对模块处理数据的边界情况进行测试,如输入数据的最大值、最小值、空值、非法值等。验证模块在边界条件下是否能够正确处理数据,并产生预期的输出结果
  • 重要性:边界条件往往容易引发程序错误,因此对其进行测试有助于提高代码的健壮性和鲁棒性
5、有哪些单元测试工具 如何用 JUint写测试程序
  • JUnit(Java):JUnit是最流行的Java单元测试框架之一。它提供了丰富的断言方法和灵活的测试运行方式。
  • TestNG(Java):TestNG是一个扩展了JUnit的测试框架,提供了更丰富的测试功能和更灵活的配置选项。
  • Mocha(JavaScript):Mocha是一个流行的JavaScript测试框架,它可以在浏览器和Node.js环境中运行。
  • Pytest(Python):Pytest是一个简单但功能强大的Python测试框架,支持单元测试、功能测试和集成测试。
  • NUnit(.NET):NUnit是.NET平台上的单元测试框架,它提供了丰富的断言和测试运行功能。

JUnit 注解

注解说明
@Test:标识一条测试用例。 (A) (expected=XXEception.class) (B) (timeout=xxx)
@Ignore:忽略的测试用例。
@Before:每一个测试方法之前运行。
@After :每一个测试方法之后运行。
@BefreClass所有测试开始之前运行。
@AfterClass所有测试结果之后运行。

JUnit 断言方法

方法说明
assertArrayEquals(expecteds, actuals)查看两个数组是否相等。
assertEquals(expected, actual)查看两个对象是否相等。类似于字符串比较使用的equals()方法。
assertNotEquals(first, second)查看两个对象是否不相等。
assertNull(object)查看对象是否为空。
assertNotNull(object)查看对象是否不为空。
assertSame(expected, actual)查看两个对象的引用是否相等。类似于使用“==”比较两个对象。
assertNotSame(unexpected, actual)查看两个对象的引用是否不相等。类似于使用“!=”比较两个对象。
assertTrue(condition)查看运行结果是否为true。
assertFalse(condition)查看运行结果是否为false。
assertThat(actual, matcher)查看实际值是否满足指定的条件。
fail()让测试失败。

案例

1、

public class JunitDemo {
    //@Test 用来注释一个普通的方法为一条测试用例
    @Test
    public void myFirstTest() {
        //assertEquals() 方法用于断言两个值是否相关
        assertEquals(2+2, 4);
    }
}

2、

被测类

import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class Count {
    /**
     * 计算并返回两个参数的和
     */
    public int add(int x ,int y){
        return x + y;
    }
}

测试类

import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class CountTest {
    @Test
    public void testAdd() {
        Count count = new Count();
        int result = count.add(2,2);
        assertEquals(result, 4);
    }
}

3、

被测类

public class Count {
    /**
     * 计算并返回两个参数的和
     */
    public int add(int x ,int y){
        return x + y;
    }
    /**
     * 计算并返回两个数相除的结果
     */
    public int division(int a, int b){
        return a / b;
    }
}

测试类

import static org.junit.Assert.assertEquals;
import org.junit.Ignore;
import org.junit.Test;
public class CountTest {
    //验证超时
    @Test(timeout=100)
    public void testAdd() throws InterruptedException {
        Thread.sleep(101);
        new Count().add(1, 1);
    }
    //验证抛出异常
    @Test(expected=ArithmeticException.class)
    public void testDivision() {
        new Count().division(8, 0);
    }
    // 跳过该条用例
    @Ignore
    @Test
    public void testAdd2() {
        Count count = new Count();
        int result = count.add(2,2);
        assertEquals(result, 5);
    }
}

集成测试

1、集成测试的概念

集成测试是将已分别通过测试的单元(组件),按设计要求组合起来再进行的测试,验证集成后的系统是否达到了既定的设计目标

2、集成测试的对象是什么?集成测试的依据是什么

集成测试的对象主要是模块间的集成和调用关系。主要依据:软件概要设计说明书

  • 需求规格说明:需求规格说明描述了系统的功能需求、性能需求、安全需求等。集成测试需要验证系统在集成后是否满足这些需求
  • 设计文档:系统的设计文档描述了系统的整体结构、模块之间的关系以及接口定义等。集成测试需要根据设计文档来验证模块之间的接口是否正确、模块之间的数据传递是否正常,并确保模块的集成不会影响系统的功能和性能。
  • 接口规范:接口规范描述了模块之间的数据格式、数据传递方式、调用参数等。集成测试需要验证接口的正确性和稳定性,以确保不同模块之间能够正确地进行数据交换和协作。
  • 架构规范:系统的架构规范定义了系统的整体架构和组件的划分。集成测试需要验证不同组件之间的集成是否符合架构规范,确保系统能够按照预期的方式运行,并保证集成后的系统具有稳定性和可靠性。
  • 前期测试结果:在软件开发过程中,通常会有单元测试、模块测试等测试阶段。这些测试阶段的结果可以为集成测试提供重要的参考信息,帮助集成测试人员快速定位问题并进行修复。
3、集成测试的任务是什么

确保软件系统中各个模块或组件在集成后能够正常工作,并满足预期的功能和性能要求。通过验证接口的正确性、检查模块间的交互、测试全局功能、识别并修复问题、确保系统稳定性以及进行回归测试等步骤,可以确保软件系统的高质量和稳定性

  • 验证接口的正确性:集成测试需要验证模块或组件之间的接口是否正确。这包括验证数传递、参数传递、返回值以及异常处理等方面是否符合设计要求
  • 检查模块间的交互:在集成测试中,需要检查不同模块之间的交互是否按照预期进行。例如,验证一个模块调用另一个模块时是否传递了正确的数据,以及被调用的模块是否能够正确处理这些数据。
  • 测试全局功能:集成测试不仅要测试单个模块的功能,还要测试整个系统的全局功能。这包括验证系统是否能够处理各种典型和边界情况,以及检查系统是否能够满足性能、安全性等非功能性需求
  • 识别并修复问题:在集成测试过程中,可能会发现一些模块或组件在集成后出现的问题。集成测试的任务之一是及时识别这些问题,并进行调试和修复。这包括定位问题的根源、修改代码、重新进行测试等步骤
  • 确保系统稳定性:集成测试的目标是确保系统在集成后能够稳定运行。因此,在测试过程中需要关注系统的稳定性,例如检查系统是否会出现崩溃、死锁等异常情况,并确保系统能够在各种条件下正常运行
  • 回归测试:在修复问题或添加新功能后,需要重新执行集成测试以确保系统仍然能够正常工作。这通常被称为回归测试。回归测试的目的是验证之前已经通过测试的模块或组件在修改后是否仍然满足要求,并防止新引入的问题影响整个系统
4、集成测试策略有哪些?每种策略是如何实施测试的

大爆炸集成(大棒集成)、自顶向下集成、自底向上集成、三明治集成等

  • 大爆炸集成(Big Bang Integration):这是一种非增值式集成方法,也称为一次性组装或整体拼装。在这种策略中,所有的模块都在同一时间进行集成,然后进行测试。这种方法的优点是简单、直接,但缺点是如果出现问题,很难定位到具体的模块或接口
  • 自顶向下集成(Top-Down Integration):从系统最高层的模块开始测试,逐层向下进行,直到测试整个系统。首先测试主程序模块,然后逐渐添加底层模块进行测试。这种策略可以检测整个系统的整体性能,但可能会延迟发现底层模块之间的接口问题
  • 自底向上集成(Bottom-Up Integration):从系统最底层的模块开始测试,逐层向上进行,直到测试整个系统。首先测试最底层的模块,然后逐渐添加上层模块进行测试。这种策略可以快速检测出模块之间的接口问题,但可能会忽略系统的整体性能
  • 混合式集成(Hybrid Integration):结合了自顶向下和自底向上两种集成方法的优点。通常先对底层模块进行自底向上的集成测试,确保底层模块的稳定性和正确性;然后对高层模块进行自顶向下的集成测试,验证整个系统的功能和性能
  • 增量式集成(Incremental Integration):将系统分为多个模块,逐个模块进行测试,并逐渐将测试的模块组合起来,最终测试整个系统。这种方法可以在测试过程中及早发现问题,并减少调试的时间和成本。常见的增量式集成策略有自顶向下集成、自底向上集成和混合式集成
  • 高频集成(Frequent Integration):同步于软件开发过程,每隔一段时间对开发团队的现有代码进行一次集成测试。这种策略有助于及早发现问题,减少问题的积累,提高软件质量

系统测试

1、 系统测试的概念

是对整个系统的测试,将硬件、软件、操作人员看作一个整体,检验它是否有不符合系统说明书的地方。这种测试可以发现系统分析和设计中的错误

2、 系统测试的依据是什么?系统测试主要使用的测试用方法

需求规格说明书

  • 多任务测试
  • 临界测试
  • 中断测试
  • 等价划分测试
3 、系统测试的主要内容有哪些
  • 功能测试:在规定的一段时间内运行软件系统的所有功能,以验证这个软件系统有无严重错误
  • 性能测试:通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试
  • 负载测试:数据在超负荷环境下运行,测试软件系统是否能够承担。这种超负荷主要指多并发用户
  • 压力测试:指系统不断施加越来越大的负载(并发,循环操作,多用户,网络流量)的测试
  • 安全测试:安全测试检测系统对非法入侵的防范能力
  • 健壮性测试:又称为容错测试,主要检查系统容错能力,当系统出错时,能否在指定的时间间隔内修正错误并重启系统
  • 配置测试:配置测试将验证软件与其所依赖硬件环境的依赖程度
  • 可用性测试:面向用户的系统测试。让一群有代表性的用户尝试对产品进行典型操作, 同时观察员和开发人员在一旁观察,聆听,做记录
  • 文档测试:对系统提交给文档进行验证,它要求检查系统的文档是否齐全

验收测试

1、 验收测试的概念

验收测试是在系统测试通过,以及发现错误的软件基本修正之后才开始的测试,是整个确认测试的最后一个阶段,由用户在使用环境下测试

2、 验收测试分为哪几个阶段
  • α测试:在模拟用户的环境中测试
  • β测试:在实际用户的环境中测试
3、 验收测试的依据是什么
  • 项目任务书或合同:通常包含了项目的目标和验收标准
  • 供需双方约定的验收依据文档:可能包括功能需求、性能指标、安全要求等
  • 软件规格说明书:这是描述软件系统应具有的功能、性能和行为的技术文档
  • 系统测试计划和结果:系统测试是验收测试的前一个阶段,其结果可以提供有关软件系统是否满足预定的要求的详细信息
4、 验收测试的主要内容有哪些
  • 软件产品规格说明书的审核

从客户的角度和立场进行审核工作。检验套用标准的正确性,不要和行业规范相抵触。审查、研究同类产品。验证产品规格说明书的完整性、准确性、一致性、合理性等特性。

  • 软件产品规格说明书的验证

(1)已经实现的特性标识为通过;

(2)特性没有实现,报告bug并在报告中体现;

(3)特性基本实现,但与产品说明书内容不一致,报bug并在报告中体现;

(4)特性基本实现,但存在一些问题或错误。

  • 用户界面和可用性测试

(1)用户界面的7个要素:符合标准和规范、直观性、一致性、灵活性、舒适性、正确性、实用性;

(2)易用性测试没有具体量化的指标,主观性较强。

  • 兼容性测试

(1)软件兼容性测试是指验证软件之间是否正确地交互和共享信息;

(2)兼容性包括:硬件兼容、软件之间兼容、数据之间兼容。

  • 可安装性和可恢复性测试

可安装性测试:系统软件安装、应用软件安装、服务器的安装、客户端的安装、产品升级安装等等。

可恢复性测试:恢复测试主要检查系统的容错能力。当系统出错时,能否在规定时间间隔内修正错误或重启系统。恢复测试首先要通过各种手段,让软件强制性地触发故障(BUG),然后验证系统是否能尽快恢复。

  • 文档测试

软件文档已成为软件的一个重要组成部分,而且种类很多,对文档的测试也变得必不可少。

5、 什么是α测试和β测试
  • α测试:由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的测试
  • β测试:用户在不同场所进行测试
6、 软件兼容性测试的内容,软件可安装性测试的内容

兼容性包括:

  • 硬件兼容
  • 软件之间兼容
  • 数据之间兼容

可安装性测试:

  • 系统软件安装
  • 应用软件安装
  • 服务器的安装
  • 客户端的安装
  • 产品升级安装

测试管理

1、熟悉测试管理工作的重要性

测试管理是把测试过程作为一个系统,对组成这个系统的各个过程加以识别和管理,以实现设定的系统目标。同时要使这些过程协同作用、互相促进,从而使它们的总体作用大于各过程作用之和。其主要目的是在设定的条件限制下,尽可能发现和排除产品缺陷。

测试管理使开发团队和测试团队能够更好地协作以更快的交付和敏捷的支持,另一方面这些好处也从本质上导致了跨项目的质量的提高

2、测试管理包括哪些活动
  • 修改测试案例
  • 用自动测试工具进行测试,尽早找到软件缺陷,并确保其得以关闭
  • 项目可行性、可靠性分析,风险分析
  • 制定测试计划
  • 测试自动化开发
3、一个好的软件测试工程师应该具备哪些技能和素质
  • 技术能力:测试工程师应该熟悉软件开发过程,并具备编程和脚本语言的基本知识。他们需要掌握至少一种编程语言(例如Java、Python、C#等),并了解自动化测试工具和框架(如Selenium、Appium、JUnit等)的使用
  • 测试方法和技术:测试工程师需要了解各种测试方法和技术,包括黑盒测试、白盒测试、功能测试、性能测试、安全测试、回归测试等。他们应该知道如何制定测试计划、编写测试用例、执行测试和分析测试结果
  • 基础知识和理解力:测试工程师应该具备扎实的计算机基础知识,包括操作系统、数据库、网络等方面的知识。此外,他们还应该有很好的问题分析和解决能力,能够快速理解软件系统的工作原理和结构
  • 沟通和团队合作能力:测试工程师需要与软件开发人员、产品经理和其他团队成员密切合作。因此,他们应该有良好的沟通和协作能力,能够清晰地表达问题和测试需求,并与团队成员合作解决问题
  • 注意细节和质量意识:测试工程师应该注重细节,能够仔细观察和发现软件系统中的问题和缺陷。他们应该具备高度的质量意识,追求优秀的软件质量,并能够提出改进建议和解决方案
  • 自我学习和持续改进:测试领域不断发展和演变,测试工程师需要具备自我学习和持续改进的精神。他们应该保持对新技术和测试方法的关注,并不断提升自己的技能和知识
  • 分析和问题解决能力:测试工程师应该具备良好的分析能力,能够快速定位问题的根本原因,并提出解决方案。他们应该能够利用测试工具和技术来帮助他们进行问题排查和分析
  • 执行能力和时间管理:测试工程师需要具备执行力和时间管理能力。他们应该能够按计划执行测试任务,并在给定的时间内完成测试工作。他们应该能够合理安排测试工作的优先级,并根据项目需求进行任务调度
4、成功的软件测试团队应具备哪些素质
  • 紧密合作:一个优秀的团队会想办法解决人际关系问题,完成工作。他们愿意在工作中相互支持
  • 承诺:在一个强大的团队中,所有成员都对共同的项目目标做出了承诺。他们关心并负责他们的工作,以及团队的工作
  • 高效沟通:团队成功表现的一个关键因素是沟通。成员们大声说话,清楚、诚实、有逻辑地表达他们的想法,以便他们能够理解对方
  • 分享:在一个团队中,每个成员都有自己的强项和弱项。在一个好的团队中,成员愿意分享信息、知识和经验,以提高彼此的技能

软件测试自动化

1、为什么要进行软件自动化测试
  • 提高测试效率:自动化测试可以自动执行测试用例,相比手动测试更快速和高效。测试人员可以通过编写和维护自动化脚本来减少测试时间和工作量,从而更专注于测试分析和用例设计等高价值的工作
  • 提高测试覆盖率:自动化测试可以在较短的时间内执行大量的测试用例,从而增加测试的覆盖范围。这有助于检测出更多的错误和潜在问题,提高软件质量
  • 反馈快速:自动化测试对于软件项目的各个阶段的验证来说是一种解脱。它可以快速地纠正潜在的故障,保证开发团队更高的效率。同时,由于自动化测试的快速实现,即使对于复杂而庞大的系统,也节省了大量的时间
  • 保障软件质量:自动化测试最大的优点之一在于其能有效保障软件质量。当自动化测试程序编写完成后,开发人员的每一次代码提交都可以迅速进行冒烟测试,快速发现存在问题的功能点,从而避免因为开发阶段后期的改动而直接影响产品早期开发的功能
  • 降低项目成本:尽管初始投资可能更高,但自动化测试为公司节省了很多钱。它降低了人工测试的成本,减少了因软件缺陷而导致的修复和维护成本
  • 更好地利用时间资源:自动化测试任务可以由事件驱动以及定时执行,这样可以更好地利用时间资源,确保测试工作的连续性和及时性
  • 执行人工测试困难或不可执行的测试:自动化测试可以更方便地执行人工测试困难或不可执行的测试,例如模拟大量用户场景的压力测试
2、自动化工具 QTP 编程,如设置检查点,同步点,参数化,输出值
' 创建一个对象检查点
Set objCheckPoint = Browser("BrowserName").Page("PageName").WebEdit("EditField").Object.CheckProperty("propertyname")
' 验证检查点
If objCheckPoint = expectedValue Then
    Reporter.ReportEvent micPass, "CheckPoint", "CheckPoint Passed"
Else
    Reporter.ReportEvent micFail, "CheckPoint", "CheckPoint Failed"
End If
'设置同步点
' 等待对象出现
Browser("BrowserName").Page("PageName").WebButton("ButtonName").WaitProperty "visible", True, 10000
' 等待对象消失
Browser("BrowserName").Page("PageName").WebButton("ButtonName").WaitProperty "visible", False, 10000
' 等待一段时间
Wait 5
'参数化
' 使用数据表进行参数化
DataTable.Import "C:\TestData.xls"
For i = 1 To DataTable.GetSheet("Sheet1").GetRowCount
    username = DataTable.GetSheet("Sheet1").GetParameter("Username", i)
    password = DataTable.GetSheet("Sheet1").GetParameter("Password", i)
    ' 执行测试步骤,使用参数化的数据
Next
'输出值
' 设置输出值来捕获特定的值
Browser("BrowserName").Page("PageName").WebElement("ElementName").Object.GetROProperty("propertyname", outputValue)
' 输出值存储在变量 outputValue 中,可以在测试执行后进行分析和验证
Reporter.ReportEvent micDone, "Output Value", "Captured value: " & outputValue
3、什么是软件自动化测试?软件自动化测试的优点和局限性

软件自动化测试:使用一种自动化测试工具来验证各种软件测试的需求,它包括测试活动的管理与实施、测试脚本的开发与执行

优点:

  • 测试中的许多操作是重复性的、非智力性的和非创造性的,并要求做准确细致的工作,计算机就最适合于代替人工去完成这样的任务
  • 具有良好的可操作性、可重复性和高效率等特点
  • 缩短软件开发测试周期,可以让产品更快投放市场
  • 测试效率高,充分利用硬件资源
  • 节省人力资源,降低测试成本
  • 增强测试的稳定性和可靠性
  • 提高软件测试的准确度和精确度,增加软件信任度
  • 软件测试工具使测试工作相对比较容易,且能产生更高质量的测试结果
  • 手工不能做的事情,自动化测试能做,如负载、性能测试

局限性:

  • 通过手工测试无法做到覆盖所有代码路径。
  • 简单的功能性测试用例在每一轮测试中都不能少,而且具有一定的机械性、重复性,工作量往往较大。
  • 许多与时序、死锁、资源冲突、多线程等有关的代码隐形逻辑错误,通过手工测试很难捕捉到。
  • 进行系统负载、性能测试时,需要模拟大量数据或大量并发用户等各种应用场合时,很难通过于工测试来进行。
  • 进行系统可靠性测试时,长时间持续测试,需要模拟系统运行10年、几十年,以验证系统能否稳定运行,这也是手工测试无法模拟的。
  • 如果有大量(几千)的测试用例,需要在短时间内(1天)完成,手工测试几乎不可能做到
  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cci497

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值