301
社区成员
发帖
与我相关
我的任务
分享黑箱测试也称功能测试,它将被测软件系统看作一个黑盒子,测试人员不关注内部结构和处理过程,只关注软件的输入和输出。
测试人员通过分析需求规格说明,从用户的角度出发设计测试用例,检查软件的功能是否符合需求。
黑箱测试主要测试软件的功能性、界面、性能、安全性、兼容性等外部可见的特性。
常见的黑箱测试方法有等价类划分、边界值分析、因果图分析、错误推测等。
黑箱测试的优点是不需要了解代码,独立于开发,容易设计测试用例;缺点是覆盖不全面,难以发现某些内部逻辑缺陷。
白盒测试也称结构测试或逻辑驱动测试,它关注被测软件的内部结构和处理过程。
测试人员需要分析代码的逻辑结构,设计测试用例来尽可能覆盖所有的语句、判定、条件等。
白盒测试的目标是检查软件内部的正确性,如模块接口、数据结构、执行路径、边界条件、内存泄漏等。
常见的白盒测试方法有语句覆盖、判定覆盖、条件覆盖、路径覆盖等。
白盒测试需要测试人员具备一定的编程能力,可以深入检查软件内部质量,但工作量大,比较耗时。
单元测试是测试活动的基础,针对软件系统中最小的可测试单元(如函数、类、模块等)进行验证。
通常由开发人员编写,测试人员评审,在代码级别检查每个单元的正确性、边界条件、异常处理等。
单元测试需要构造与真实使用环境隔离的测试桩和驱动,常用白盒测试方法设计测试用例。
做好单元测试可以尽早发现和隔离缺陷,为后续测试阶段打下良好基础。
功能测试是从用户的角度出发,检查软件的功能是否满足需求规格说明和用户期望。
功能测试一般采用黑盒测试方法,根据规格说明设计测试用例,覆盖所有功能点、界面、错误处理等。
功能测试贯穿整个测试过程,在单元测试、集成测试、系统测试、验收测试等阶段都要重点关注。
做好功能测试可以确保软件对用户是有用、好用、易用的,提高用户满意度。
集成测试在单元测试之后、系统测试之前,将经过单元测试的模块逐步组装起来,测试模块之间的接口和交互。
常用的集成测试策略有自顶向下、自底向上、三明治等,一般采用黑盒和白盒相结合的方法。
集成测试重点关注模块间的数据传递、调用顺序、异常处理、资源竞争等,确保各模块能正确协同工作。
做好集成测试可以及早发现模块间的接口错误和不兼容,避免后期返工。
压力测试是在高负荷、大并发、长时间等极端条件下,考察软件系统的性能、稳定性、资源占用等。
压力测试通过构造大量并发用户、海量数据、复杂操作等场景,观察系统的响应时间、吞吐量、错误率等指标。
常见的压力测试工具有LoadRunner、Jmeter、Locust等,一般在系统测试后期和上线前进行。
做好压力测试可以发现软件的性能瓶颈、内存泄漏、死锁、崩溃等问题,为优化和容量规划提供依据。
回归测试是在软件修改(如bug修复、新功能添加、环境变更等)后,重新执行此前的测试用例,确保修改没有引入新的错误。当对软件进行修改时,无论是修复缺陷、添加新功能还是进行系统配置变更,都存在可能引入新的错误或导致原有功能出现问题的风险。回归测试确保软件在进行更新、修复、功能增强或性能改进后,依旧能够稳定地运行。
在hw9的测试中,我选择进行100组测试,在每组的network中添加100个person,再随机为100个person之间添加关系,使得尽可能覆盖所有的情况,容易测出错误代码的bug。
在hw10的测试中,我发现了之间的100组测试的关系生成方式无法满足需求,于是又新增加了100组测试,并在这些测试中采用了新的关系生成方式:每组30个person,将边数从0到435的情况全部包括在生成的数据中。最后成功覆盖了所有的情况。
在hw11的测试中,我选择在每组测试中只添加2个person,生成不同的EmojiMessage,EmojiId分别为1到30,EmojiId为X的EmojiMessage会被添加和发送X次,之后再添加一些EmojiMessage、NoticeMessage、RedEnvelopeMessage,并不发送。这种测试方式也成功覆盖了所有情况。
本单元的架构设计如图:

考虑了JML描述的要求,我选择了使用并查集来实现本单元的作业。
最大的难点在于并查集本身不支持删除边的操作,我借鉴了学长的经验,选择了一种优化后的部分重新构建的方式,实现了较快的并查集删边操作。
在寻找最短路径时,我选择了使用双向BFS,因为其在时间上远优于dijkstra算法,且该问题中不需要考虑边权值。
在qtvs的实现中,我最终采用了动态维护的方法,在添加、修改和删除关系时进行对valueSum的修改,兼顾了正确性和时间限制。
在hw10的qtvs实现中出现了CTLE,原因是我先暴力实现qtvs指令,想着之后再优化,结果后来生病了好几天就忘了......
之后我选择了动态维护每个Tag的valueSum值,在两个person之间的关系发生变动后,修改所有同时包含这两个person的Tag的valueSum,在qtvs指令发出时直接返回valueSum的值。
规格与实现分离是软件工程的重要原则,强调要将软件的外部可见行为与内部具体实现方式区分开来,贯彻这一原则有利于提高软件的可理解性、可测试性、可维护性和可复用性。
规格关注软件应该提供哪些功能、接受什么输入、产生什么输出、满足什么约束等,定义了软件的外部可见行为。
实现则是为了满足规格要求而采取的具体编程方法,关注算法、数据结构、控制流程、资源管理等技术细节。
规格说明了软件"是什么",实现说明了软件"如何实现",两者在抽象层次上有明显区别。
根据规格说明中定义的功能需求,设计黑盒测试用例,覆盖各种正常和异常输入情况。
测试用例的输入数据可以基于等价类划分、边界值分析等黑盒测试技术生成。
预期输出结果则直接来自于JML规格说明中对应的功能描述。
在代码实现修改后,重新运行之前根据规格设计的测试用例集,检查修改是否导致实现偏离了规格。
本单元我学习到了许多数据结构和算法相关的知识,认识到了优秀的算法必须满足时间复杂度的要求。
对于契约式编程,虽然刚开始时不太适应,但我觉得很有趣。随着学习,我认识到了使用JML形式化地定义方法的前置条件、后置条件、不变式等,可以明确、无歧义地描述Java模块的外部可见行为,减少自然语言描述的模糊性,提高规格说明的准确性和一致性。
总而言之,第三单元的学习拓宽了我的知识面,也提升了我的代码能力。期待第四单元的学习。