用例不是“功能”

用例不是“功能”

 

多数人从用例开始就走入了迷途,也许是用例图和数据流图的相似性导致人们把用例定义为简单的功能或者菜单项。不论原因是什么,这都是新手最容易犯的错误。

 

图 1 错误的方式:用例是菜单项或者功能

 

这幅图有什么错误?用最简单的定义,我倾向于把用例看作是关于使用系统作某些有用的事情的方式的故事。利用这个定义,是不是所有的“用例”都是独立的有用的呢?

答案当然是不是,在这个例子中,用例表示了系统需要做的所有的事情,但是他们也描述了用户需要通过系统去做的一件单独的事情:定购。所有保留的元素都是这一个用例的备选支流,它们是在定购时可能发生的步骤。在只做一件有用的事情的地方,只应该有一个用例。图1就是一个功能分解的例子,或者“四轮马车”格式的例子――一个参与者在中间,周围是一圈用例。

这是一个常见的问题,为什么人们会陷入这个陷阱呢?我们有一个有对定购的内在需要,并且在不存在的地方如果我们需要那么就利用它。在功能分解的情况下,我们有一种自然倾向把问题分解为越来越小的块。有一种天真的想法那就是把用例分解为越来越小的单位会简化问题。这种理解是完全错误的。当我们分解用例时,实际上会把问题复杂化。

问题在这里

用例的目的是描述某人某物如何使用系统来完成对他们有价值的事情,它描述了系统在概念层次上做什么,使我们足够理解系统以便决定系统是否要做恰当的事。用例是我们能够形成一个系统的概念模型。

再看看图1,现在问你自己,如果我从来没有定购过,我想通过系统查询定单的状态吗?这是不太可能的。或者如果我从来没有定购过,我想变更订单吗?不,也许不。通常这些东西只有当我订购过的时候才对我有用。然而,为了系统能够允许我订购,这些都是必要的。

把系统分解为越来越小的用例模糊了系统的真实目的,极端情况下,我们将以得到一堆隔绝的行为的细致末节而告终。结果我们不能说明系统做什么。这就像看到一辆被拆解为零件的汽车,或许你会说这是辆汽车,你也知道零件们是有用的,但是你确实不能说明他们如何组装在一起。

当使用用例的时候,记住用例是考虑整个系统的一种方式,并且要组织成可管理的功能块,这些功能块完成一些有价值的事情。为了得到正确的用例集合,问你自己一个问题:“参与者实际上想使用系统做什么?”

如果你在想图1的改进后的版本是什么样的,图2展示了改进后的版本。

File:O p2ssss.jpg

图 2一种更好,更加简单的方法: 合并功能以反映对参与者的真正价值

这一个用例包含了以前的图中所分解为用例的所有“功能”。你也许会问为什么这样做比较好,答案很简单:它关注于客户想要系统提供的价值,而不是我们在系统内部如何细分和构造的。如果把所有的功能分解成单独的用例,你将迫使客户(为系统付钱的人)把分解过的用例装配成一件对他们有意义的东西,以便理解系统所描述的是不是他们所想要的(即他们想为之付钱的)。

关注价值

很多小用例是常见的问题,尤其是在一个习惯于功能分解的团队中,他们的用例名称读起来就象是一个系统所执行的功能的列表,如“输入订单”、“审查订单”、“取消订单”、“履行订单”,这起先听起来也不是很坏,但不仅仅这些。即使对于一个小规模的订购系统,用例列表也很容易达到上百个,如果谁走到了这一步,他们不久就会淹死在用例的海洋中,尤其是当系统规模确实比较大时,在这种情况下,你最终也许会有几百个,甚至上前个用例。

这么做有什么错呢?

这些用例的价值将会被错过。用例的唯一目的是为参与者产生价值。在一定层次上能够输入订单也是某种有价值的事情,但是,如果这些订单从来不被履行,那还有价值吗?也许没有吧。
怎样输入订单、修改订单以及取消订单等等,所有这些事情都是与客户真正想要做的事情有关的,那就是接受订购的货物。这些活动对公司想要的事情是必须的,那就是收到货款。

这种看起来是支离破碎的没有任何明显关系的功能集合的另一个问题是导致难以使用的系统。很多系统跟这个很类似,它们只是一堆杂乱的特性。记住,用例帮助我们关注与什么是真正重要的,也就是具有真正价值的事物,并且使我们能够围绕那些元素来定义系统。用例不要是系统按照功能分解的蓝图。

