OO UNIT3 单元总结

22373036-沈胡青 学生 2024-05-17 10:54:37

OO U3 总结

一、前言

本单元的学习内容主要是面向JML规格的程序实现,需要我们理解JML的语言,根据前置条件、后置条件和约束条件等编写代码以及对应的junit。

根据JML指导书学习这个语言之后,感觉理解上难度并不大,它提供给了约束条件以及实现的目标,而具体的实现方法就要自己决定了,所以这就涉及到了性能优化,所以对时间复杂度的考虑在这一单元非常重要。

二、架构分析

hw9

uml类图

 

基于jml的限制,我容器选择为HashMap,主要是为了搜查时的方便,然后对于hw9的指令如qci,qbs,引入了并查集,并查集主要支持两种操作支持两种操作:

  • 合并(Union):把两个不相交的集合合并为一个集合。

  • 查询(Find):查询两个元素是否在同一个集合中。

    并查集的重要思想在于,用集合中的一个元素代表集合。并查集最终一个树状的结构,要寻找集合的代表元素,只需要一层一层往上访问父节点,直达树的根节点。对于blockSum和triSum,我用动态维护实现,即在增删关系时,调用并查集中的方法,判断是否需要增减,这个思想在这一单元很重要,后续的迭代需要在这一方面进行优化

hw10

uml类图

 

这次作业新增了MyTag类,并据此增加了以下功能

add_tag person_id(int) tag_id(int)
del_tag person_id(int) tag_id(int)
add_to_tag person_id1(int) person_id2(int) tag_id(int)
del_from_tag person_id1(int) person_id2(int) tag_id(int)
query_tag_value_sum person_id(int) tag_id(int)
query_tag_age_var person_id(int) tag_id(int)
query_best_acquaintance id(int)
query_couple_sum
query_shortest_path id1(int) id2(int)

uml类图

 

query_tag_value_sum person_id(int) tag_id(int)
query_best_acquaintance id(int)
query_couple_sum
query_shortest_path id1(int) id2(int)

其中比较难维护的有以上四个指令,

query_tag_value_sum 我一开始用的双重循环,在强测中ctle了,之后,我选择遍历person的acquaintance,减少了遍历的数目

query_best_acquaintance我选择了tree结构,每次增加时,把value最大的放在根节点,最后求bestAcquaintance时,只要选择根节点对应的就好,query_couple_sum时间复杂度为o(n),遍历所有人,找出他们的bestAcquaintance,然后再找出bestAcquaintance的bestAcquaintance,判断是不是自己,bestAcquaintance我用的时双向dfs。

hw11

这次作业主要增加的是发送邮件的功能,整体来说比较简单,但我有个很大的bug没有考虑到,就是发送给tag时,没有考虑tagsize是否为0,造成强测wa了一片

uml类图如下

 

三、测试分析

1、黑箱测试,白箱测试

黑箱测试

黑箱顾名思义不关心程序内部的逻辑结构。只知道软件的输入和应有的输出,而不了解程序内部如何操作和实现这些输出。

特点与方法:

  • 输入和输出:测试关注输入和期望的输出,检查程序对各种输入的处理能力。

  • 无需编程知识:执行黑箱测试的测试人员不需要了解编程或系统内部结构。。

白箱测试(White Box Testing)

白箱测试,又称为结构测试或透明盒测试,主要关注于软件内部逻辑和程序结构的正确性。这种测试需要测试人员对应用程序的内部工作原理有深入的了解,包括代码、架构、逻辑和内部API等。

特点与方法:

  • 代码透明:测试人员需对代码有完整的了解,能够直接访问代码。

  • 逻辑验证:关注程序逻辑、循环、内部数据结构等,确保内部操作的正确性。

  • 高覆盖率:使用如代码覆盖技术等方法来确保测试尽可能多的代码路径。

  • 多种测试:包括单元测试、集成测试等,通常由开发人员自行进行。

黑箱测试和白箱测试在测试策略和目的上有很大的区别,它们各自适用于不同的测试阶段和目标。一般来说,黑箱测试更侧重于软件的外部行为和用户交互,而白箱测试更侧重于软件的内部质量和结构。两者结合使用可以提高软件的整体质量和可靠性。

2、单元测试、功能测试、集成测试、压力测试和回归测试

单元测试(Unit Testing)

单元测试是在软件开发过程中最底层的测试阶段,主要针对程序中的最小可测试单元(通常是函数或方法)进行验证。

特点与方法:

  • 目标明确:测试的目的是验证每个单元是否按照设计正确执行其功能。

  • 自动化程度高:单元测试通常由开发者编写,可以利用自动化测试框架如JUnit、NUnit进行。

  • 早期缺陷发现:由于在开发早期进行,有助于及时发现并修正错误,减少后期维护成本。

功能测试(Functional Testing)

功能测试是基于业务需求的测试,主要验证软件的各个功能是否符合用户的具体需求和预期。

特点与方法:

  • 用户视角:从用户的角度出发,测试各项功能是否按照需求文档执行。

  • 黑箱测试方法:通常不需要了解内部逻辑,只关注输入与输出。

集成测试(Integration Testing)

集成测试主要检查多个模块或单元组合在一起时的协作和数据交互是否正常。

特点与方法:

  • 接口关注:重点测试模块间接口的数据传递和任务协调机制。

  • 逐步扩大范围:可以从小规模开始,逐步扩展到全系统。

压力测试(Stress Testing)

压力测试主要是为了测试软件在超出正常操作范围或极限条件下的表现。

特点与方法:

  • 极限条件:模拟高负荷或资源限制的情况,观察软件的响应和稳定性。

  • 发现潜在问题:如内存泄露、同步问题、性能瓶颈等。

回归测试(Regression Testing)

回归测试用于确保新代码的添加或现有代码的修改没有引入新的错误或破坏原有功能。

特点与方法:

  • 重复性测试:在每次代码更新后进行,确保修改未引入新问题。

  • 自动化程度高:通常通过自动化测试工具进行,以覆盖所有关键功能。

3、数据构造策略

由于本单元的测试样例条数过多,采用自动化构造,但在构造时,可以增加查询的数目,并且将查询放在修改这个答案后,以此测试代码是否优化完善。

4、Junit测试方法

在开始使用JUnit进行单元测试时,会感到一些困惑,但实际上,我们可以借鉴JML的逻辑来构建测试用例。JML通过明确地定义方法的前置条件和后置条件来指定程序的行为。在编写JUnit测试时,可以针对这些前置条件进行检查,确保在执行测试的方法之前,这些条件已经被满足。同样,我们也应该验证方法的后置条件,确保方法执行后的状态符合预期。此外,通过对每个方法的实现进行逐一的测试,可以更系统地覆盖代码,并保证代码的正确性。

四、学习体会

本单元主要是理解jml即“契约式编程”的含义,然后根据jml来实现自己的代码,比较重要的一点就是规格与实现分离,基于此我们需要进行性能上的优化,比如容器选择,算法选择,动态优化等等,在这一单元还有重要的知识就是图论,通过结合JML和图论,可以在确保代码符合规格的基础上,进行高效的数据处理和分析。例如,可以使用并查集快速处理分组和联通性问题,使用DFS解决复杂的路径和匹配问题。在实现这些算法时,通过JML可以确保算法实现的正确性和性能效率。

...全文
69 回复 打赏 收藏 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

301

社区成员

发帖
与我相关
我的任务
社区描述
2023年北航面向对象设计与构造
学习 高校
社区管理员
  • YannaZhang
  • CajZella
  • C_ecelia
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