Welcome

首页 / 软件开发 / 数据结构与算法 / 基于模型的测试和Spec Explorer简介

基于模型的测试和Spec Explorer简介2014-06-11 MSDN Sergio Mera Yiming C要生成高质量的软件,需要在测试阶段进行大量的工作,这可能是软件开发过 程中成本最高、工作量最大的部分。 从最简单的功能黑盒测试到重量级的方法, 包括定理证明程序以及形式化需求说明,有很多方法可以提高测试可靠性和效率 。 但是,测试并不总是能达到必要的细致程度,经常缺乏规范和方法体系。

十多年来,Microsoft 在其内部开发流程中成功应用了基于模型的测试 (MBT) 。 事实证明,对于各种内部和外部软件产品而言,MBT 是非常成功的方法。 这 些年来,这种方法采用得越来越多。 相对来说,它在测试界已广为接受(尤其是 与测试方法中的其他“形式化”方法相比时)。

Spec Explorer 是 Microsoft 的 MBT 工具,它扩展了 Visual Studio,提供 高度集成的开发环境,可以创建行为模型,它也是图形分析工具,可用于检查这 些模型的有效性以及基于这些模型生成测试用例。 我们认为,这个工具是一个分 界点,它促进了 MBT 这项高效方法在 IT 行业中的应用,缓和自然学习曲线,提 供最先进的开发环境。

本文概要介绍 MBT 和 Spec Explorer 背后的主要概念,通过一个案例研究说 明 Spec Explorer 的主要功能。 我们也希望本文提供的实际经验规则,可以帮 助您了解,何时应考虑使用 MBT 这种质量保证方法体系来解决特定测试问题。 您不应在一切测试方案中盲目使用 MBT。 很多时候,其他方法(如传统测试)可 能是更好的选择。
什么是 Spec Explorer 中的可测试模型?

尽管不同的 MBT 工具提供不同的功能,有时在概念上稍有差异,但对于 “执行 MBT”的含义,这些工具是一致的。基于模型的测试自动基于 模型生成测试过程。

模型通常是手动创建的,包括系统需求和预期行为。 具体到 Spec Explorer ,是基于面向状态的模型自动生成测试用例。 测试用例包括测试序列和测试预期 。 测试序列是从模型推断的,负责推动待测系统 (SUT) 达到不同状态。 测试预 期跟踪 SUT 的演变过程,确定它是否符合模型指定的行为,并且作出判定。

模型是 Spec Explorer 项目中的主要部分之一。 它在称为模型程序的构造中 指定。 您可以采用任何 .NET 语言(如 C#)来编写模型程序。 这种程序由一组 与已定义状态交互的规则构成。 模型程序与称为 Cord 的脚本编写语言组合, Cord 是 Spec Explorer 项目中第二重要的部分。 这样,可以指定行为描述来配 置浏览和测试模型的方式。 模型程序与 Cord 脚本结合后,可针对 SUT 创建可 测试的模型。

当然,Spec Explorer 项目中第三重要的部分是 SUT。 不是一定要向 Spec Explorer 提供 SUT 才能生成测试代码(这是 Spec Explorer 的默认模式),因 为生成的代码是直接从可测试模型推断的,并不与 SUT 进行任何交互。 您可以 独立于模型评估和测试用例生成阶段“离线”执行测试用例。 但是, 如果提供 SUT,则 Spec Explorer 可以验证是否已明确定义从模型到实现的绑定 。
案例研究:聊天系统

我们来看一个示例,它介绍如何在 Spec Explorer 中构建可测试的模型。 此 示例中的 SUT 是一个简单的聊天系统,只有一个聊天室,用户可以登录和注销。 用户登录后,可以请求已登录用户的列表,可以向所有用户发送广播消息。 聊天 服务器总是确认这些请求。 请求和响应是异步的,这意味着它们可以混在一起。 就像一般的聊天系统,一位用户发送的多条消息会按顺序接收。

使用 MBT 的优点之一是,由于必须形式化行为模型,您可以获得大量反馈来 了解需求。 在早期阶段,就能发现歧义、矛盾和缺少上下文的情况。 因此,系 统需求务必是准确而形式化的,如:

R1.

Users must receive a response for a logon request.

R2.

Users must receive a response for a logoff request.

R3.

Users must receive a response for a list request.

R4.

List response must contain the list of logged-on users.

R5.

All logged-on users must receive a broadcast message.

R6.

Messages from one sender must be received in order.

Spec Explorer 项目从测试系统的角度使用操作来描述与 SUT 的交互。 这些 操作可以是表示从测试系统到 SUT 的触发动作的调用操作,可以是捕获来自 SUT 的响应(如果有)的返回操作,还可以是表示从 SUT 发送的自治消息的事件操作 。 调用/返回操作是阻塞操作,因此它们在 SUT 中由单个方法来表示。 这些都 是默认操作声明,而“event”关键字用于声明事件操作。 图 1 是聊 天系统中的操作声明。

图 1 操作声明

// Cord codeconfig ChatConfig{action void LogonRequest(int user);action event void LogonResponse(int user);action void LogoffRequest(int user);action event void LogoffResponse(int user);action void ListRequest(int user);action event void ListResponse(int user, Set<int> userList);action void BroadcastRequest(int senderUser, string message);action void BroadcastAck(int receiverUser, int senderUser, string message);// ...}