OO第三单元作业总结

苏嘉娴-78066009 2024-05-16 17:23:39

本单元的测试过程

黑箱测试

黑箱测试是一种软件测试方法,仅根据软件的功能规格进行测试,而不需要了解其内部结构或实现细节。测试只关注输入和输出之间的关系,而不考虑软件内部的代码或算法。黑箱测试的目标是验证软件是否按照规格说明的要求正确地执行功能。通常情况下,黑箱测试侧重于用户的角度,以确保软件在实际使用中的行为符合预期。

白箱测试

与黑箱测试相反,白箱测试涉及对软件内部结构和实现细节的了解和检查。在进行白箱测试时可以查看和分析源代码、设计文档和系统架构等内部信息。白箱测试的目标是验证软件的内部逻辑是否正确,以及代码是否符合预期的标准和最佳实践。白箱测试通常用于测试代码覆盖率、路径覆盖率、逻辑覆盖率等方面,以发现潜在的错误和缺陷,并提高代码的质量和可靠性。

单元测试

单元测试用于验证代码中的各个独立单元(如函数、方法或类)是否按照预期工作。在单元测试中,程序员编写针对每个单元的测试用例,并通过运行这些测试用例来检查单元的行为是否正确。

功能测试

 

功能测试是验证软件系统的各个功能是否按照规格说明的要求正常工作。在功能测试中,测试人员根据软件的功能需求和用户预期行为,设计测试用例并执行测试,以确认系统在各种情况下都能够正确地执行其功能。

集成测试

集成测试是验证不同模块或组件在集成后是否能够正确地协同工作。在集成测试中,各个独立测试过的模块或组件被组合在一起,并进行测试以确保它们在整个系统中的交互和功能是否符合预期。

压力测试

压力测试是评估系统在特定条件下的性能表现和稳定性。在压力测试中,通过模拟用户大量访问、高负载或异常情况,测试系统在这种条件下的响应能力和性能表现。

回归测试

 

回归测试是确认对软件进行修改或更新后,已有的功能仍然能够如预期般正常工作,且新的改动没有引入新的错误或破坏已有功能。回归测试通常是在对软件进行修复缺陷、增加新功能、进行代码重构或进行其他修改之后进行的。

架构设计

 第9次作业

第九次作业的要求是通过给定的JML规格实现Person类与Network类以及四个异常类。第一次作业的难度不高,只要认真阅读jml规格完成作业是、基本上是没什么问题的。因此第一次作业基本是按照JML规格去写代码,导致了出现ctle的情况。

isCircle方法是查询两点是否联通,采用的算法是bfs算法。而queryBlockSum()方法和queryTripleSum()方法则直接根据jml规格写,出现ctle也是因为这两个方法没优化。

Bug修复

主要是对queryBlockSum()方法和queryTripleSum()方法进行优化,采用的是并查集的方式进行动态维护。增加了两个成员变量blockSum和TripleSum在遇到addPerson()、modifyRelation()和addRelation时对改成员进行维护。这样大大提升了性能,也避免使用双重循环。

第10次作业

第二次作业相比于第一次作业,增加了Tag接口和四个异常类。

在MyNetwork中,queryShortestPath()方法是最短路径查询,采用了bfs算法没做任何的优化。queryBestAcquaintance()方法是得到value最大的连接节点,对于该方法是在person类中新增一个变量保存bestId和maxValue保存最大的value。当addperson或modifyRelation则对maxValue进行判断若大于maxValue则更改bestId和maxValue。在调用该方法时,直接返回bestId。

在MyTag中,主要对getAgeMean()、getAgeVar()进行优化。增加totalAge、totalAgeVar、ageSqtSum进行动态维护。

totalAge += person.getAge();
ageSqtSum += person.getAge() * person.getAge();
totalAgeVar = (ageSqtSum) - (2 * totalAge * getAgeMean()) + (getAgeMean() * getAgeMean() * persons.size());

Bug修复

在强测中ctle了三个点,主要是没对queryCoupleSum()和getValueSum()进行优化。

queryCoupleSum()主要优化是直接得到每个person的bestAcquaintance,然后再查找bestAcquaintance的id是不是等于personId。

int person1Acc = queryBestAcquaintance(person1Id);
MyPerson myPerson2 = (MyPerson) persons.get(person1Acc);
if (myPerson2.getAcquaintances().size() > 0) {
    int person2Id = persons.get(person1Acc).getId();
    int person2Acc = queryBestAcquaintance(person1Acc);
    if (person1Acc == person2Id && person2Acc == person1Id) {
       sum += 1;
    }
}

getValueSum()则采用动态维护,在addPerson和delPerson时对totalValueSum进行维护。

第11次作业

这一次作业新增的功能是MyMessage、MyEmojiMessage、MyNoticeMessage、MyRedEnvelopeMessage,没有进行性能优化。

Junit测试方法

本单元每次作业都需要对一个方法编写JUnit测试。需要验证前置条件、运行测试方法、验证后置条件等步骤。首先构造多组数据,记录必要的修改前数据,然后调用方法。最后,验证后置条件即逐行判断ensures是否满足,检查是否满足所有的后置条件约束,还需要验证不变式。

学习体会

在这个单元中也学习了很多的算法和优化上的知识和JML规格。JML规格在开发时不会产生模糊的定义,也更好地让他人阅读代码。编写的代码也更清晰、更可靠、更易于维护的代码。本单元的总体难度比起前两个单元简单,主要难度是对方法进行优化并且满足后置条件。规格化开发更便于我们对代码进行测试。

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

301

社区成员

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

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