一、用例的概念
用例是指软件系统中某个功能的使用说明文档,用例描述了系统与用户之间的交互过程。
每个用例都描述了系统的一个方面,在清晰简洁的方式下,用例列出了用户如何与系统交互以完成特定的任务。
通常,一个用例的结构应该包括:用例名称,主要参与者,前置条件,后置条件,基本执行过程和异常执行过程。
二、用例分类
根据用例表现形式的不同,用例可分为正常场景用例、异常场景用例、边界场景用例以及特殊场景用例。
1、正常场景用例
正常场景用例是指系统与用户之间,按照预期的流程,顺利地执行任务的场景。
下面是一个正常场景用例的示例:
用例名称:查看商品详情 主要参与者:顾客 前置条件:顾客已登录并打开了要查看的商品页面 后置条件:顾客已查看了商品详情并进行了相关操作 基本执行过程: 1. 顾客浏览商品页面,找到想查看的商品 2. 顾客点击商品图片或名称,进入商品详情页 3. 系统显示商品的基本信息,包括价格、库存、尺码、颜色等 4. 顾客可以进行加入购物车,或直接购买等操作 5. 顾客完成相关操作后,确认退出商品详情页面 异常执行过程:无
2、异常场景用例
异常场景用例是指系统与用户之间,因为各种外界或内部原因,未能按照正常流程,出现了异常情况的场景。
下面是一个异常场景用例的示例:
用例名称:登录失败 主要参与者:顾客 前置条件:顾客已点击登录按钮,输入用户名和密码 后置条件:系统未能成功登录,提示用户详细信息 基本执行过程: 1. 顾客输入用户名和密码后,点击登录按钮 2. 系统验证用户名和密码是否匹配 3. 如果匹配,进入主页面。如果不匹配,转入4步骤 4. 系统提示错误信息,包括用户名或密码错误 5. 顾客根据错误信息进行修改并重新登录 异常执行过程:网络无法连接、系统故障等
3、边界场景用例
边界场景用例是指输入数据正好处于界限情况,或刚好位于特殊值的场景。
下面是一个边界场景用例的示例:
用例名称:购买数量上限 主要参与者:顾客 前置条件:顾客已添加商品到购物车,并进入结算页面 后置条件:系统检查数量是否超出限制,生成订单 基本执行过程: 1. 顾客在结算页面中输入购买数量,如果超过上限,系统提示错误信息 2. 顾客修改数量小于上限后,点击购买按钮 3. 系统检查商品的库存是否够 4. 如果够,生成订单并提示顾客支付 5. 如果不够,系统转入异常场景 异常执行过程:库存不够等
4、特殊场景用例
特殊场景用例是指输入数据处于非正常台,或者带有一定风险的场景。
下面是一个特殊场景用例的示例:
用例名称:用户连续登录失败多次 主要参与者:顾客 前置条件:顾客连续多次输入错误的用户名和密码 后置条件:顾客需要等待一段时间才能再次尝试登录 基本执行过程: 1. 如果顾客连续多次输入错误的用户名和密码,系统检查并记录失败的次数 2. 如果超过一定的次数,系统自动锁定顾客的账号 3. 顾客根据提示信息来解锁账号并重新登录 异常执行过程:无
三、用例编写方法
用例的编写是需要考虑到实际应用的,过于详细的描述可能会影响到用例的可读性,不够详细的描述也可能会影响用例的准确性。
因此,在编写用例时应该注意以下几点:
1、用例的准确性
用例应该考虑到各种可能情况,特别是异常情况,以便保证用例的准确性。
2、用户需求的优先级
对于用例的编写,应该考虑用户需求的优先级。对于用户优先级较高的需求应该先被考虑并编写成用例。
3、用例的可复用性
为了达到代码复用和维护的最大化,编写用例时应该考虑用例的可复用性。即尽可能扩展已有的用例,减少冗余的用例。
四、完整代码示例
1、正常场景用例示例代码
/** * 查看商品详情 * * @param {object} product 商品对象 * @return {object} 商品详情 */ function viewProductDetail(product) { // 判断商品是否存在 if (!product) { console.error("Product doesn't exist"); return; } // 显示商品信息 console.log(product.name); console.log(product.price); console.log(product.color); console.log(product.size); // TODO: 用户进行相关操作 }
2、异常场景用例示例代码
/** * 登录账号 * * @param {string} username 用户名 * @param {string} password 密码 * @return {bool} 是否成功登录 */ function login(username, password) { // 判断用户名和密码是否为空 if (!username || !password) { console.error("Username and password can't be empty"); return false; } // TODO: 验证用户名和密码是否匹配 // 如果不匹配,记录失败次数 let failTimes = null; failTimes++; if (failTimes > 5) { // 如果失败次数超过5次,进行锁定 console.log("Your account has been locked"); return false; } console.error("Username or password is incorrect"); return false; }
3、边界场景用例示例代码
/** * 生成订单 * * @param {object} product 商品对象 * @param {int} count 购买数量 * @return {object} 订单对象或错误信息 */ function generateOrder(product, count) { // 检查购买数量是否超出上限 const maxCount = 10; if (count > maxCount) { console.error("The maximum purchase quantity is " + maxCount); return; } // TODO: 检查商品库存是否够 // 如果够,返回订单对象 const order = { product: product, count: count, totalPrice: count * product.price, createTime: new Date() }; console.log("Generate order successfully"); return order; }
4、特殊场景用例示例代码
/** * 解锁账号 * * @param {string} username 用户名 * @param {string} identity 身份证号 * @return {bool} 是否成功解锁 */ function unlockAccount(username, identity) { // 如果输入错误,返回错误信息 if (username !== "test" || identity !== "123") { console.error("The username or identity is incorrect"); return false; } console.log("Unlock account successfully"); return true; }