301
社区成员
发帖
与我相关
我的任务
分享title: 大二下面向对象设计与构造课程总结-3
黑箱测试
黑箱测试即功能测试,主要用于检测软件的每一个功能是否可以正常使用,在测试中,我们将软件程序看作一个不可开启的黑箱,在不考虑软件程序内部的结构与特性的基础上对软件接口进行测试,进而检查程序功能是否按照相应的设计需求和规定正常打开使用
白箱测试
白箱测试即结构内部测试,用于检测软件编码内部的具体错误,即检查编码质量和内部正确性
单元测试
对软件基本组成单元进行测试,如具体到函数或者方法,单元具备一些基本的属性,例如明确的功能、规格定义、明确的与其他部分的接口定义等等,使其可以清晰地与同一程序的其他单元划分开来
功能测试
类似于黑盒测试,基于测试样例,确保样例结果与设想一致即可
集成测试
将软件集成起来后进行测试,又叫子系统测试、组装测试、部件测试等,集成测试主要是针对软件高层设计进行测试,一般来说是以模块和子系统为单位进行测试,主要是测试接口之间的关系
压力测试
压力测试,也称为强度测试、负载测试。压力测试是模拟实际应用的软硬件环境及用户使用过程的系统负荷,长时间或超大负荷地运行测试软件,来测试被测系统的性能、可靠性、稳定性等,其中时间和空间方面的性能考察为主
回归测试
在软件项目中,开发人员在修改了软件的代码以修复已经发现的bug后,测试人员在需要重新测试前面已经测试过的内容,以确认此次修改没有引入新的错误。 也就是说,回归测试的目的就是检查开发人员在修复已有bug时是否又导致了新的bug,即重点检测代码的修改是否正确且有效
数据构造策略
在本单元中,测试样例的构造主要是基于JML的规格要求,并且需要测试到exceptional_behavior,除此之外的构造策略与前面的单元并无太大差别,仅需保证能覆盖到所有的功能和特殊情况即可,评测机随机嗯造就完事了
图模型构建
对本单元的社交网络架构图,我主要采用了并查集来作为图模型的构建结构,即通过创建和维护各个元素的根节点来减少如qci等操作时的时间开销,进而保证总体软件架构的性能,根节点这一单一变量的创建可以帮助我们更加高效的得知两个元素之间是否具有路径,即他们是否可以构成圈,因此在维护并查集的过程中,我们需要着重考虑当关系创建和删除时对应产生的合并与断联的操作,值得一提的是,当涉及到并查集的合并时,我们需要检查两个并查集的秩,并将秩较小的并查集并入到秩大者,从而进一步提高性能
public static void merge(MyNetwork myNetwork, int id1, int id2) {
MyPerson father1 = myNetwork.getPerson(id1).getFatherNode();
MyPerson father2 = myNetwork.getPerson(id2).getFatherNode();
int rank1 = father1.getRank();
int rank2 = father2.getRank();
if (rank1 > rank2) {
father2.changeFatherNode(father1);
} else if (rank1 < rank2) {
father1.changeFatherNode(father2);
} else {
father2.changeFatherNode(father1);
father1.rankPlus();
}
}
public static void cut(MyNetwork myNetwork, int id1, int id2) {
HashSet<MyPerson> union = new HashSet<>();
bfs(myNetwork, id1, union);
for (MyPerson person : union) {
person.changeFatherNode(myNetwork.getPerson(id1));
}
myNetwork.getPerson(id1).setRank(2);
if (union.contains(myNetwork.getPerson(id2))) {
return;
}
myNetwork.addBlockSum();
union.clear();
bfs(myNetwork, id2, union);
for (MyPerson person : union) {
person.changeFatherNode(myNetwork.getPerson(id2));
}
myNetwork.getPerson(id2).setRank(2);
}
数据维护策略
在本单元中,有相当一部分的查询操作如果采用实时计算的策略时会有过大的时间开销,因此我们需要适时采用动态维护策略,例如其中的qts、qbs等,均需要我们在添加或修改元素关系时对相关变量进行维护,而在研讨课中我也学习到了在软件编程中脏位的使用,如查询tag内的平均年龄这一操作,便可以适时利用好脏位,来进一步地提高其性能,而当并查集的分离发生时,我们则是需要使用bfs或者双向bfs来获取到可能产生的新连通图
综上可知,对于规格的解读和实现实际上并不一定需要一对一的实现,我们可以通过更加高效有力的算法来摆脱简单且费时的低级遍历,而这中间的转变和提高正是我们作为编程者需要不断思考与精进的部分
Junit测试与规格信息的利用在该单元中,我们需要利用好规格中的相应信息来配对Junit的测试,其中我们需要重点关注的不只是我们需要达到的输出匹配,我们更需要关注到一个方法或操作是否会带来规格之外的副作用,此时我们便需要对一个单元或者与其关联单元的其他元素进行检查,进而保证我们实现的功能不会产生无法挽回的错误,而JML的规范性要求则是恰恰帮助了我们对这一部分的维护思路进行完善,例如not assignable关联的变量我们便需要重点关注
本单元的难度较低,总体来说是在引导我们对于JML进行相对初步的了解与探索,而对于我而言,该单元亦帮助我精进了我对于代码架构的了解和探知,使我得以从更加具体、更加性能化的角度看待自己的代码架构,同时在该单元中,我们也复习到了相应算法的实现和使用场景,总地来说还是比较充实且受益匪浅的一个月