什么是基于模型测试
 
   基于模型的测试就是基于描述程序如何动作的模型的测试。该模型用于自动生成测试用例,并作为检查ITU(Implementation Under Test,被测实现)是否可以通过测试的预言(Oracle)。
 
   我们将测试区分为在执行前生成测试的 离线先验测试和在执行中生成测试的 在线运行时测试。每个测试用例都是一个 运行(run),这是一个包含方法调用顺序的行为实例。在两种测试中测试用例都是通过模型程序生成的。在离线测试中使用otg(Offline Test Generator,离线测试生产器)工具,探索器(Exploration)生成一个有限状态机(FSM),有限状态机生成一个场景(Scenario),该场景就会保存为一个文件,之后ct(Conformance Tester,一致性测试器)工具通过运行场景来执行测试。而在线测试中,ct在运行中创建场景。ct工具锁步地执行模型测试和IUT;IUT在探索器执行其在模型程序中相应的方法的同时执行其方法,模型程序作为检查IUT的预言。
 
   为了使用ct,你必须提供一个或多个模型程序并编写将你的IUT和工具联系起来的 测试套件(Test Harness)。如果你提供了多个模型程序,ct将他们结合起来并探索它们的构成。在这种上下文中,通常要使用构成来限制探索到某种特定的场景。如果你愿意,你可以通过C#写一个ct可以用来根据你定义的标准来最大化测试覆盖率的自定义策略。
 
   我们区分IUT测试工具可以依照需求执行的 可控动作(Controllable Action)和测试工具只能观测的 可观测动作(Observable Action)。方法调用是可控动作,而事件(包括消息到达或键盘输入和鼠标点击等用户输入)是可观测动作。可观测动作通常是不确定的:对于测试者不可能预测几个可观测的动作中接下来会发生哪个。我们可以根据可控性和确定性来划分系统。 封闭系统(Closed System)是完全可控并且是确定的。 反应系统(Reactive System)同时有可控和可观测的动作。有些系统是不可控的,只有可观测系统,一个日志文件就是这样系统的一个简单例子。
 
   有些测试工具只能处理封闭系统。这些工具可以通过创建 沙盒(Sandbox)来测试反应系统,在沙盒中通常可以利用测试套件(可以用于生成需要的消息或事件)使得可观测动作可控。但是沙盒是不现实和技术上也不是都可行。ct工具可以支持可观测事件,这意味着它可以测试在网络连接另外一端的IUT。运行时测试适用于反应系统因为它可以有效处理不确定性。
 
   后记:希望以这篇翻译启动对心往已久的基于模型测试的学习。不过由于还处于学习阶段并且中文资料相对较少,翻译中有很多困恼和不确定的地方,还望博友见谅。同时期待可以希望大家可以多提出问题,一起讨论。
 
摘自:Model-Based Software Testing and Analysis with C#