OO第三单元总结

OO第三单元总结

1 测试

黑箱测试

黑箱测试是测试人员无需了解被测软件的内部逻辑结构、代码或设计,仅根据软件的需求规格说明书,检查程序的功能是否符合需求。从这个角度,评测机可以看作黑箱测试,其只关心程序是否能满足需求,而不在意实现细节。优点是可以快速生成大量数据进行测试,在数据生成器的实现较为完善的情况下可以测试到绝大部分情况。缺点是不关注程序实现的细节,可能有逻辑或分支未被测试到。

白箱测试

白箱测试是测试人员需要了解被测软件的内部逻辑结构、代码或设计,根据这些信息来设计测试用例,以检查软件是否按照预期工作。本单元所编写的Junit可以视作白箱测试。优点是测试能覆盖所有分支,较为全面。缺点是需要关注程序实现细节,并且需要判断各个约束条件所费精力更多。

单元测试

单元测试是开发者编写的一小段代码,用于检测被测代码的一个很小的、很明确的功能是否正确。它将注意力集中到程序的基本组成部分,确保每个单元(通常是方法或类)都能按预期工作。单元测试可以平行开展,提高了测试的效率;并且由于单元规模较小,复杂性较低,当发现错误时可以直接定位到具体的位置。

功能测试

功能测试是对产品的各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能。功能测试是为了确保程序以期望的方式运行而按功能要求对软件进行的测试,通过对一个系统的所有的特性和功能都进行测试确保符合需求和规范。其与黑箱测试很相像,不再赘述。

集成测试

集成测试主要是测试多个组件或模块在整个系统中的集成和交互是否正常。集成测试可以模拟真实环境下的操作和交互,发现更多的问题,如数据传输错误、功能冲突、逻辑错误等,从而提高软件质量。

压力测试

压力测试是对系统、设备或软件进行负载测试,以确定其在正常和异常工作情况下的性能和稳定性。压力测试可以帮助识别系统在高负荷情况下的弱点和瓶颈,以便及时进行优化和改进。压力测试在这一单元尤为重要,可以说,在理解了JML所要求的功能后,大部分的工作在于满足压力测试下的性能要求。在互测环节,极端的特殊数据也作为攻击的主要手段。

回归测试

回归测试是在发生修改之后重新执行先前的全部或部分测试用例,以确认修改没有引入新的错误或导致其他代码产生错误。回归测试的目的是确保新代码更改不会对现有功能产生副作用,从而确保软件的质量和稳定性。回归测试意为我们在迭代开发时新实现的功能不会影响原有功能。

数据构造策略

对于Junit测试中的数据构造,首先应该注意数据的全面性,以测试queryTripleSum函数为例,构造数据应尽可能覆盖完全图,稀疏图,这可以通过生成随机数加设置权重来实现。在测试自己程序时,除了常规的数据,还应构造足够极端的边界数据检查性能是否满足要求。

图模型构建和维护策略及性能要求

第一次作业

qci指令和qbs指令是有关图的,前者是检查两人是否联通,后者是计算图中包含多少个不联通子图。这两个指令可以通过维护并查集来提高性能。我对于并查集的理解是以一个人作为一个联通子图的代表,当判断两个人是否联通时只需判断这两个人的代表是否相同,当计算不联通子图数时即计算代表的人数。并查集的重建会有较大的时间开销,此时要注意提前保存好人之间的关系,在重建时遍历关系减少时间开销,并且可以引入修改位,当到需要查询(不得不重建)时再重建。

qts指令可以动态维护,每当增加关系或者删除关系时,遍历一遍所以人,若有人和这两个人都有关系,则相应地增加和减少。

第二次作业

qsp是有关图的,其为寻找最短路径长度,可以直接使用bfs寻找,不会超时。

qtvs是这次作业动态维护最复杂的指令,当两个人增加或者修改关系后,所有包含这两个人的tag中的值都应作相应修改,在寻找需要修改的tag时有一个小技巧,即通过观察可以发现若一个tag包含了这两个人,则拥有这个tag的人也一定和这两个人都有关系,那么我们可以直接查找同时和这两个人都有关系的人的tag,提升了一定的性能。

qtav指令可以在tag中动态维护age的和和age的平方和,通过数学变形可以将该指令的结果由已知量表示,在该指令查询时直接计算并返回。

qba可以在person中使用TreeMap并改写比较方法来动态维护。

        @Override
        public int compare(CoupleKey o1, CoupleKey o2) {
            int firstKeyComparison = Integer.compare(o2.value, o1.value);
            if (firstKeyComparison == 0) {
                return Integer.compare(o1.personId, o2.personId);
            }
            return firstKeyComparison;
        }

注意不要直接作差,否则会爆int范围。

qcs在遍历时要通过单层循环加双向判断实现,否则会超时。

第三次作业

这一次作业中并没有很高的性能要求,注意到消息会频繁的插入人的消息队列头部,我选择了LInkedList数据结构。

通过这一单元的三次作业可以看到JML的规格和真正的实现有着相当大的差距,或者可以说JML是用户向实现者提出的更加严谨的要求,而实现者只要满足JML中的要求而不需要向用户暴露自己的实现细节。

Junit测试方法

在Junit测试中,对于生成好的数据,我们要根据JML来一步步判断方法的规格是否满足和实现是否正确。我是通过构造两份相同数据,一份用于自己计算,一份通过调用方法计算,然后检查结果是否正确、是否修改了不应修改的对象等来确定该方法是否满足JML规格。

学习体会

本单元通过JML这一载体,主要学习了规格化设计的思想。通过课程组提供的JML,自己的整体架构几乎不需要思考,整体的工作量并不算大,并且主要的工作在于学习并复习了一些图的相关知识和思考如何动态维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值