301
社区成员
发帖
与我相关
我的任务
分享本单元除了需要理解层次化设计,去设计好自己的社区,还需要自己去编写三次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()) {
}
}
}
总的来说,这三次作业都有大大小小的瑕疵,前两次可以接受是因为没有使用正确的维护方式而导致的超时问题,第三次难以接受,是因为自己在将脏位维护改为动态维护的时候,有一个地方改了但没有实现,结果好像是因为是前两次作业的考察点,第三次作业反而没有考察出来。
全部修复。
数据生成采用随机方式 ,据测试次数改变图的稠密程度,使用影子容器保留之前之后的数据,及算理论值,比较理论值和调用方法的返回值,同时检查后置,整个过程比较简单,就是覆盖方面需要多考虑一些。
通过学习一门规范化语言体会到了这种语言的重要性, JML确实是一种较为规范的语言,但好像使用率不高?网上搜搜都是只有关于北航的OO作业的帖子,JML语言只能限制代码的功能,但无法直接给出代码的实现,所以具体的性能取决于实现代码的具体方式,但无论如何,最后的功能一定在JML限制的范围内。学习JML语言的最大的体会便在此处了。