BUAA 面向对象 第三单元 总结

BUAA 面向对象 第三单元 总结

汉口江城夜色明,灯火映,水巷情,鹦鹉洲头,轻舟共杯倾。江楼远望波连天,一抹月,照郢州。
蜀道巍巍山河秀,青城旧,路难行。锦官城中,花满旧时景。锦里游春共人伴,山水意,梦长萦。

一、分析本单元测试过程

黑箱测试与白箱测试

定义目的优点缺点
黑箱测试测试人员仅根据软件的功能需求和规格说明书进行测试。测试人员通过输入各种数据,观察输出结果是否符合预期。验证软件的正确性1.无需了解内部实现 2.从用户角度出发,发现遗漏的需求和功能 3.测试覆盖面广1.测试深度有限 2.难以覆盖所有路径 3.依赖需求文档的准确性
白箱测试测试人员需要了解软件的内部结构和实现细节,通过对代码的路径、条件、循环等进行测试,确保每条路径和分支都被执行并且没有错误。发现代码中的逻辑错误和覆盖不足的部分1. 代码覆盖率高 2.可以优化代码 3.早期发现错误1.需要技术知识 2.不符合用户视角 3.难以发现集成问题

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

单元测试

单元测试是一种最低级别的测试,针对软件的最小可测试单元(通常是一个函数或方法)进行验证。单元测试由开发人员编写和执行,目的是确保每个单元独立运行时能够按预期工作

功能测试

功能测试是一种验证软件系统是否符合功能需求的测试方法。它主要基于软件的功能规范来编写测试用例,检查各个功能是否按预期工作。功能测试不关注软件的内部实现,只关心输出是否正确

集成测试

集成测试是在单元测试之后进行的,将各个单元组合起来进行测试,验证它们在一起协同工作时的行为。集成测试的目的是发现各个模块之间的接口和交互问题,确保模块集成后的功能正确性

压力测试

压力测试是一种非功能性测试,目的是验证软件在高负载、极限条件下的性能和稳定性。通过不断增加系统的负载(如用户数量、数据量等),观察系统是否能够承受,是否会出现性能下降或崩溃等问题。

回归测试

回归测试是指在对软件进行修改(如修复缺陷或添加新功能)之后,重新运行之前的测试用例,以确保修改没有引入新的错误,并且之前的功能仍然正常工作回归测试的目的是验证软件的整体稳定性和可靠性。

数据构造策略

  • 边缘数据:构造触发边界条件(需求边缘以及数据边缘,如爆int)数据,目的是测试极端情况下正确性
  • 压力数据:针对某一时间复杂度较高的方法,构造反复调用它的数据,目的是测试时间复杂度和算法效率
  • 随机数据:依赖大规模数据,测试代码整体正确性

二、本单元的架构设计

Unit3 最终架构如图所示(根据UML即可):

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=D%3A%5COO%E6%AD%A在这里插入图片描述

图模型构建和维护策略

构建

​ 如UML中所示,本人图模型维护了一个Block类,作为一张“母图”,而对其中每一个划分“子图”给予一个Id(类似并查集,只不过不需要父节点)。

维护

​ 在每一次增删改过程中,需要检查两个节点的子图id是否一致,然后进行对应操作。同时,需要维护MyTag中的变量。

三、性能问题以及对规格与实现分离的理解

性能问题

本单元作业中未出现性能问题,按照 O ( n ) O(n) O(n)的时间复杂度(动态维护),将过于复杂的算法时间分摊到别的简单算法中即可。

规格与实现分离

规格

规格是对软件系统功能和行为的描述。它回答了**“系统应该做什么?”**的问题。规格通常以接口、抽象类、文档、契约等形式存在,明确规定了系统的输入、输出和预期行为,而不涉及具体的实现细节。

实现

实现是规格的具体化,即系统内部如何实现规定的功能。它回答了**“系统是如何做的?”**的问题。实现包括具体的代码、算法、数据结构等。

二者分离的重要性

​ 规格与实现分离是一种有效的设计原则,能够显著提高软件系统的质量和开发效率。然而,要实现这一原则,需要在定义规格时投入更多的精力,确保规格的准确性和稳定性。同时,开发团队需要建立良好的沟通机制,以确保对规格的理解一致。通过有效地应用这一原则,可以构建出更加健壮、灵活和易于维护的系统。其重要性在于:

  • 提高可维护性:当规格与实现分离时,更改系统的内部实现不会影响到外部的使用方式,只要规格不变,调用方无需关心实现的变化。
  • 增强可扩展性:通过定义清晰的规格,开发者可以轻松地替换或扩展实现,而不影响其他部分。例如,可以在不改变接口的情况下更换底层数据库。
  • 促进团队协作:在大团队开发中,前端开发者可以根据规格进行开发,而后端开发者可以独立完成实现,最后通过规格进行集成测试。
  • 支持重用性:明确的规格允许不同的实现共享同一个接口,从而实现组件的重用。例如,可以根据同一接口实现不同的日志记录机制(文件日志、数据库日志等)。

四、如何利用规格信息来更好的设计实现Junit测试

测试样例的正确性:

根据JML规格实现,我们可以直接使用JML描述的“暴力方法”,得到完全正确的输出样例。

检验自己实现方法:

我们需要理解规格中定义的不变式和契约,根据ensure,逐条检查。并且如果方法是pure,则需要检查其是否修改对象内容。

设计测试用例

  • 正向测试用例:根据规格的正常操作流程设计测试用例,验证系统在预期输入下的正确输出。
  • 边界测试用例:针对规格中提到的边界条件(如最大值、最小值、空输入等)设计测试用例,确保系统在这些情况下也能正常工作。
  • 异常测试用例:设计输入异常情况的测试用例,验证系统是否能正确处理错误输入并返回适当的错误信息。
  • 性能测试用例:如果规格中有性能要求,设计相应的性能测试用例,以确保实现满足性能需求。

五、本单元学习体会

​ 这一单元的整体工作量相比于前两个单元大大降低~(也导致了笔者五一期间疯狂出游,没怎么将时间投入其中 bushi)~, 对于图论算法的实现,也并不需要怎么构思,使用传统算法即可,并不需要大量的算法(性能)优化。但相比之下,Unit3中需要根据JML来实现,需要沉下心来每一行去分析,避免小的疏忽导致大的bug出现。同时,JML的描述并非实现方法,而是规格,需要在代码实现中理解设计与实现分离的思想。

​ 诚然JML对于代码实现有一定帮助,但我们所练习的仅仅是阅读JML的能力,对于整体架构设计(书写JML)仍然感到一些迷惑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值