分析本单元的测试过程
谈谈你对黑箱测试和白箱测试的理解
白盒测试
简单来说就是看代码,分析可能的输入会有哪种执行路径,分析程序中每条通路是否按照预定要求正确工作。
黑盒测试
从用户角度分析,简单来说就是输入数据,并检测输出是否符合要求。
单元测试、功能测试、集成测试、压力测试、回归测试的理解
单元测试
颗粒度最小,测试单元设计是否符合,一般使用白盒测试对单元进行测试。具体到操作,即分析各函数是否符合其要求。
集成测试
介于单元测试和系统测试之间,黑盒加白盒的形式进行测试,验证设计验证需求,可以用junit来测试
功能测试
颗粒度最大,测试某个功能是否正确,表现为,测试具体的指令是否能正常完成,一般是黑盒测试。
压力测试
为了评价所设计的程序的时间空间复杂度是否能达到要求,要进行大数据量的测试,生成的数据要有针对性,不同的测试样例应侧重不同,具体为数据生成时某些指令所占的比例。正确的输出由交简单的程序生成,只保证正确性,不要求性能。或者可以进行对拍。
回归测试
当发现某些bug后,进行debug,debug后的代码除了要通过出现bug的样例,还要通过以前其他样例。
梳理本单元的架构设计,分析自己的图模型构建和维护策略
和图有关的指令
加人、加边、改边、查询连通性、查询连通块数量、查询三元环、查询最强连接、查询“对”数量、查询含某节点的最小环
分析
在第一次作业中,没有删边的操作,使用并查集可以维护连通性、连通块数量
三元环的维护,发现,只有在增加边时,三元环发生改变,只需遍历两点的邻节点,若有相同的点即三元环数量增加。
最强连接,发现只有在加边或删边时会造成最强连接的改变,在加边和删边时维护即可。
“对”即互为最强连接,由于上方已经维护了最强链接,直接查询即可。
在第二次作业中,多出了删边的操作,仍采用并查集维护连通性。但对于删边操作,在动态维护时,可以先分别dfs寻找所有和当前两节点联通的节点,得到两个节点集,分析发现,若这两个节点集没有交集,则这两个节点集成为两个新的连通块,注意更新两个节点集各节点的父节点,以及更新祖先节点集。
在第三次作业中,增加了查询某节点最小环的指令,对于该指令,考虑以下算法:
先以该节点为源节点进行迪杰斯特拉算法,找到最小生成树,然后分析,最小环一定从以下两种情况中产生:
1.某节点是源节点的邻节点,且有一条更短的到源节点的最短路径,则该最短路径,加上该节点到源节点的边即可能的最小环。
2.某两个节点相邻,且各自有一条到源节点的最短路径,则两条最短路径加上两节点之间的边,为可能的最小环。
遍历所有可能的最小环,找到最小的即可。
具体实现,可以先遍历最小生成树上所有节点,并查看是否符合情况1
情况2实现,先把最小生成树的根去掉,得到若干子树,只有不同子树之间的节点才可以实现情况2,否则会出现路径重复,不符合最小环定义。
分析作业中出现的性能问题及其修复情况,谈谈自己对规格与实现分离的理解
性能问题及其修复情况
按照上述维护方式,性能较好没有出现性能问题。
对规格与实现分离的理解
对于编写程序来说,阅读懂规格,并明白其要求,然后直接编写代码,编写好后,在对照规格看是否符合要求,最后应严格按照规格进行测试,其中,要读懂大量规格很费时间,可以使用chatgpt,把规格给gpt并让其使用自然语言解释,
这并不是完全抛弃规格,只是用自然语言解释,方便理解,代码运行的要求还是严格符合规格。
本单元中同学们实现了OK测试方法,请同学们思考OK测试对于检验代码实现与规格的一致性的作用,有何改进何建议
OKtest即拿到某个接口方法执行前后的数据,并分析方法执行结果是否符合规格要求。OKtest即照着规格对方法进行检查,OKtest方法只检查正确性,并不要求性能,但严格要求数据前后的改变符合规格。
学习体会
JML并不太好用,对于程序编写者来说,JML并不如自然语言容易理解,但是对于测试人员来说,JML是评判一个方法是否符合要求的好方法,按照JML逐条检查方法是否符合设计要求。
同时发现JML有很多操作可以总结为原语,例如对增删改查数组元素,增加一些操作原语可能会遍历JML的使用。