301
社区成员
发帖
与我相关
我的任务
分享黑箱测试基于对软件系统外部行为的观察和分析,而不考虑内部的实现细节。黑箱测试中,测试人员不需要了解软件的内部结构或代码,而是根据需求规格说明书或功能规范来设计测试用例,并通过输入构造的数据,观察系统的输出以验证其是否符合预期。
而白箱测试基于对软件系统内部结构和代码的理解和分析。在白箱测试中,测试人员需要深入了解软件的内部工作原理,包括代码逻辑、算法等,并设计测试用例来检查这些部分是否按照预期进行工作,主要关注代码覆盖率等方面,以发现潜在的逻辑错误和代码缺陷。
实际应用中,黑箱测试通常用于验证代码的功能是否符合用户需求,而白箱测试则用于验证代码编写的正确性。
本次作业采取黑箱测试的形式,只是通过构造数据分析程序是否符合JML规格,并不关心程序内部的具体实现。
单元测试是针对软件中的最小功能模块进行的测试,目的是验证每个模块的行为是否符合预期,通常由开发人员编写和执行。
功能测试是针对整个软件系统的功能进行的测试,通过模拟用户的操作来验证系统是否按照需求规格说明书或功能规范的要求进行工作。
集成测试是将各个单元或模块组合在一起,测试它们之间的接口和交互是否正常,以确保整个系统的各个部分能够协同工作。
压力测试是通过模拟系统在高负载或异常情况下的表现来评估系统的稳定性和性能,以确定系统在承受压力时的表现是否符合预期。
回归测试是在对软件进行修改或更新后,重新运行之前已经通过的测试用例,以确保修改或更新不会引入新的错误或影响已有功能的正常运行。
数据构造应该考虑尽量全面的情况,比如一般情况应该用适量数量的指令,随机测试尽可能多的次数;还应该考虑极端情况,比如一些临界情况的数据;还应该考虑大量数据情况的压力测试等。
架构设计基本与JML的完全相同,本部分主要谈谈维护策略。
对某些数据的维护是通过这三次作业必不可少的。在本单元作业中大部分同学采用了并查集并动态维护的方式,主要考虑是并查集对isCircle的复杂度为O(1),但没有采用并查集,考虑到modify时可能重建并查集也会消耗一定时间,所以虽然并查集可能是最优解但并没有采用,因此对于isCircle只能使用BFS。
对于第九次作业,首先要维护blockSum和tribleSum,在addPerson时维护blockSum,在addRelation和modifyRelation时维护blockSum和tribleSum,就将原本循环重数较高的block和trible的计算复杂度降低。但此时会出现一个问题,就是维护blockSum时每次需要循环使用isCircle,而我的isCircle复杂度较高,因此在一开始输入大量数据时会跑的很慢,此时只需要在第一次查询blockSum前不维护,查询后再开始维护即可。
第十次作业引入tag,对于tag中的valueSum需要进行维护(强测的教训),对其维护是相对来说最麻烦的,首先在MyTag中的addRelation和delRelation需要对valueSum维护,其次在MyNetwork中的addRelation和modifyRelation时也要对其进行维护,维护时遍历二者共同所在的tag。第十次作业还需要对bestAc进行维护,每次addRelation和modifyRelation时判断以下Person的bestAc有没有变化,用一个HashMap储存Person和他的bestAc的id。
其实与上面的维护问题基本谈的是一个事,维护的本质就是减少复杂度,从而使性能提高。本次作业我除了上面提及的对blockSum的维护问题外,还因为一开始并没有维护tag的valueSum导致超时,而后来对其进行维护解决了问题。除了上述性能优化,我还在计算方差、delColdEmoji等地方采取了小的优化策略,降低复杂度。
根据JML编写测试时要注意对于pure方法,要检测所有可见类成员变量和输入对象不能被修改,然后对于每一个ensures都要进行检查,保证assignable元素是否按要求修改,如果有result保证result是正确结果。根据规格编写测试为我们省去了一些思考量,且让测试变得更全面更充分。
本单元主要学习规格,根据规格进行设计在大型软件设计项目中能保证项目的正确性严谨性,规格虽然一开始难以读懂但是逐渐了解过后也就慢慢适应。除此之外本单元还对一些算法、数据结构进行要求,也让我们理解了规格与实现分离的道理,让我们对规格有更好的理解。