一、用例的概念
用例是指软件系统中某个功能的使用说明文档,用例描述了系统与用户之间的交互过程。
每个用例都描述了系统的一个方面,在清晰简洁的方式下,用例列出了用户如何与系统交互以完成特定的任务。
通常,一个用例的结构应该包括:用例名称,主要参与者,前置条件,后置条件,基本执行过程和异常执行过程。
二、用例分类
根据用例表现形式的不同,用例可分为正常场景用例、异常场景用例、边界场景用例以及特殊场景用例。
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;
}
