BUAA OO2023 Unit3:JML-规格设计

1.测试过程

1.1概念理解

黑箱测试和白箱测试是软件测试中两种常见的方法,它们用于评估和验证软件系统的功能和质量。
黑箱测试:一种基于功能的测试方法,它着重于测试软件系统的功能,而不考虑内部的实现细节。即在黑箱测试时,把整个程序看作一个看不见内部的“黑盒子”。不需了解或查看软件的源代码,只关注软件的输入和输出。
测试人员将输入数据提供给软件系统,然后观察系统的行为和输出结果,并与预期的结果进行比较,以确定软件系统是否按照规格要求正常工作。黑箱测试主要关注功能的完整性、正确性、可靠性和安全性等方面。

白箱测试:一种基于内部结构的测试方法,它需要测试人员了解软件系统的内部实现和结构。即与“黑箱测试相对”,在白箱测试中,源代码是公开的。测试人员可以查看软件系统的源代码、设计文档和算法等信息,以编写测试用例。白箱测试主要关注代码覆盖率、路径覆盖、逻辑覆盖和错误处理等方面。测试人员可以通过检查内部数据结构、逻辑流程、循环和边界条件等,来测试软件系统的正确性、优化性和可维护性。

单元测试、功能测试、集成测试、压力测试和回归测试是软件测试中常见的几种测试类型,它们各自有不同的目的和重点。
单元测试:是针对软件系统中最小的可测试单元进行的测试,通常是对单个函数、方法或模块进行测试。它的目的是验证这些单元在独立执行时是否按照预期工作。单元测试通常由开发人员编写,并可通过自动化测试框架进行执行。它的主要目标是确保单元的功能正确性、稳定性和可重复性。如本单元作业中的对qlm函数、qcs等函数功能进行单独测试。

功能测试:是一种针对软件系统的功能需求进行的测试,以验证系统在各种用户操作下是否按照预期工作。关注系统的功能完整性、正确性和兼容性。测试人员根据功能规格说明书或需求文档编写测试用例,并通过模拟用户行为、输入预期数据来验证系统的功能。

集成测试:是将已经过单元测试的模块或组件结合在一起进行的测试,以验证它们在集成时是否正常协作。集成测试的目标是检测模块之间的接口问题、数据传递问题和功能交互问题。通过集成测试,可以确保系统的各个组成部分在整体上能够正确地工作。集成测试可以分为逐步集成和一次性集成两种方法。

压力测试:是测试软件系统在高负载情况下的性能和稳定性的一种测试方法。它通过模拟大量用户同时访问系统、大数据量输入和高并发操作等方式,测试系统的性能极限和稳定性。压力测试可以帮助发现系统的性能瓶颈、资源耗尽、内存泄漏等问题,并评估系统的扩展能力和可靠性。比如本单元第三次作业对qlm的测试,通过在几千个人之间构建一个庞大的完整图来查询最短路径,考验自己算法的时间复杂度。

回归测试:是在对软件进行修改或添加新功能后,重新执行已有测试用例以确认修改没有引入新的错误或影响原有功能的测试。回归测试旨在确保软件的稳定性和一致性,防止已经修复的问题再次出现。比如本单元三次作业迭代过程中具有连续性。可以把前几次作业的强测数据直接拿来测试最新作业来确保正确性。

1.2测试工具&数据构造

测试工具主要是依靠同学的数据生成器编造大量数据后,将自己结果与同学结果进行对拍。但这种方法存在缺乏唯一正确标准判断。另一种方法是直接利用同学的评测平台自动化判断正确性。(这种测试应属于“黑箱测试”)

数据构造首先要考虑所有指令全覆盖。同时对于建立的社交网络图,构造数据要尽可能地构造复杂图,看图动态变化后的结果。对图中各结点之间进行边的增删,图数据的查询。 对于OKTest的数据构造要考虑把每一项ensures及异常的触发都考虑进去。

2.架构设计

整体还是完全按照JML规格设计进行具体实现。为了代码风格将一些函数进行单独成类。 最终如图↓
最终UML图
图的构建直接是在Network类里面用HashMap来构建图。
在查询连通子图时利用并查集的动态维护;在进行qlm(最短路径环)查询时将当前图作为参数传入,然后使用spfa算法按边遍历得最短路径,再判断是否成环。
本单元作业中多处要求查找而非遍历,所以普遍选择HashMapArrayList则应保证元素的顺序。

3.性能分析

hw9

这次作业是因为在某个函数中使用容器时未初始化导致的空指针异常,且qcs未进行动态维护导致TLE。

hw10

本次作业实现难点是对删边后对并查集的处理。我选择每次删边后重建更新并查集。 本次出BUG是oktest的编写出了问题,未满足某一个ensures。

hw11

本次作业由于qlm的性能要求导致很容易TLE;我在求最短路径的spfa算法里是每次对所有点遍历,导致CPU运行超时。后改成按边遍历即通过修复。

其他注意:
Integer类的比较应使用equals而非==

**规格与实现分离:**规格只是保证方法的功能要求,而具体实现要考虑很多其他因素,比如多个函数之间联动的动态调整;算法性能问题;编写代码的扩展问题等等。

4.OKTest

三次作业分别对qts、mr、dce方法进行了OKTest的编写。编写过程中就是要注意对JML规格的每一行都思考是否要进行比较判断。

5.学习体会

JML规格本身是一种指定java程序行为的行为接口规格语言。
本单元的作业基本上就是完全按照课程组给的JML规格进行具体代码编写实现即可。但具体要考虑的也有很多,比如容器的选择、算法的选择等等。
本单元也让我复习了如并查集最短路径树等图论相关的算法并进行拓展学习。 同时以后在给程序做测试时要考虑各种测试类型,数据构造问题等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值