BUAA-OO 第三单元总结

前言

黑箱测试与白箱测试

黑箱测试:测试人员在不知道程序内部实现细节的情况下,根据软件需求和规格说明书进行测试。测试关注的是输入和输出之间的关系,而不关心内部的代码结构。主要验证软件的功能是否符合需求规格说明书的要求,确保所有功能点都得到正确实现。测试人员不需要了解代码的具体实现,只需了解系统的功能和需求。基于需求文档和用户场景,设计测试用例较为直观。可以从用户的角度全面测试软件的功能,包括用户界面、API、数据库、文件系统等。

白箱测试:测试人员在了解程序内部结构和实现细节的情况下进行测试。测试关注的是程序的逻辑路径和代码覆盖率。主要验证代码的逻辑、分支和路径是否正确,实现的代码是否符合预期。测试人员需要了解程序的代码和结构。通过分析代码,确保每一条语句、分支、路径都被测试到。白箱测试通常在开发阶段进行,有助于早期发现和修正代码中的问题。

对比:黑箱测试从用户需求和功能出发,而白箱测试从代码实现和逻辑出发。黑箱测试不依赖内部代码实现,白箱测试需要深入了解代码。黑箱测试侧重功能验证,白箱测试侧重代码质量和逻辑验证。 

各类测试的理解

单元测试

        单元测试是对软件中最小的可测试部分(通常是函数或方法)进行验证,以确保它们的行为符合预期。测试对象是代码的最小单位,如函数、方法或类。通常在开发过程中编写代码的同时进行单元测试。能够快速发现和定位代码中的错误。

        可以提高代码的可维护性和可读性,通过及时发现和修复错误,降低后期修复成本。提供文档作用,帮助开发者理解代码功能。但是对于复杂系统,编写和维护大量单元测试用例可能耗费时间,需要开发者具备较高的代码理解和测试编写能力。

功能测试

        功能测试是一种验证软件功能是否符合需求规格说明书的测试方法,主要关注软件的功能性要求。测试用例根据需求规格说明书编写。测试人员不需要了解代码的实现细节。确保每个功能模块都按预期工作。

        从用户角度出发,确保软件满足用户需求,能发现功能性缺陷,确保系统功能完整性。但是可能无法覆盖所有代码路径,容易遗漏内部逻辑错误。对复杂系统需要大量测试用例,测试成本较高。

集成测试

 集成测试是将多个单元测试过的模块组合在一起进行测试,以发现模块之间的接口和交互问题。测试多个模块的集成行为和交互。可以采用增量集成、非增量集成等策略。主要关注模块之间的接口和数据传递。

        可以提前发现模块间接口和集成问题,保障系统的整体功能和性能。但需要协调多个模块的开发进度,复杂的集成依赖关系可能增加测试难度。

压力测试

压力测试是一种非功能性测试,通过施加超出正常运行负荷的压力,验证系统在极限条件下的表现。施加超过系统正常负荷的压力,如高并发、大数据量等。验证系统在极端情况下的稳定性和可靠性。识别系统的性能瓶颈和弱点。

可以提前发现系统在高负载下的潜在问题,评估系统的极限承受能力,确保在极端条件下仍能运行。但是可能需要特殊的测试环境和工具,并且对系统资源消耗大,测试成本较高。

回归测试

回归测试是在修改代码后,重新测试软件以确保新修改没有引入新的错误,且未破坏已有功能。在代码变更后进行,验证变更是否引入新问题。需要重复执行已有测试用例,验证旧功能正常。通常与自动化测试结合,提高测试效率。

可以确保新代码修改不影响原有功能,提高软件版本迭代的稳定性和可靠性。但是需要维护大量的测试用例,工作量大,手工回归测试耗时费力,通常需要借助自动化测试工具。

数据构造策略

        1. 等价类划分:将输入数据划分为若干个等价类,每个等价类代表一组具有相似特征的数据,在每个等价类中选择一个代表进行测试。

        2. 边界值分析:测试输入数据的边界值,因为边界值往往是程序容易出错的地方。

        3. 决策表测试:使用决策表列出所有可能的输入条件组合及其对应的输出结果,以确保测试用例覆盖所有可能的情况。

        4. 状态转换测试:基于系统的状态机模型,通过测试系统在不同状态和状态转换下的行为,确保状态变化的正确性。

        5. 随机测试:随机生成输入数据进行测试,以模拟用户随机操作或输入的情况。

一.hw9