举例

考虑一个你在互联网上用过的一个电子商务系统,当你登录这个站点的时候,你的目标可能是查找产品相关的信息、选择要购买的产品、安排支付及送货约定。在做这些事的过程当中,你可能会改变主意、输入错误的信息以至不得不修改它、改变邮递或送货地址,以及其他的一些东西。如果这个网站不允许你通过一种吸引人的方式来找到并订购产品,你也许不会完成你的订购,更不用说再次来到这个网站。

当建造一个系统时,始终要记住用例的核心定义:关于采用某种方式使用系统来做有价值的事情的故事。如果你能够实施这个定义,展示用户希望通过系统获得的价值,然后创建反映这些价值的用例的时候,你的系统将会更好地满足用户的期望。

From:

http://isse.cqu.edu.cn/wiki/index.php/%E7%94%A8%E4%BE%8B%E4%B8%8D%E6%98%AF%E2%80%9C%E5%8A%9F%E8%83%BD%E2%80%9D

<think> 首先,用户的问题是:“我想查找测试登录功能的用设计方法或具体用 请问登录功能测试用设计方法和示”。 回顾系统级指令: - 所有行内数学表达式必须使用 $...$。 - 独立公式必须使用 $$...$$。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,逐步解决问题。 用户提供了引用: - 引用[1]:关于注册与登录功能测试用设计,提到决策表、等价类划分、边界值分析和场景法。 - 引用[2]:计算器加法功能的测试用。 - 引用[3]:软件测试用设计方法,展示了一些子。 用户明确说“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答”。但在历史消息中,这是我第一次看到这个问题;用户提到“用户上一次的问题”,但在这个对话中,之前没有其他消息。可能用户指的是在这个查询中提供的引用。 用户当前的问题是聚焦在登录功能的测试用设计方法和示。 从引用[1]中提取相关部分:它提到了登录功能测试用设计,具体是“2 登录功能测试用设计 2.1 明确需求与测试范围”,但没有给出细节。引用[1]强调了决策表在注册模块的短板,推荐使用等价类划分、边界值分析和场景法。 引用[2]是加法功能的测试用不是直接相关,但可以作为测试用设计的通用子。 引用[3]展示了测试用设计方法,如等价类划分的子。 所以我需要基于这些引用,结合测试用设计的一般知识,回答登录功能的具体测试用设计。 结构化回答: 1. **介绍方法**:解释登录功能测试用设计的常用方法,如等价类划分、边界值分析、场景法等。 2. **提供示**:给出登录功能的具体测试用。参考引用[2]的格式,但针对登录。 3. **引用标识**:在引用的内容末尾添加引用标识。 4. **生成相关问题**:在最后添加相关问题。 登录功能测试用设计方法: - **等价类划分**:将输入划分为有效等价类(正确输入)和无效等价类(错误输入)。 - **边界值分析**:测试边界条件,如用户名最小长度、最大长度。 - **场景法**:基于用户场景,如成功登录、失败登录(错误密码)、锁定账户等。 - **决策表**:但引用[1]提到决策表可能有短板,尤其在注册中,但登录可能适用,需谨慎使用。 从引用[1]:“相比之下,等价类划分、边界值分析和场景法更能精准覆盖注册功能的核心风险点。” 同样适用于登录。 测试用: - 参考引用[2]的格式,用中文编写。 - 如: - 测试用1: 正确用户名和密码,预期成功登录。 - 测试用2: 错误密码,预期失败。 - 等等。 添加引用:使用[^1] 或 [^2] 等。 生成相关问题: - 如: 1. 如何优化登录功能测试用设计? 2. 登录功能性能测试的方法? 3. 测试用管理工具推荐? 4. 常见登录安全漏洞测试? 确保回答清晰、逐步: - 第一步:解释方法。 - 第二步:给出示测试用。 - 第三步:总结。 - 最后:相关问题。 使用中文。 </think> ### 登录功能测试用设计方法与示 在设计登录功能测试用时,核心目标是覆盖各种输入场景和潜在风险点,确保系统能正确处理合法登录尝试并防御非法访问。基于软件测试的基本原则,常用设计方法包括等价类划分、边界值分析和场景法,这些方法可以有效避免决策表可能带来的组合爆炸或冗余问题(尤其在处理用户输入时)[^1]。以下我将逐步解析设计方法,并提供具体用。 #### 步骤1: 测试用设计方法解析 设计登录功能测试用时,主要采用以下方法: - **等价类划分**:将输入数据划分为有效等价类(如正确用户名和密码)和无效等价类(如错误密码或空输入)。这有助于减少用数量,同时覆盖核心场景。如: - 有效等价类:用户名和密码均为合法格式。 - 无效等价类:用户名缺失、密码错误或包含特殊字符。 这种方法能精准识别登录失败的风险点[^1][^3]。 - **边界值分析**:针对输入域的边界条件进行测试,如用户名或密码的长度限制(最小长度、最大长度)。登录功能中,边界值分析常用于处理账户锁定机制或密码复杂度规则。如: - 测试用户名长度为1字符(最小边界)或20字符(最大边界)。 这能预防缓冲区溢出或输入验证漏洞[^1]. - **场景法**:基于用户实际使用场景设计用,如登录成功、登录失败(多次尝试导致账户锁定)、或异常行为(如网络中断)。场景法强调端到端流程,覆盖功能流和错误处理。如: - 场景: 用户输入正确凭据后,系统应跳转主页;输入错误3次后,账户应被临时锁定。 这在登录功能中尤其重要,因为涉及安全性和用户体验[^1]. 决策表也可用于复杂规则,但引用[1]指出其在注册模块中的短板(如处理优先级和动态依赖困难),登录功能中同样需谨慎使用以避免冗余。 #### 步骤2: 具体测试用 参考简易计算器加法功能的用设计思路(如引用[2]),我为登录功能编写了一套典型测试用。这些用基于上述方法设计,覆盖常见风险点。每个用包括输入、预期输出和简要说明。假设登录表单要求:用户名(字符串,长度3-20字符)、密码(字符串,长度6-12字符),系统支持3次失败尝试后锁定账户5分钟。 ```python # 示代码:伪代码表示登录测试逻辑(实际测试可通过Selenium或单元测试框架实现) def login(username, password): # 模拟登录逻辑:返回登录状态或错误消息 if username == "valid_user" and password == "valid_pass": return "登录成功,跳转主页" elif username not in ["valid_user", "locked_user"] or password != "valid_pass": return "登录失败:用户名或密码错误" elif username == "locked_user": return "账户已锁定,请5分钟后重试" # 测试用1: 有效等价类测试(正常登录) result = login("valid_user", "valid_pass") print(result) # 预期输出: "登录成功,跳转主页" # 测试用2: 无效等价类测试(错误密码) result = login("valid_user", "wrong_pass") print(result) # 预期输出: "登录失败:用户名或密码错误" # 测试用3: 边界值分析测试(用户名最小长度) result = login("usr", "valid_pass") # 用户名长度=3(最小值) print(result) # 预期输出: "登录成功,跳转主页" # 测试用4: 边界值分析测试(密码最大长度) result = login("valid_user", "password12") # 密码长度=12(最大值) print(result) # 预期输出: "登录成功,跳转主页" # 测试用5: 场景法测试(账户锁定机制) # 第一次尝试失败 result = login("locked_user", "wrong_pass") print(result) # 预期输出: "登录失败:用户名或密码错误" # 第二次尝试失败 result = login("locked_user", "wrong_pass") print(result) # 预期输出: "登录失败:用户名或密码错误" # 第三次尝试失败 result = login("locked_user", "wrong_pass") print(result) # 预期输出: "账户已锁定,请5分钟后重试" # 测试用6: 无效等价类测试(空用户名) result = login("", "valid_pass") print(result) # 预期输出: "登录失败:用户名不能为空" # 测试用7: 场景法测试(网络安全中断) # 模拟网络故障后尝试登录 result = login("valid_user", "valid_pass", network_available=False) print(result) # 预期输出: "登录失败:网络连接异常" ``` **用说明**: - 用1-4覆盖核心功能和边界值,确保正常操作和安全输入处理。 - 用5模拟多次失败锁定机制,强调场景法在安全测试中的作用。 - 用6-7处理异常输入和外部因素,提升用覆盖率。 总计约10-15个用可覆盖主要场景;实际项目中,基于需求扩展(如支持多因素认证)[^1][^2][^3]。 #### 总结 登录功能测试用设计应以等价类划分和边界值分析为基础,结合场景法覆盖用户行为和安全漏洞。通过上述方法和示,可以有效识别风险点(如账户劫持或输入注入),并优化测试效率。引用[1]强调这些方法比决策表更适合处理登录的动态依赖问题[^1]。实践中,用数量应控制在合理范围,避免冗余。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值