北航OO第三单元总结

第三单元总结

测试过程

黑箱测试和白箱测试

黑盒测试又称为功能测试,主要检测软件的每一个功能是否能够正常使用。在测试过程中,将程序看成不能打开的黑盒子,不考虑程序内部结构和特性的基础上通过程序接口进行测试,检查程序功能是否按照设计需求以及说明书的规定能够正常打开使用。

白盒测试也称为结构测试,主要用于检测软件编码过程中的错误。程序员的编程经验、对编程软件的掌握程度、工作状态等因素都会影响到编程质量,导致代码错误。

他们两个分别从用户角度和程序员角度进行程序测试,黑盒测试比较简单,不需要了解程序内部的代码及实现,与软件的内部实现无关;白箱测试帮助软件测试人员增大代码的覆盖率,提高代码的质量,发现代码中隐藏的问题。但是他们两个都不能或者说很难覆盖全部代码。

其他测试方式

单元测试

单元测试是最基础的测试类型,主要针对软件中的最小可测试单元(通常是函数或方法)进行测试。目的是验证这些单元是否按预期工作。单元测试通常由开发人员编写,并可以使用如JUnit、pytest等测试框架来自动执行。单元测试有助于尽早发现代码中的错误,便于开发人员迅速修复。

功能测试

功能测试是从整体上验证软件的功能是否符合需求规格说明书的测试。这类测试主要关注软件的业务逻辑是否正确,而不关注代码的内部结构。功能测试通常由独立的测试团队进行,可以手工执行,也可以自动化。测试的内容包括用户界面、API、数据库等与软件功能相关的各个方面。

集成测试

集成测试的目的是测试多个模块或组件合并后是否能正常工作。在单元测试之后进行,它检查不同模块之间的接口处是否存在问题。例如,确保各个服务或组件之间的数据传递和任务分配逻辑正确。集成测试可以采用自底向上或自顶向下等不同策略来执行。

压力测试

压力测试主要是为了评估软件在超过正常或峰值负载下的表现。这包括了解软件的稳定性、可靠性和错误处理能力。常见的压力测试包括增加数据库查询频率、模拟大量用户同时使用软件等。压力测试帮助开发团队识别和修复可能在生产环境中出现的性能瓶颈和其他问题。

回归测试

回归测试是在软件发生变更(如新增功能、修复错误等)后进行的测试,以确保这些变更没有引入新的错误,并且原有功能仍然正常工作。回归测试可以是全面的,也可以是针对特定功能的。这种测试通常在软件开发的每个阶段都会进行,确保新代码的集成不会破坏现有的功能。

数据构造策略

等价类划分

等价类划分实际上就是弄清输入数据可能有哪几种情况,分别针对这些情况来进行专门的测试。反映到这次作业中,我们可以看到输入的指令可以分为对于person,relation,tag,message等类进行操作,而还可以对其中的操作进行更加细致的划分,这样的划分可以比较全面的覆盖输入命令的情况。

边界值分析

边界值分析是在等价类划分的基础上,重点测试每个等价类的边界条件。这是因为软件错误往往发生在边界处。在本次作业中,可以测试人数为0或者很大的情况,可以测试某些极端情况。

组合测试

组合测试是将多个输入参数的可能值组合起来进行测试。这对于发现不同输入参数之间相互作用引起的问题特别有效。可以使用正交数组、全组合或成对组合(两两组合)等技术来实现组合测试。

随机测试

随机测试是通过随机生成输入数据来测试程序的稳定性和错误处理能力。这种方法就需要借助评测机来测试,大多数都是测试性能的,因为单纯的随机生成很难覆盖到一些很刁钻的数据,大多都是很普通的数据,只是用于压力测试。

本单元架构设计

在这里插入图片描述

上图为这单元最终作业除去十二个异常类的uml图。

我这次实现的策略大致如下:

通过加点加边等基本方法来逐步构建出一个图,然后为了方便查询,使用了大多数同学使用的并查集方法,也就是新建了一个DisjoinSet的辅助类来维护节点之间的关系,其中只有两个基本方法,就是“并”和“查”。但是这样就会的并查集删边是比较困难的,所以在删边时,我采用了两次深度优先遍历来区分重建了并查集的关系。

另外,在统计三角关系的个数功能中,我也是采用了较多人采用的动态维护方法。包括最佳伙伴,也同样采用动态维护的方法,其它的方法基本上就是实现JML要求即可。

性能问题

第一次作业中我因为没注意三人圈的方法时间复杂度,套用了双重循环,导致了时间超时。而之后采用了动态维护的方法,在添加关系的时候,检查是不是三人圈,来维护MyNetwork的一个属性

第二次作业中再求tag中value的和中,我又是套用了双重循环,导致再次超时。我调整了遍历方法,遍历节点的相邻节点,降低了时间复杂度。

规格是保证这个方法在功能上的正确性,同时保证对于其他属性的影响。打个比方来说,就是火车一定要保证自己是按照铁轨来行驶的,并且保证能够将乘客送到目的地,这是它必须要符合的规格,但是具体的速度,取决它是普通火车还是动车,这是实现层面上所需要做的事。

Junit测试

通常Junit是针对某个方法来进行测试的,那么有了方法的JML规格,我们就可以更方便的进行测试。

比如通过Junit对于正确性的要求来针对正确性做出检测。针对JML对于其他变量的修改权限来进行检测。

可以通过调整方法来获得正确答案,或者手动构建出应该有的答案,通过断言语句来判断是不是结果与要求一致。

学习体会

JML这一单元相对于多线程的工作量明显减少,而且debug的时间也明显缩短,这一部分原因是代码量减少,更重要的是JML为我们提供了标准,这不仅让写代码的过程更加简单,也使debug时间明显缩短,各个方法各司其职,井然有序。通过这一单元的学习,我不仅仅掌握了JML,而且也发现了自己在写代码时的粗心大意等问题,包括构建层次时的技巧等等。总的来说,这一单元的学习还是使我的代码能力有了很大的提升。

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值