OO第三单元博客作业

yplqing 学生 2024-05-18 15:45:02

本单元的测试过程

  • 对各种测试的理解:

    • 黑箱测试是一种测试方法,测试人员不需要了解软件系统内部的工作原理和代码结构,只需关注输入和输出之间的关系。黑箱测试主要关注软件功能是否符合需求,以及是否能够正确处理各种输入情况。测试人员通过给定的输入数据,检查系统的输出是否符合预期,从而验证软件的功能是否正常。

    • 白箱测试则是基于对软件系统内部结构的了解进行的测试。测试人员需要查看软件的源代码、设计文档等信息,以便设计测试用例。白箱测试主要关注软件的逻辑路径、条件覆盖等内部细节,以确保软件在各种情况下都能正确执行。

    • 单元测试是针对软件中的最小单元进行的测试,通常是函数、方法或类。它旨在验证每个单元的功能是否按预期工作。

    • 功能测试是测试软件的功能是否符合用户需求和规范要求。它主要关注用户能够如何使用软件以及软件是否能够正确地执行其设计的功能。

    • 集成测试是将各个单元或模块组合在一起进行测试,以确保它们在集成后能够正常工作。它关注不同模块之间的接口和交互是否正确。

    • 压力测试是测试软件在负载增加的情况下性能是否能够正常。它通过增加并发用户、数据量或请求负载来模拟高负载情况,以评估软件的性能极限和稳定性。

    • 回归测试是在软件发生变更后重新运行之前的测试用例,以确保新的更改没有破坏软件的现有功能。它有助于捕捉因更改引入的错误和不一致性。

  • 数据构造的策略:

    • 随机生成指令序列
      • generate函数是生成指令序列的入口。根据不同的概率分布,调用不同的数据生成函数。
    • 生成人员信息
      • generate函数调用normal_data函数或extend_data函数来生成人员信息。
      • normal_dataextend_data函数都会调用person_instr函数来生成个体的人员信息,包括添加人员指令和添加标签指令。
    • 生成消息信息
      • generate函数调用generate_message函数来生成消息信息。
      • generate_message函数生成各种类型的消息,包括普通消息、红包消息、通知消息和表情消息,调用message_instr函数生成对应的指令。
    • 生成关系信息
      • 在生成人员信息的过程中,会调用read_relation函数来获取人员之间的关系,保证生成的消息具有合理的发送者和接收者关系。
    • 其他信息的生成
      • normal_dataextend_data函数会调用locate_tag函数来生成标签信息,它们的不同点是前者1个tag只包含1个人,后者1个tag包含多个人
      • 在各种数据生成函数中,会生成指令所需的参数。

本单元的架构设计

  • 图模型构建策略:采用邻接表的实现方式,为了方便查找,具体使用以 id 为键的 HashMap 实现。

  • 图模型维护策略:尽量维护所有直接计算复杂度高于 O(n) 的结果,有些 O(n) 的结果降为 O(1)

    • query_value:查询两点连边的权值

      维护策略:使用 HashMap 维护,直接返回通过 id 查得得结果

    • query_circle:查询两个点是否连通

      维护策略:使用并查集方法,并使用按秩合并和路径压缩优化;在删边时,从其中一个端点 DFS ,将遍历到的点的根都设为那个端点,若没有遍历到另一个端点,说明这两个点不再连通,要从另一个端点 DFS ,重新设置遍历到的所有点的根

    • query_block_sum:查询连通块的个数

      维护策略:加点时增加,给不连通两点加边时减少,删边后两端点不再连通则增加。

    • query_triple_sum:查询3元环的个数(类似三角形)

      维护策略:加边时若两端点有共同邻居就增加,删边时若两端点有共同邻居就减少;注意此时可以记录之前的 tripleSum 的值,若此值变化,说明两端点仍然连通,不需维护并查集

    • query_tag_age_var:查询标签所包含的人的年龄方差

      维护策略:给标签加人和删人时,维护年龄的总和,查询时遍历人通过公式得出结果

    • query_best_acquaintance:查询与某点连边权值最高的点

      维护策略:使用 TreeMap<Integer, PriorityQueue<Integer>> valueMap 维护,键是连边的权值 value,值是同一 value 值按照 id 从小到大排序的队列,查询时直接返回第一个 id 即可

    • query_tag_value_sum:查询标签所包含的人的连边的权值之和

      维护策略:在 MyTag 中新增脏位,在 MyPerson 中新增 HashMap<String, Tag> tagsContainThis 属性,就是为了方便 Tag 和 Person 能双向查找,迅速准确设置对应 Tag 的脏位;查询时,若脏位为真则完全重新计算,否则直接返回之前的结果。

本单元出现的性能问题

  • 性能问题:计算 tagValueSum 时,如下方法要计算 n^2^ 次:

    public int getValueSum() {
        int valueSum = 0;
        for (Person person1 : persons.values()) {
            for (Person person2 : persons.values()) {
                if (person1.isLinked(person2)) { valueSum += person1.queryValue(person2); }
            }
        }
        return valueSum;
    }
    

    转换成数组只需要计算 n(n - 1) / 2 次:

    public int getValueSum() {
        int valueSum = 0;
        ArrayList<Person> values = new ArrayList<>(persons.values());
        int size = values.size();
        for (int i = 0; i < size; i++) {
            Person person1 = values.get(i);
            for (int j = i + 1; j < size; j++) {
                Person person2 = values.get(j);
                if (person1.isLinked(person2)) {
                    valueSum += (person1.queryValue(person2) << 1);
                }
            }
        }
        return valueSum;
    }
    

    其他本地测试发现的性能问题:

    • HashMap 查找时,使用键查找比使用值查找快很多

    • 遍历时,调用不变对象的方法会快很多,举例如下:

      for (Person person : acquaintance.values()) {
          if (person.isLinked(target)) { cnt++; }
      }
      

      改成

      for (Person person : acquaintance.values()) {
          if (target.isLinked(person)) { cnt++; }
      }
      

      会快,因为第一种情况下,每次循环迭代,都需要在内存中加载 person 对象,并访问其相应的数据和方法,而第二种情况下,由于target对象保持不变,在内存中只需要加载一次。

  • 对规格与实现分离的理解:规格旨在帮助开发者更清晰地定义代码的预期行为,提高代码的可靠性、可读性和可维护性,就像数学中术语的定义、市场的需求,而实现有很多种具体方法,不同方法有不同的性质,总之,规格和实现不是同一批人的任务,规格和实现就会存在分离,也需要分离。

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

  • 理解规格要求:首先,要仔细阅读和理解规格文档,包括方法的前置条件、后置条件和类的不变量等。确保对要实现的功能和行为有清晰的认识。
  • 将规格转化为测试用例:将规格中的每一个要求转化为相应的测试用例。这些测试用例应该覆盖各种情况和边界条件,包括正常情况、异常情况和特殊情况。

本单元学习体会

看 JML 和写代码时要细心,写完要看一遍代码,而且要充分测试,否则会因为一个小错误扣很多分。

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

301

社区成员

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

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