hw9的重要方法主要包含queryBlockSum()和queryTripleSum()两个方法。本单元作业中我的模型均基于第一次作业的piece结构,将有关系的人都放在一个piece当中,在加边和删边时对piece进行维护,保证piece中的人都是连通的,可以将qbs和qts的复杂度降到O(1)。对piece进行维护的方式就是在添加边的时候判断两个人是否在一个piece中,如果不在就将两个piece进行合并;删边需要以被删掉边的一个端点出发去遍历所有这个点现在可达的节点,如果可达节点与原来piece中的节点完全相同,那么piece不变,否则要把原来的piece分裂为两个新的piece。同时对于qbs和qts我采用了动态维护的方法,在改变网络的同时就对一些可能被查询到的数据进行维护,最后查询的时候只需要返回相应的数据,时间复杂度降到O(1),可以避免ctle。尽管在维护的过程中可能会占用一些时间,但是在多数情况下我们查询的指令数都要比网络维护的指令数更多。这里以qts和qbs为例,对于qts,我们可以在每次加边时判断这两点是否和piece中的第三点都有关系,来增加cnt,删边时则需要再次判断piece中和这两点都有关系的点,然后减小cnt。对于qbs指令,直接返回piece.size()即可。

二.hw10

        第二次加入了一个Tag类,同时我在addTag,addPersontoTag,delTag,delPersonFromTag方法中遇到了一些问题,不过我依然是选择动态维护方法,涉及到计算的q方法使用一个Maintain方法维护该数据。

        对于计算最短路径的queryShortestPath()算法,我的实现方法如下:

使用了广度优先搜索来查找图中两个节点之间的最短路径。这是一种经典的图算法,特别适用于无权图的最短路径查找。先创建一个队列用于BFS遍历,然后创建一个映射 parentMap 用于记录每个节点的父节点,以便在找到目标节点时能回溯路径,再创建一个集合 visited 用于记录已访问的节点,避免重复访问。

三.hw11

        第三次作业主要加入了一个message类,这里只展示message的类图,按照JML的要求去写就可以完成,难度不是很大。

四.性能问题和修复情况

        在hw10强测时候莫名ctle了四个点,但是在bug修复时候重新提交一遍居然直接过了,不是很知道是什么原因,hw11主要是我在红包那里没考虑getSize()是0,导致output少了许多,大意了,丢失很多分。然后就是要选好ArrayList或HashMap的容器问题,我大多采用的是HashMap,少数采用了ArrayList,最后也是可以通过大部分强测测试点,剩余的还是qm的问题,还需要进一步的改bug。

        关于对规格的实现和分离,首先我们要明确一个方法需要更改哪些数据,存储哪些变量,这些变量随着方法会如何变化,针对动态维护而言,就是在add和del的众多方法中改写数据的值,然后缩短时间复杂度。

五.Junit测试

hw9的测试我是仿照课上实验生成随机数据来写的,也是可以通过所有的case。随机测试的方法大致如下

1. 参数化测试设置

通过参数化测试来进行多个不同数据集的测试,确保代码的广泛性和可靠性。

通过构造函数和成员变量并且用prepareData方法创造随机数据,

prepareData:使用随机数生成器创建多个测试用例,每个测试用例包含两个MyNetwork实例和一个预期结果,并且随机生成一定数量的Person对象并添加到两个网络中。然后将随机生成关系并添加到网络中,同时计算预期的result,即满足特定条件的关系数量。

2. 测试用例

验证MyNetwork实例中的待测试方法是否正确,以hw9为例,就是为了测试qts方法。queryTripleSum测试:调用myNetwork.queryTripleSum()方法,获取实际结果,并使用assertEquals断言检查实际结果是否等于预期结果result。获取myNetworkmyNetwork1中的所有Person对象,检查两个网络中的人员是否一致。使用深度比较方法strictEquals来验证两个MyNetwork实例中的人员是否完全相同。使用assertEquals断言确保两网络中的人员完全一致。

这种测试方法能够有效验证MyNetwork类的功能和稳定性,在随机数据下可以更好的充分测试。

hw10我也是采用的随机测试,但是效果并不是很好,最后由于时间问题只过了一部分case样例。

hw11我才用手动构造数据形式,就是不断的addMessage和sendMessage,但是只send一部分。同时还有一些case是考察红包和emoji,也要加上,然后还要多创计组test,进行反复测试,这样就能通过所有的case啦。

六.心得体会

作为一只纯纯的6系菜鸡,到第三单元的感觉没有前两单元的思维量大,相比之下还是比较友好的,但是只根据JML写方法是不行的,慢慢得找到哪个方法可以简化,最开始我是听同学的尝试了一下并查集,但是发现每次删边还需要重新构建一个网络,后来选择采取动态维护的方法,但是总体难度感觉还是不小,最开始是动态维护总出错,后来是Junit不是很熟练,但是总归还是可以在规定时间过的,这里要感谢五一假期的作业时间调整,感觉调整到周三很舒服,周六周日都可以“快乐”写oo了,至于“狼人杀”的互测,我个人感觉放在周一到周五比周日好,不是很影响正常的学习进度,个人建议下一届可以调整一下作业开始和结束的时间。

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值