OO_Unit3_JMLblog

孙雯新-22373476 学生 2024-05-18 11:55:11

测试过程

黑箱测试、白箱测试

  1. 黑箱测试
    • 也被称为功能测试或闭盒测试。
    • 测试人员仅根据软件的需求规格说明书进行测试,不关心软件的内部结构和实现细节。
    • 测试人员通过输入数据和观察输出来判断软件是否满足需求。
    • 黑箱测试主要关注软件的功能是否按照预期工作,而不关注其内部逻辑是否正确。
  2. 白箱测试
    • 也被称为结构测试、透明盒测试或开放盒测试。
    • 测试人员可以访问软件的内部结构和源代码,了解程序的逻辑结构、路径和条件。
    • 测试人员根据程序的内部逻辑来设计测试用例,检查代码中的错误。
    • 白箱测试的主要方法包括语句覆盖、判定覆盖、条件覆盖、路径覆盖等。

单元测试 & 功能测试 & 集成测试 & 回归测试

  1. 单元测试(Unit Testing)
    • 是针对软件中的最小可测试单元(如函数、模块、类等)进行的测试。
    • 单元测试通常由开发人员编写,用于验证代码单元的正确性。
    • 单元测试的目标是确保每个单元都能按预期工作,并且与其他单元隔离。
  2. 功能测试(Functional Testing)
    • 验证软件是否满足其需求规格说明书中的功能需求。
    • 功能测试通常基于黑箱测试方法,测试人员通过输入数据并观察输出来判断软件功能是否正确。
    • 功能测试可以包括正常情况测试、异常情况测试、边界条件测试等。
  3. 集成测试(Integration Testing)
    • 验证软件的不同部分(如模块、子系统等)在集成后是否能够按预期工作。
    • 集成测试通常在大规模开发或重构后进行,以确保新添加或修改的代码不会破坏现有功能。
    • 集成测试可能涉及不同开发团队之间的协作。
  4. 压力测试(Stress Testing)
    • 测试软件在超出其正常操作范围的情况下的表现。
    • 压力测试的目的是确定软件在极限条件下的性能、稳定性和可靠性。
    • 压力测试可能包括大量数据输入、高并发请求、资源限制等场景。
  5. 回归测试(Regression Testing)
    • 在修改或更新软件后,重新运行以前成功的测试用例以确保新修改没有引入新的错误,并且没有破坏现有功能。
    • 回归测试是软件开发过程中不可或缺的一部分,有助于确保软件的质量和稳定性。
    • 回归测试可以通过自动化测试工具来提高效率和准确性。

数据构造策略

  • 覆盖率测试:基于代码覆盖率构造数据,覆盖所有分支

  • 边界测试:构造最值、零、负数等数据

  • 随机生成:生成随机数据进行测试,覆盖范围更大

  • 压力测试:构造复杂的关系图,并加入大量查询指令,进行运行时间上的压力测试

架构设计

图模型构建

直接在MyNetwork类中新增容器private final HashMap<Integer, HashSet<Integer>> map;实现;key是personId,value是存储该person的accquaintanceId的HashSet

除此之外,还实现了并查集disjointSet,主要用于查询两person之间是否间接联系(即支持isCircle),同时维护blockSum和tripleSum

图模型维护

在增删person/relation时需要对图模型进行维护,特别要注意的是:对于并查集的维护,在这里可以采取脏位 + 查询时重建的方式,减小整体的时间开销

性能问题

在这次作业中出现了两个TLE的bug,第一次是因为容器选择不当,第二次是因为遍历方式不当

  1. 在对并查集进行dfs染色时,visited数组错误使用了ArrayList容器;并没有注意到visited.contains(id)是遍历查询,导致出现超时;

    修复情况:用HashSet实现visited数组

  2. queryTagValueSum时,选择了双重遍历persons数组,没有考虑到O(n^2)的复杂度会导致超时

    修复情况:内层遍历改为遍历外层person的accuqiantance

对规格与实现分离的理解:规格是指规定了要实现的功能以及副作用等,而具体实现可以有多种方法

junit

仔细阅读规格信息,对于每一条都要进行针对性的测试设计;规格包含前置条件,副作用范围,后置条件,对于这三个条件都要进行针对性的测试

学习体会

在本单元中最大的收获应该是时间复杂度分析,以及学习到了一些很精妙的图算法实现。除此之外,也深刻的意识到了充分测试的必要性,也深刻的意识到了构造全面的测试的困难性x(因为总是容易遗漏一些东西导致卡在某几个case上很久)

JML看似给出了实现方法,但是具体的实现方式还需要自己斟酌考虑;与此同时,对JML的理解需要一定时间,有一定的阅读门槛x 如果阅读不够仔细也容易出现理解错误,导致对整个函数乃至结构的理解出现偏差。

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

301

社区成员

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

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