许多需求用状态机的方式来描述,状态机的测试主要关注在测试状态转移的正确性上面。对于一个有限状态机,通过测试验证其在给定的条件内是否能够产生需要的状态变化,有没有不可达的状态和非法的状态。可能不可能产生非法的状态转移等。对于被测系统,若我们可以抽象出它的若干个状态,以及这些状态之间的切换条件和切换路径,那么可以从状态迁移路径覆盖的角度来设计用例对该系统进行测试。状态迁移法的目标是设计足够的用例达到对系统状态的覆盖、状态-条件组合的覆盖以及状态迁移路径的覆盖。

  状态迁移法的思想是提供将多个状态的转换串联起来进行测试的思路。该方法适合测试各种状态的转换,而且这些状态转换的测试在实践中是易遗漏的。例如像手机、MP3等,都可以使用状态迁移法对使用状态的迁移(即用户使用场景的转换)进行测试。

  状态迁移法的使用:

  步骤一:根据需求提取全部状态;

  步骤二:绘制状态迁移图;

  步骤三:根据状态迁移图推导测试路径(状态迁移树);

  步骤四:选取测试数据,构造测试用例。

  例子:

  一、需求: 路人甲打电话预订飞机票,要去某地。

  二、分析:

  1、测试需求分析:

  a)客户向航空公司打电话预订机票。此时,机票信息处于“完成预订”状态;

  b)顾客支付了机票款项后,机票信息变为“已支付”状态;

  c)客户当天到达机场并使用身份证换领登机牌后,机票信息变为“已出票”状态;

  d)检票登机后,机票信息变为“已使用”状态;

  e)在登机前,可以取消自己的订票信息,若已支付机票费用,则可以退回票款。

  取消后,订票信息处于“已取消”状态;

  由以上分析得出客户预订机票时订单的全部状态:

  完成预定、已支付、已出票、已使用、已取消;

  2、测试设计方法分析(状态迁移法):

  a)状态迁移图:

  b)测试路径(状态迁移树):

  由状态迁移图得出的测试路径:

  (1)A->B->E;

  (2)A->B->C->E;

  (3)A->B->C->D。

  3、用例设计(输入部分):

  (1)完成预定->已支付->已取消;

  (2)完成预定->已支付->已出票->已取消;

  (3)完成预定->已支付->已出票->已使用;

  三、用例详细:

  略

  总结:

  状态迁移法实际测试了被测系统各种状态的转换,这些状态转换的测试在实际工作中是容易遗漏的,只要能够将这些状态的转换测试到,是否采用状态迁移法并不重要,因为状态迁移法只是提供了一种将多个状态的转换串联起来进行测试的思路。

  实际工作中,在业务流程中都涉及到了复杂的业务场景(即业务状态的迁移)。而这些业务场景在需求规格中往往不能够完全阐述清楚,容易出现遗漏。所以当被测系统的业务场景复杂时,在工程中应用这种针对状态迁移测试的思路完成对复杂业务场景的测试有时是很有必要的。