基于模型的测试工具: Spec Explorer
一、什么是基于模型的测试
Wiki的描述如下:基于模型的测试属于软件测试领域的一种测试方法。按照此方法,测试用例可以完全或部分的利用模型自动产生。以上所说的模型通常是指对被测系统(SUT,system under test)某些(通常是功能性的)方面的描述。
模型一般都是对被测系统(SUT,system under test)预期行为动作的抽象描述。 这些测试用例的集合就是我们平时所称的抽象测试套件(abstract test suite). 抽象测试套件不可以直接执行于需测试的系统,因为,他们不在同一抽象级别。
测试套件(test suites)是由模型生成,而不是由源代码生成。因此,基于模型的测试又常常被当作黑盒测试的一种形式。但从某种层面来说, 这并不十分准确。毕竟,基于模型的测试是与源代码级的测试覆盖率,以及对代码的功能测试都有着很大的关系。
对于复杂的软件系统中,如何应用基于模型的测试还在探索中。
在Spec Explorer的有篇文章:http://blogs.msdn.com/sechina/archive/2009/11/19/9925129.aspx,文章对基于模型的测试作了描述,并给出了一张简图进行说明:
基于模型的测试是一个轻量级的,形式化的验证软件系统的方法。为什么这么说呢,因为首先,基于模型的测试对待测软件系统(通常被称为System Under Test,简称SUT)进行形式化的建模,设计出机器可读的模型;其次,和其他形式化方法比,基于模型的测试并不致力于让待测软件系统与规格说明在所有可能情况下都保持一致,而是系统化的从模型生成一组测试用例,使用这组测试用例测试待测软件系统,得到充分的证据说明待测系统的行为与模型期望是一致的。轻量级和重量级的方法的根本区别在于一个是充分证明,一个是完全证明。目前完全验证一致性的代价非常高,重量级的形式化方法往往难以被应用到实际工程中,而基于模型的测试在这方面体现了优势,并已被运用到很多大型项目中。
二、基于模型测试工具Spec Explorer
Spec Explorer是微软发布的一款与Visual Studio紧密整合的基于模型测试的工具。用户可以通过Spec Explorer对一个软件系统的期望行为进行建模,并自动生成能够在Visual Studio的测试框架下运行的测试代码。模型可以用当前主流的程序设计语言C#开发,然后通过Cord语言脚本对模型进行配置和裁剪。
模型可以图形表达方式查看,帮助理解分析软件系统预期行为,或与其他人沟通。模型的大小可以通过正则表达式来界定,而产生的测试套件不仅能够在单独的Visual Studio测试框架中运行,也能够在其他单元测试框架中运行。
微软的多个不同规模的项目都已将Spec Explorer 纳入为开发流程的一部分。使用Spec Explorer 帮助这些团队更快速创建测试用例、确保需求覆盖的可预见性并提供项目生命周期管理及软件更新的支持。
InfoQ上朱永光11月发布了一篇文章用Spec Explorer进行基于模型的测试,文章里提到了Spec Explorer分别提供了Visual Studio 2008和Visual Studio 2010的版本,同时也提供了详细的文档供大家学习使用,还有介绍视频,对核心作者的访谈。这些都是了解和学习Spec Explorer这个工具的资源。
- Havel定理
- React技巧1(状态组件与无状态组件的使用)
- zoj 1315 Excuses, Excuses!
- ZOJ 2724 Windows Message Queue(优先队列)
- React多页面应用7(引入eslint代码检查)
- Trie树
- React第三方组件1(路由管理之Router的使用⑤按需加载-下)
- zoj 2876 Phone List
- PHP小知识
- Where's Waldorf?
- POj 1797 Heavy Transportation
- 卡特兰数简介原理性质应用参考:
- UVA Machined Surfaces
- NBUT 1117 Kotiya's Incantation
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- LeetCode38|根据字符出现频率排序
- 搭建简易的物联网服务端和客户端-Nodejs_PM2(十八)
- spring boot 项目中自动执行 sql 语句
- 搭建简易的物联网服务端和客户端-邮件通知(十九)
- LeetCode37|两颗二叉搜索树中所有元素
- LeetCode45|数组中重复的数据
- 搭建简易的物联网服务端和客户端-网络控制(二十)
- LeetCode44|在每个树行中找最大值
- LeetCode43|最大层内元素和
- 搭建简易的物联网服务端和客户端-Maibu控制(二十一)
- LeetCode42|层数最深叶子节点的和
- LeetCode41|数组中数组出现的次数
- Django后台管理界面修改(源文件修改)
- 前端工程师不可不知的Nginx知识
- Django1.11 简单登录注册