有限状态机:如何增强软件测试第一部分:什么是 FSM
扫描二维码
随时随地手机看文章
确保应用程序可靠性是一项永无止境的任务。有限状态机(FSM) 通过将系统行为建模为状态和转换来提供解决方案,这是一种有用的工具,可以帮助软件工程师了解软件行为并设计有效的测试用例。
本文通过简单示例探讨 FSM 的优缺点。我们还将对 FSM 和程序图在软件测试中的实用性和适用性进行简要比较。
什么是 FSM?
FSM 是一种强大的工具,用于对表现出不同状态和这些状态之间转换的系统进行建模。它们是系统行为的视觉路线图。以下是其核心原则的细分:
· FSM 是一个有向图,其中节点表示状态,边表示状态之间的转换。
· 转换由事件触发,进入或离开某个状态时可能会发生动作。
· 转换上的标签指定触发它们的事件以及转换期间发生的操作。
· FSM 是一种简单而直观的方式,用于表示对各种事件做出不同反应的系统。
让我们探索简单自动售货机的Python代码并演示 FSM 如何帮助设计有效的测试用例。
Python
class VendingMachine:
def __init__(self):
self.state = "idle"
self.inserted_amount = 0
self.product_selected = None
def insert_coin(self, amount):
if self.state == "idle":
self.inserted_amount += amount
print(f"Inserted ${amount}. Current amount: ${self.inserted_amount}")
else:
print("Machine busy, please wait.")
def select_product(self, product):
if self.state == "idle" and self.inserted_amount >= product.price:
self.state = "product_selected"
self.product_selected = product
print(f"Selected {product.name}.")
else:
if self.state != "idle":
print("Please dispense product or return coins first.")
else:
print(f"Insufficient funds for {product.name}.")
def dispense_product(self):
if self.state == "product_selected":
print(f"Dispensing {self.selected_product.name}.")
self.state = "idle"
self.inserted_amount = 0
self.product_selected = None
else:
print("No product selected.")
def return_coins(self):
if self.state == "idle" and self.inserted_amount > 0:
print(f"Returning ${self.inserted_amount}.")
self.inserted_amount = 0
else:
print("No coins to return.")
# Example products
class Product:
def __init__(self, name, price):
self.name = name
self.price = price
product1 = Product("Soda", 1.00)
product2 = Product("Chips", 0.75)
# Example usage
vending_machine = VendingMachine()
vending_machine.insert_coin(1.00)
vending_machine.select_product(product1)
vending_machine.dispense_product()
vending_machine.insert_coin(0.50)
vending_machine.select_product(product2)
vending_machine.dispense_product()
vending_machine.return_coins()
该代码模拟了一台基本的自动售货机,具有投币、选择产品、分配和退币等功能。让我们看看 FSM 如何帮助我们创建强大的测试用例。
自动售货机的 FSM 设计
自动售货机的FSM可能有四种状态:
1. 空闲:机器等待用户输入的初始状态
2. 投币:用户投币后状态激活
3. 产品选择:选择产品并有足够的资金后状态有效
4. 分配:当产品分配完毕并退还零钱(如果有)时,状态为有效
过渡和事件
· 空闲 -> 投币:insert_coin通过方法触发
· 投币 -> 空闲:如果用户在非“空闲”状态下尝试插入硬币则触发(错误场景)
· 空闲 -> 产品选择:select_product如果资金充足,则通过该方法触发
· 产品选择 -> 空闲:如果用户选择的产品没有足够的资金,或者在选择产品时尝试其他操作,则触发
· 产品选择 -> 分配:dispense_product通过方法触发
· 分配 -> 空闲:分配产品并归还零钱后达到最终状态
使用 FSM 生成测试用例
通过分析FSM,我们可以设计全面的测试用例来彻底测试程序:
1. 投币及选择商品
· 插入各种面额的硬币(有效金额和无效金额)。
· 选择资金准确、充足、不足的产品。
· 根据插入的数量和选择验证机器是否转换到正确的状态。
测试用例示例:
1. 从“空闲”状态启动。
2. 投入 1.00 美元(转换至“投币”)。
3. 选择“苏打水”(如果资金足够则转换到“产品选择”,否则保持“空闲”状态)。
4. 验证消息:“选定苏打水。”
5. 投入0.25美元(转换至“投币”)。
6. 选择“筹码”(若总金额足够则转至“产品选择”;否则,仍停留在“产品选择”)。
7. 验证消息:“正在分配芯片。”或“芯片资金不足。”(取决于之前的硬币插入情况)。
预期行为:如果总金额为 1.25 美元(足够购买产品和找零),机器应发放“筹码”,并退还剩余的 0.25 美元。如果总金额仍然不足,机器应保持“产品选择”状态。
2. 边缘案例测试
· 在“产品选择”或“分配”状态下插入硬币(意外行为)。
· 在投入任何硬币之前,尝试选择产品。
· 尝试在未选择产品的情况下分配产品。
· 当没有硬币投入时退还硬币。
· 验证机器能否正常处理这些情况并提供适当的消息或防止无效操作。
测试用例示例:
1. 从“空闲”状态启动。
2. 投入 1.00 美元(转换至“投币”)。
3. 选择“苏打水”(转换至“产品选择”)。
4. 尝试插入另一枚硬币(在“产品选择”中不应允许)。
5. 验证消息:“机器忙,请稍候。”
预期行为:选择产品时,机器不应接受额外的硬币。
3.状态转换测试
· 验证程序是否根据用户操作(插入硬币、选择产品、分配、返还硬币)正确地在状态之间转换。
· 使用 FSM 作为参考来跟踪不同测试用例中的预期状态转换。