OO_Unit3_Blog—21374235

樊金鹏-21374235 2024-05-16 14:33:15

OO_Unit3_Blog


本单元测试过程 :

本单元除了需要理解层次化设计,去设计好自己的社区,还需要自己去编写三次Junit的测试,因为之前没接触过Junit,所以要从一开始去了解Junit的原理,从哪里去构造数据,通过三次设计虽然遇到了很多困难,也是稍微掌握了一部分Junit的评测。

黑箱和白箱测试 :

黑箱测试:

  • 定义:黑箱测试是一种软件测试方法,测试者不需要了解程序的内部结构或代码。测试基于功能需求进行,重点是软件系统的输入和输出。
  • 方法:测试者通过系统的功能需求来设计测试用例,检查软件是否按预定功能正常工作。例如,如果一个应用允许用户登录,测试者会尝试使用有效和无效的凭证来看系统是否能正确处理。
  • 优点:可以由非开发人员进行,侧重于用户体验和功能完整性。
  • 缺点:可能会遗漏一些内部错误,因为它不考虑程序的内部逻辑。

白箱测试:

  • 定义:白箱测试也被称为透明盒测试或结构测试,测试者需要了解程序的内部结构和代码。

  • 方法:测试者基于代码的内部逻辑设计测试用例,检查程序的内部操作是否按照规定执行。这包括测试程序的所有分支、循环和内部组件。

  • 优点:可以发现代码内部的逻辑错误,提高代码覆盖率。

  • 缺点:测试过程复杂,需要深入的编程知识,且通常只能由开发者执行。

    单元测试:

  • 单元测试是软件测试的一种类型,专注于验证单个程序、类、方法或函数是否能按预期工作。它是在软件开发过程中非常重要的一环,因为它有助于及早发现错误和问题,从而降低修复成本

    功能测试:

  • 功能测试是一种软件测试方法,旨在验证软件系统的功能是否符合规格说明书或用户需求。测试人员通过输入预定义的输入,检查系统的输出是否符合预期,并确保系统在各种情况下都能正确运行。

    集成测试:

  • 集成测试是软件测试的一种类型,其目标是验证不同模块或组件在整体系统中的集成是否正常工作。测试人员通过将已经单独测试过的模块组合在一起,检查它们的交互是否如预期,并确保系统各部分之间的通信和数据传递没有问题。

    压力测试:

  • 压力测试是一种评估软件在高负载或极限条件下性能的测试方法。它用于确定系统的稳定性和可靠性,通过增加资源消耗如CPU、内存、网络流量等,测试系统在压力条件下的响应时间和承载能力。

    回归测试:

  • 回归测试是在软件发生更改(如修复缺陷或添加新功能)后进行的测试,以确保这些更改没有意外影响到软件的其他部分。这种测试确保新的代码更改没有破坏原有的功能,并且整个应用仍按照预期工作。

    数据构造策略:

  • 随机生成 。

  • 控制图的稠密程度,通过控制人数

  • 考虑边界条件,通过助教团队专门设置的检测点。

    架构设计

    基本设计 :基本在JML的划定架构,只有一部分为了实现方法而特定规划的架构。

    主要架构:

  • __并查集__:

    public class Community { //完全在操作persons的id的数
      private boolean ifrebuild;
      private HashMap<Integer,ArrayList<Integer>> connect = new HashMap<>();//用于存放边
      private ArrayList<Integer> persons = new ArrayList<>(); // 用于存放所有的id
      private HashMap<Integer,Integer> parents; //用于存放所有人的父节点的id
    
      private int blocksum; // 联通图数量
    
      public Community() {
          parents = new HashMap<>();
          blocksum = 0;
      }
    
      public int getBlocksum() {
          return blocksum;
      }
    
      public void addPerson(Integer id) {
          persons.add(id);
          parents.put(id,id);//父节点是自己
          blocksum++; //每加一个节点多一个连通图
          ArrayList<Integer> linked = new ArrayList<>();
          connect.put(id,linked);
          ifrebuild = false;
      }
    
      public void linkincrease(Integer id1,Integer id2) {
          connect.get(id1).add(id2);
      }
    
      public void linkdelete(Integer id1,Integer id2) {
          connect.get(id1).remove(id2);
          connect.get(id2).remove(id1);
      }
    
      // 查找根节点
      public int findroot(int id) {
          if (parents.get(id) != id) {
              parents.put(id, findroot(parents.get(id)));
          }
          return parents.get(id);
      }
    
      // 合并两个集合
      public void union(int id1, int id2) {
          if (!ifrebuild) {
              linkincrease(id1,id2);
          }
          int rootX = findroot(id1);
          int rootY = findroot(id2);
          if (rootY == rootX) {
              return;
          } else {
              parents.put(rootY,rootX);
              blocksum--;
          }
      }
    

    并查集是一种数据结构,用于处理一些不交集的合并及查询问题。它支持两种操作:查找(Find)和合并(Union)。通过查找操作,我们可以确定某个元素属于哪一个子集;通过合并操作,可以将两个子集合并为一个集合。
    这种数据结构常常用于处理一些网络连接、图的连通分量等问题,因为它可以快速判断两个元素是否属于同一个集合,并且能够快速地合并集合。并查集通过一些优化算法(如按秩合并和路径压缩)可以提高效率,从而在实际应用中表现出较好的性能。

  • 动态维护:
    在本次作业中,使用了大量的动态维护,在刚开始第一次作业的时候,因为使用了大量的脏位导致了大量的超时,而在第二次作业中全部修改为动态维护,其实后来才发现需要维护脏位的地方全都是动态维护需要的地方,还不如一开始就使用动态维护(。

  • 双向bfs:
    在讨论区学会的一种双向Bfs方法,完美的解决了第二次作业求最短路径的问题。

  • queryCoupleSum:
    为什么这里单独把他拿出来讲,因为我觉得我的实现方式真的很麻烦,需要考虑的情况太多了,以下是cp的维护方式:
    ``` public void remoteCouple(int id1, int id2, Integer oldbest1, Integer oldbest2) {

      MyPerson p1 = (MyPerson) getPerson(id1);
      MyPerson p2 = (MyPerson) getPerson(id2);
      int newbest1 = p1.getbestAcquaintance();
      int newbest2 = p2.getbestAcquaintance();
      MyPerson old1 = (MyPerson) getPerson(oldbest1);
      MyPerson old2 = (MyPerson) getPerson(oldbest2);
      MyPerson new1 = (MyPerson) getPerson(newbest1);
      MyPerson new2 = (MyPerson) getPerson(newbest2);
    
      if (old1 == new1 && old2 == new2) {
          return;
      } else {
          if (Objects.equals(new1,p2) && Objects.equals(new2,p1)
                  && (!((Objects.equals(old1,p2)) && (Objects.equals(old2,p1))))) {
          }
          if ((!Objects.equals(new1,p2) || !Objects.equals(new2,p1))
                  && (Objects.equals(old1,p2)) && (Objects.equals(old2,p1))) {
          }
    
          if (!Objects.equals(new1,old1)) {
              if ((!Objects.equals(old1,null)) && old1.getbestAcquaintance() == p1.getId()
                      && old1.getId() != p1.getId() && old1.getId() != p2.getId()) { 
              }
              if (new1.equals(p2)) {
              } else { 
                  if (new1 != null && new1.getbestAcquaintance() == p1.getId()
                      && new1.getId() != p1.getId()) { 
                  }
              }
          }
    

    性能问题及修复情况 :

    性能问题 :

    总的来说,这三次作业都有大大小小的瑕疵,前两次可以接受是因为没有使用正确的维护方式而导致的超时问题,第三次难以接受,是因为自己在将脏位维护改为动态维护的时候,有一个地方改了但没有实现,结果好像是因为是前两次作业的考察点,第三次作业反而没有考察出来。

    修复情况 :

    全部修复。

    Juint测试 :

    数据生成采用随机方式 ,据测试次数改变图的稠密程度,使用影子容器保留之前之后的数据,及算理论值,比较理论值和调用方法的返回值,同时检查后置,整个过程比较简单,就是覆盖方面需要多考虑一些。

    本单元学习体会 :

    通过学习一门规范化语言体会到了这种语言的重要性, JML确实是一种较为规范的语言,但好像使用率不高?网上搜搜都是只有关于北航的OO作业的帖子,JML语言只能限制代码的功能,但无法直接给出代码的实现,所以具体的性能取决于实现代码的具体方式,但无论如何,最后的功能一定在JML限制的范围内。学习JML语言的最大的体会便在此处了。

...全文
46 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文围绕“多主体综合能源系统+分布式ADMM研究”展开,系统阐述了交替方向乘子法(ADMM)在多主体综合能源系统中的分布式优化应用,提供了完整的Matlab代码实现。研究聚焦于多利益主体之间的协同优化问题,通过建立合理的数学模型,采用ADMM算法实现去中心化的求解架构,有效保障各主体的数据隐私性与决策自主性,同时提升整体系统的计算效率与优化性能。内容涵盖系统建模、优化问题分解、ADMM迭代求解流程、收敛性验证及结果分析,具有较强的理论深度与工程实践价值,适用于能源互联网、微电网群、园区综合能源系统等复杂场景的能量管理与协调调度。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的研究生、高校科研人员,以及从事综合能源系统规划、微电网优化、分布式能源管理等方向的工程技术人员。; 使用场景及目标:①应用于多主体参与的综合能源系统能量管理与协同优化调度;②帮助读者深入理解ADMM算法的分解-协调机制及其在分布式优化中的具体实现,支撑高水平学术论文复现、科研课题攻关或实际工程项目开发;③推动智能电网与能源互联网中去中心化、隐私保护型优化调度技术的发展与落地; 阅读建议:建议读者结合文中提供的Matlab代码进行动手实践,逐行调试并可视化关键变量的迭代过程,深入掌握ADMM算法的参数设置、收敛判据及数值稳定性处理技巧,并尝试将其拓展至电动汽车集群调度、多微电网互动、可再生能源消纳等其他分布式优化应用场景中进行仿真验证。

301

社区成员

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

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