---
title: "状态机软件测试"
date: "2011-04-05"
categories: 
  - "software"
tags: 
  - "agile-development"
  - "software-modeling"
  - "software-tools"
  - "uml"
  - "uml-tool"
  - "umodel"
  - "v2011r2"
description: 探索如何通过在 Altova UModel 中尽早测试 UML 状态机图，从而提高软件质量。了解实用的测试技术和案例。
---
Status: #blog

Tags:  #agile-development #software-modeling #software-tools #uml #uml-tool #umodel #v2011r2

Categories: [development](/blog/zh/category/development.md) [uml](/blog/zh/category/uml.md)
# 状态机软件测试

随着开发人员不断寻求提高质量并按时完成项目的方法，许多软件测试方法越来越受到重视，例如代码审查、单元测试、回归测试、Beta测试、测试驱动开发等等。 无论项目的目标是什么，以及使用的源代码语言是什么，普遍认为，越早发现缺陷，就越容易、更经济、更快速地修复。 [代码生成](https://www.altova.com/zh/umodel/uml-code-generation.html) 来自 [UML状态机图](https://www.altova.com/zh/umodel/state-diagrams.html), 一项新功能，于...版本中推出 [Altova UModel 2011软件](https://www.altova.com/zh/umodel.html) 版本2可以用于在项目开发的早期阶段验证概念逻辑。 

**在状态机图中体现实际应用的设计** 

UModel 附带的一个示例包含一个简单而真实的有限状态机图，以及一个小型测试应用程序，您可以运行它来亲身体验测试设计逻辑的便捷性。UModel 2011 示例文件夹中的 "AirCondition.ump" 项目中的有限状态机图描述了一个典型供暖和空调系统的运行方式。 

[![Altova UModel 中的状态机图 ](https://lh5.ggpht.com/_REdrfeVqYdU/TZsY4ceg5yI/AAAAAAAAAXU/EvHaGDO0_sw/Snap1_state_diagram_LR5.png?imgmax=800 "State machine diagram in Altova UModel ")](https://www.altova.com/umodel.html) 

该系统包括一个电源按钮，位于左侧，用于从关闭状态切换；一个模式选择功能，用于选择加热或制冷模式；一个风扇速度选择功能；以及一个待机按钮，用于将系统置于右侧显示的待机模式。示例项目文件夹包含UModel使用Java、C#和Visual Basic生成的全部代码，用于该图表。要尝试Java版本，我们只需要使用命令**javac STMTester.java**来编译代码，然后使用**java STMTester**来运行它。测试应用程序会显示一个模拟控制面板，其中包含有关加热和空调设备的窗口。操作按钮位于顶部，第一个窗口显示当前状态，而系统变化产生的输出信息则显示在第二个窗口中。

[![用于测试由Altova UModel生成的有限状态机代码的控制面板](https://lh4.ggpht.com/_REdrfeVqYdU/TZsY4k3SX7I/AAAAAAAAAXY/BbrYrNG5nTQ/clip_image0043.jpg?imgmax=800 "Test control panel for state machine code generated by Altova UModel")](https://www.altova.com/umodel/state-diagrams.html) 

如上所示，系统初始化时处于关闭状态，模式设置为加热，风扇处于关闭状态。在使用系统之前，您可能需要调整控制面板和状态机图的大小，以便更清楚地了解测试应用程序在图表中的操作流程，如下方所示的缩小后的图像。 

[![UModel 状态机图以及用于生成代码的测试控制面板](https://lh3.ggpht.com/_REdrfeVqYdU/TZsY5AeHLzI/AAAAAAAAAXc/oNqgojYQqZw/Snap3_combinedimage_LR5.png?imgmax=800 "UModel state machine diagram and test control panel for generated code")](https://www.altova.com/umodel.html) 

**操作状态机** 

当我们点击电源按钮时，当前状态窗口会更新，并且详细描述发生的各项操作会以“事件 1”的形式列在调试输出消息窗口中。 

[![用于测试由Altova UModel生成的有限状态机代码的控制面板](https://lh5.ggpht.com/_REdrfeVqYdU/TZsY5d6YGOI/AAAAAAAAAXg/GPAgI00JHWo/clip_image0084.jpg?imgmax=800 "Test control panel for state machine code generated by Altova UModel")](https://www.altova.com/umodel.html) 

如果天气炎热，我们可以将模式切换为“制冷”，并提高风扇转速。可以通过点击“模式选择”和“风速选择”按钮来实现。每次点击后，“当前状态”窗口都会更新，并且“事件2”和“事件3”会被添加到“输出消息”窗口中。 

[![用于测试由Altova UModel生成的有限状态机代码的控制面板](https://lh6.ggpht.com/_REdrfeVqYdU/TZsY6EeKdOI/AAAAAAAAAXk/hIxBihKj4-Y/clip_image0103.jpg?imgmax=800 "Test control panel for state machine code generated by Altova UModel")](https://www.altova.com/umodel.html) 

现在我们可以看到，这个测试应用程序如何让我们充分验证状态机图的逻辑。通过点击所有可能的按钮选择顺序，我们可以观察它们是否产生预期的结果。例如，如果我们将设备置于待机模式（以下事件 4），然后按下“速度选择”按钮，我们可以在事件 5 的输出消息中看到，名为“区域速度”的子状态没有发生任何改变。请将事件 5 与以下窗口中显示的事件 3 进行比较。 

[![用于测试由Altova UModel生成的有限状态机代码的控制面板](https://lh5.ggpht.com/_REdrfeVqYdU/TZsY6T-8lBI/AAAAAAAAAXo/VDovIAt3cDs/clip_image0123.jpg?imgmax=800 "Test control panel for state machine code generated by Altova UModel")](https://www.altova.com/umodel.html) 

现在系统处于待机模式，我们不需要加热或制冷，为了节约能源，请按下电源按钮将其关闭。 

[![用于测试由Altova UModel生成的有限状态机代码的控制面板](https://lh4.ggpht.com/_REdrfeVqYdU/TZsY66RZsKI/AAAAAAAAAXs/v6FK67nFMVI/clip_image0143.jpg?imgmax=800 "Test control panel for state machine code generated by Altova UModel")](https://www.altova.com/umodel.html) 

等等，看起来什么也没发生。在事件6中，没有发生任何状态转换，而且顶部的“当前状态”仍然显示为“待机”！ 重新查看状态机图，我们可以看到，从“待机”模式的唯一退出方式是再次按下“待机”按钮。 难道这真的是普通用户所期望的行为吗？ 即按下“电源”按钮无法从“待机”模式关闭系统？ 

[![使用 Altova UModel 软件创建的有限状态机图的一部分](https://lh6.ggpht.com/_REdrfeVqYdU/TZsY7RcFpgI/AAAAAAAAAXw/1oWwcxTveBE/clip_image0163.jpg?imgmax=800 "Portion of a state machine diagram created with Altova UModel")](https://www.altova.com/umodel.html) 

想象一下，如果这个问题是在产品开发后期，当原型产品被监管机构进行测试时才被发现，修复它的成本将会多么高昂！现在，我们向各位读者提出一个挑战：你们会如何设计一条更直接的路径，从待机状态直接进入关机状态？ 

**测试您自己的状态机** 

您可以将 UModel 状态机代码生成示例项目用作模板，用于创建您自己的设计的测试应用程序。 您应该充分利用 UModel 的一项功能，即在您向状态机中的状态转换添加操作名称时，该功能会自动在类中创建相应的操作。 

[![Altova UModel 工具栏上的按钮，用于自动在类中创建操作](https://lh6.ggpht.com/_REdrfeVqYdU/TZsY7mEsVhI/AAAAAAAAAX0/FDDlekHpIgk/clip_image0183.jpg?imgmax=800 "Altova UModel toolbar button for automatic creation of operations in classes")](https://www.altova.com/umodel.html) 

此外，UModel的帮助系统包含了关于从状态机图生成代码的详细信息，并且以“AirCondition.ump”项目文件作为示例。 

**通过使用Altova UModel，您可以亲自了解如何通过测试您自己的状态机图的逻辑，从而改进项目开发** [**今天就下载免费的30天试用版**](https://www.altova.com/zh/download/umodel/uml_tool_enterprise.html)**！**
