OO第三单元博客总结

OO第三单元博客总结

一、分析本单元的测试过程

1.对黑箱测试、白箱测试的理解

​ 对于黑箱测试,测试的参照物只有JML,主要检查程序功能是否按照需求规格说明书的规定正常使用,以及程序是否能适当地接收输入数据并产生正确的输出信息的同时保持外部信息的完整性。黑箱测试主要发现基于规格说明的功能错误、行为错误、性能错误等,在本单元中表现为基于JML编写特定方法的单元测试。

​ 对于白箱测试,其具有很强的透明性,能够覆盖所有可能的代码路径和逻辑分支,达到全方位测试的目的。由于白箱测试基于软件代码结构和设计原则进行分析和测试,在本单元中可以通过测试方法覆盖率、分支覆盖率更指标进行不漏的测试,有利于发现代码中潜在的问题。

2.对单元测试、功能测试、集成测试、压力测试、回归测试的理解

​ 对于单元测试,其测试目标是代码中可被测试的最小单位,具有自动化、独立性、可重复性和可测量性等特点。在本单元的测试中,结合课程组提供的JML规格,用”低效但保证正确性“的测试代码来测试”高效但正确性不保证“的实现代码,使代码运行时兼具高效性、正确性。

​ 对于功能测试,其更侧重于产品使用的实际功能需求,根据产品特性、操作描述和用户方案,确保软件按照预期的方式运行。在本单元的测试中,由于功能测试按照需求编写测试用例的特点,其测试数据编写较为简单,但达到一定测试强度比较难,且相较单元测试而言,得到错误输出后难以分析错误原因,因此我只将它作为对代码正确性的最终、整体的评测。

​ 对于压力测试,可以了解代码的可靠性、性能瓶颈等以及具体的耗时部位,为提高代码的可靠性、稳定性,减少系统的宕机时间带来新思路。在本单元中,由于一些算法优化问题,往往会带来超时的后果,此时可以设计出允许范围内最极限的测试情况(如mod型命令和query型命令交替出现)对代码进行性能测试,同时可以观察到时间消耗的主要原因。

​ 对于回归测试,可以确保新的更改没有产生新的错误或导致现有功能的中断。本单元的测试中,回归测试被运用得最为广泛,虽然看起来任务量变大了,但其避免了错误的反复出现,从项目测试整体过程来说提高了测试的效率。

3.数据构造策略

​ 本单元的测试任务中,我使用了自动化生成测试数据的构造思路,同时在进行单元测试时,会对随机生成的数据进行一定分类,例如单数测试使用稠密图、双数测试使用稀疏图,以及规定图的大小、图中必须出现某种结构等。这种分类测试的实现需要对随机生成步骤进行规范操作。此外,我还使用了参数化测试方法减少了测试代码的代码量。

二、梳理本单元的架构设计,分析自己的图模型构建和维护策略

本单元代码平面结构如下:
在这里插入图片描述
如图所示:

​ 抛出错误相关的有:接口MyException、类My__Exception系列

​ 功能实现相关的有:MyPerson、MyNetwork、MyTag、My__Message、Runner系列等

​ 就架构设计而言,由于本单元开发基于JML,因此在架构设计上个人发挥的并不多,主要是方法层面上的性能优化。唯一由本人独立设计的MyException方法,为My__Exception系列方法提供了全局的数据存储、读取和修改功能从而实现了报错时序号的延续、对每个Id错误产生次数的统计等功能。

除此以外,就是课程组规定的Tag、Person、Network、Message接口,各个接口方法均符合单一职责原则,如Tag只负责管理群组,Person只负责记录个人的社交关系等,且在各种功能间实现了接口隔离。MyMessage作为父类,和My__Message系列之间满足里氏替换原则,且其体现了依赖倒置原则:抽象不应该依赖于细节,细节应当依赖于抽象。对于后续加入的各种新种类的Message,其可以直接通过Message接口实现统一的管理调用。

三、作业中出现的性能问题及其修复情况,对规格与实现分离的理解

作业中出现的性能问题主要分为两个方面:

1.查询操作对计算量需求较小,但查询密集的方法

使用设计脏位的办法解决,难点是将每一个数据可能改变的点位都纳入考量,做到不重不漏。

2.查询操作对计算量需求较大的方法

使用动态维护的办法解决,难点是如何设计最佳存储结构以减小每一次动态维护的成本。

关于对规格与实现分离的理解:

规格只是功能的规范叙述,用以确保开发者对方法的需求有统一、明确的理解。可以说,规格是介于模糊的自然语言和严格的代码实现的一个中间层,起到过渡的作用。

当实现细节与规格分开时,开发人员可以专注于如何实现给定的需求,而不必担心需求的变更或模糊性,使开发者可以更高效、专注地完成代码开发的工作。同时,通过清晰的规格定义,我们还能轻松地发现可重用的组件和库。这些组件和库可以在不同的项目中使用,只需确保它们满足相同的规格即可。此外,规格文档还可以作为测试的依据,确保软件的实际行为与预期的行为一致,例如本单元中的随机生成类单元测试的标准答案即是以此思路构建。

总而言之,规格与实现分离有助于提高软件的可维护性、可重用性和可扩展性。

四、本单元中同学们实现了Junit测试方法,总结分析如何利用规格信息来更好的设计实现Junit测试,以及Junit测试检验代码实现与规格的一致性的效果

1. 利用规格信息设计JUnit测试

  1. 利用规格信息明确测试目标:根据规格信息,可以明确需要测试的功能点(/@ pure @/、assignable)、边界条件(normal_behavior、requires)和异常情况(exceptional_behavior、requires)。这有助于确保测试覆盖了所有重要场景。
  2. 利用规格信息中的实现方法得出测试用例的标准答案:我们可以直接用JML中的方法得出标准答案,保证正确性的同时无需顾及性能。
  3. 使用断言:在测试用例中,使用JUnit的断言方法来验证代码的实际输出是否与规格中的期望输出(ensures)一致。断言可以帮助我们捕获代码中的错误。

2. JUnit测试检验代码实现与规格一致性的效果

​ 规格为JUnit测试的标准答案生成提供了重要参考。在代码实现时,为确保性能提升,我们往往不能直接用JML规格上的方法实现我们的逻辑。但在单元测试中,我们无需顾及性能的优劣,只需保证测试标准答案的正确性。此时我们可以直接用JML中的方法实现。

​ 此外,规格中的/@ pure @/、assignable、requires等关键字也为我们检测环境中的不变量指明了方向,无需我们再参考总体的代码对其进行推测,节省时间的同时减少了错误发生的概率。

五、本单元学习体会

在本单元中,我们接触了JML这一工业化规格叙述方式,实践了在JML指导下开发项目文件、编写项目测试。通过这些学习和实践,让我对工业化的项目设计与构造方法有所了解,为以后的工作和实习打下了坚实基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值