TTCN-3简介
简介 本胶片介绍了使用TTCN-3进行测试的系统架构,重点讲述了TTCN-3的语法和特性,最后介绍如何使用TTCN-3集成开发工具GTR进行TTCN-3测试套的开发。希望对准备在开发环境GTR下进行TTCN-3测试套开发的测试人员有所帮助。
TTCN-3概述
TTCN-3 TTCN-3:测试与测试控制记法(Testing and Test Control Notation-Version3), TTCN-3是 由ETSI(欧盟通讯标准研究院)所设计,并公布成为ETSI ES 201 873系列之标准文件,以及ITU-T(国际通讯联盟)的ITU-T Rec. Z.140系列之标准文件。 标准化的测试描述和测试实现语言。 TTCN-3具有更精准的测试逻辑语法,可以描述更复杂的测试行为; TTCN-3可用于多种类型的测试,包括符合性测试(Conformance Testing)、互操作性测试(Interoperability Testing)、健全性测试(Robustness Testing)、回归测试 (Regression Testing)、系统和整合测试(System and Integration Testing)、以及负载测试(Load/Stress Testing)。
TTCN发展 TTCN-1概念始于80年代中期,主要应用于OSI体系协议一致性测试。
TTCN-3主要特性 描述动态并发测试配置的能力; 基于过程的操作和基于消息的通信; 描述编码信息和其他属性(包括用户扩展性)的能力; 描述数据和带有强有力的匹配机制的属性模板的能力; 类型和值的参数化; 赋值和测试判定的处理; 测试套参数化和测试例选择机制; TTCN-3和ASN.1的结合 良好定义的语法,格式的互换以及静态语义; 不同的表示格式(如:表格和图形表示格式,目前暂不支 持);
TTCN-3语法介绍
基本概念 基本概念-测试组件: 抽象测试系统接口(ATSI),也可以叫系统测试组件(STC) 主测试组件(MTC) 并行测试组件(PTC) 共有三种类型测试组件: 抽象测试系统接口(ATSI),也可以叫系统测试组件(STC) 主测试组件(MTC) 并行测试组件(PTC)
基本概念-通信端口 基于消息通信的端口 基于过程通信的端口 混合型端口 通过端口完成测试组件之间的通信 每个通信端口被抽象成一个先入先出队列 端口(port)具有方向性(in,out, inout) 支持三种端口类型: 基于消息通信的端口 基于过程通信的端口 混合型端口
基本概念-动态测试配置 创建组件 启动组件 并发执行
基本概念-动态测试配置 连接端口 映射端口
基本概念-测试判决 测试判决:none < pass < inconc < fail < error 每一个测试组件可以设置(setverdict)或者获取(getverdict)自己的局部判决。 测试用例中止执行时,返回一个全局的判决。 全局判决由各个测试组件的局部判决决定。
TTCN-3测试套结构 Module (…) Module Definitions Module Control Attributes 模块(Module)是TTCN-3的基本构造块。 一个模块由定义部分(可选的)和一个模块控制部分(可选的)组成。 通常所说的一个测试套就是一个模块。 模块可以参数化(跟TTCN Runner中的赋值一致)。 一个模块可以从其他模块中引入定义。 模块可以定义属性(Attributes)。 Attributes Module (…) Module Control Module Definitions
模块定义部分
模块定义 所有定义在整个模块中都是全局的。 Test Cases Named Alternatives Functions Test Components Communication Ports Signature Templates Data Templates RP Signatures Constants Data Types 模块定义 所有定义在整个模块中都是全局的。 类型定义(Data Types)都是基于预定义类型和结构类型(包括从其他非TTCN-3语言ASN.1定义中引入的类型) 模板(Templates)和原型(Signature) 定义测试数据。 端口(ports)和 测试组件(Components) 在动态测试配置过程中使用。 函数(Functions),测试步(Altsteps),测试用例(testcase)用来定义测试行为。
TTCN3数据类型定义 简单基本类型 基本串类型 结构类型 特殊数据类型 特殊配置类型 特殊默认类型 类型 关键字 Sub-type integer range, list char universal char float boolean list objid verdicttype 基本串类型 bitstring list, length hexstring octetstring charstring range, list, length universal charstring 结构类型 record,set record of,set of enumerated union 特殊数据类型 anytype 特殊配置类型 address,port,component 特殊默认类型 default
数据类型定义-整型 /* 整型范围约束定义 */ type integer MyIntegerRange (1 .. 100) type integer MyIntegerRange (0 .. infinity) /* 整型列表约束定义 */ type integer MyIntegerList (1 , 2, 3, 4) /* 混合约束定义 */ type integer MyIntegerListAndRange (1 ..5, 7, 9)
数据类型定义-结构类型 // record 结构类型定义 type record MyMessageType { integer field1 optional, boolean field2 } // record 值定义 var MyMessageType MyMessage := { field1 := 1, field2 := true // 单独的域赋值 MyMessage.field2 := false
数据类型-与ASN.1类型兼容 ASN.1 类型 等效的TTCN-3类型 BOOLEAN boolean INTEGER integer REAL (note1) float OBJECT IDENTIFIER objid BIT STRING bitstring OCTET STRING octetstring SEQUENCE record SEQUENCE OF record of SET set SET OF set of ENUMERATED enumerated CHOICE union VisibleString char(note2), charstring IA5String UniversalString universal char(note2), universal charstring 数据类型-与ASN.1类型兼容
数据定义-模板 模板(Templates)用于传送一个特定值的集合或是测试接收的值的集合是否与模板说明匹配。 模板具有以下特性: 模板可继承,便于组织数据和重复利用数据 模板能够被参数化 模板允许定义匹配机制,经常被使用来定义可能接收消息的值或者可能的远程调用过程响应 模板同时支持基于消息的通信和基于过程的通信 模板支持简单类型和复合类型
数据定义-模板匹配机制
数据定义-参数化模板 // 参数化模板 template MyMessageType MyMessage (integer MyPar) := { field1 := MyPar, field2 := true, field3 := ‘110011’B } // 模板调用 P1.send(MyMessage(1));
数据定义-模板继承 template MyMessageType MyMessage1 { field1 := 123, field2 := true } template MyMessageType MyMessage2 modifies MyMessage1 { field2 := false // 等效下面的写法 template MyMessageType MyMessage3 field2 := false
动态测试配置 动态测试配置-测试组件 测试组件(Test Component)是测试行为执行的实体(并行)。 测试组件的声明都是局部的。 测试组件必须包含一个通信端口列表。 在测试执行过程中是通过create,connect,map等操作来完成动态测试配置的。 Test Component Local Declarations Ports Used
动态测试配置-通信端口定义 // 基于消息的端口定义 type port MyMessagePortType message { in MsgType1, MsgType2; out MsgType3; inout integer } // 基于过程的端口定义 type port MyProcedurePortType procedure out ProcedureSignature1, ProcedureSignature2
动态测试配置-测试组件定义 // 测试组件类型定义 type component MyComponentType { // 局部变量声明 { // 局部变量声明 var integer MyVar; timer MyTimer; // 测试组件使用的端口列表 MyMessagePortType P1, P2; MyProcedurePortType P3 }
测试行为描述 测试行为描述-函数 函数是描述测试行为的基本块。 函数包含局部变量声明和程序部分。 函数既可以只完成测试系统内部的任务,也可以通过send 和receive 与被测系统进行交互。 支持外部函数(可扩展)。 支持部分类型转换的预定义函数。 Function ( . . . ) Local Declarations Program Part
预定义函数 预定义函数提供了TTCN-3内部类型之间的转换功能以及字符串操作功能。
// 函数可以带参数,参数具有几种属性: in, out, inout . 默认属性是in。 function MyFunction (in integer MyPar) { : } // 函数可以带返回值,默认为void function MyFunction return integer
// 纯功能函数,没有涉及到端口操作。 function MyFunction { : } // 函数使用指定类型组件中的端口进行通信操作 function MyFunction runs on MyPTC PCO1.send(1);
测试行为描述-测试用例 测试用例可以认为是特殊的能够在模块控制部分执行的函数。 接口部分(runs on子句)指定了测试用例所运行的MTC的组件类型。 系统部分(system子句)指定了测试用例中需要使用的测试系统接口组件类型。 System部分可以省略,默认和MTC类型一致 Test Case ( . . . ) Interface Part System Part Behaviour Part
testcase MyTestCase() runs on MyMTCType system MyTestSystemType { : // 定义测试行为 } // 该用例只有包含MTC,没有涉及系统接口操作 testcase MyTestCase()runs on MyMTCType
测试行为描述-基本编程语句
测试行为描述-动态测试配置
// 定义一个组件类型变量 var MyComponentType MyPTC; // 创建指定类型的组件,返回组件引用 MyPTC:= MycomponentType.create // connect连接操作用来完成测试系统内部组件之间的通信 connect(MyPTC:P1, mtc:P1) // map映射操作用来完成测试组件与抽象测试接口之间的通信 map(MyPTC:P2, system:PCO)
测试行为描述-选择性行为 选择性行为由alt语句来完成。 S1 S3 S6 S2 S4 S7 S5 S8 S9 S10 S1; alt {[ ] S3; S6; [ ] S2; alt { [ ] S4; S7; [ ] S5; S8; alt { [ ] S9; [ ] S10; }
测试行为描述-alt语句执行示意图 alt guard1 event1 actions1 guard2 event2 actions2 布尔防卫表达式(可能为空,但是不能省略) 可能触发的事件 需要执行的操作语句 每进入一个alt语句时,就会照一张快照 alt guard1 event1 actions1 guard2 event2 actions2 guardn eventn actionsn
测试行为描述-可选步 可选步(Altsteps)用来描述默认行为,或构造一个alt语句的选择对象。 可选步可以调用函数和可选步,或作为默认来激活可选步。 可选步的调用可以通过默认机制隐式地完成,或是通过在alt的一个直接调用显式的完成。 对于借助于默认机制的可选步的一个隐式调用,在到达调用位置之前,必须通过activate语句将该可选步激活为一个默认。 独立的可选步的调用可以认为是仅带有一个描述显式调用该可选步的选择对象的alt语句的简写。
Altstep MyAltstep (in integer var1) runs on MyComponentType { [] MyPort.receive(MyMessage1) { setverdict(pass); } [] MyPort.receive(MyMessage2) { repeat; [] MyTimer.timeout { stop;
//在alt语句中可选步的显示调用。 Alt { [] MyPort.receive(MyMessage1) { setverdict(pass); } [] MyAltstep(1) ; [] MyTimer.timeout { stop;
//独立调用的可选步 MyAltstep(1) ; //等效于 Alt { [] MyAltstep(1) ; }
// 一个可选步激活为默认 var default MyDefVarTwo := activate(MySecondAltStep()); // 该组件在此区间的所有alt语句都会在分支没有被选中的情况下会执行默认可选步。 // 一个默认可选步去激活 deactivate(MyDefVarTwo); // 此后的所有alt语句都会在分支没有被选中的情况下不会执行默认可选步。
测试行为描述-定时器
// 启动,停止,读取定时器 MyTimer.start(20E-3);// 默认的时间单位是s MyTimer.stop; MyVar := MyTimer.read; // 检查定时器是否还在运行 if (MyTimer.running) { … } // 定时器超时 Alt { [] MyTimer.timeout }
模块控制部分
Local Control Declarations 模块控制部分 测试例定义在模块定义部分,而模块控制部分管理它们的执行。 在每个测试例启动时,测试配置将被重新设置。 如果要在行为定义中使用定义在一个模块控制部分的所有的变量、定时器等,应该通过参数化来将它们传入测试例,没有全局变量的概念。 可以使用布尔表达式选择和去选择要执行的测试例。 Control Local Control Declarations Test Case Execution
// 执行MyTestCase1,不存储返回的测试判定和时间监管 execute(MyTestCase1()); // 执行MyTestCase2,把结果判定存储在变量MyVerdict中 MyVerdict = execute(MyTestCase2()); // 执行MyTestCase3,把结果判定存储在变量MyVerdict中,如果测试例在500ms内没有终止,MyVerdict将得到值'error‘. MyVerdict = execute(MyTestCase3(),0.5);
// 测试用例多次执行。 while (x<10) { x:=x+1; execute(MyTestCase()); } // 在特定的条件下,测试用例执行。 if (MySelectionExpression) execute(MyTestCase()) ;
TTCN3测试套开发
TTCN-3测试系统组成 测试管理器 :工程管理,用例管理, 脚本编辑,日志输出 测试执行环境:脚本编译执行 被测系统适配器:测试执行环境与被测系统间的通信适配 编解码器:BER,PER,SIP ABNF,XML编解码 平台适配器:用户自定义扩展函数实现
测试构架
TTCN-3进行测试的开发步骤 用TTCN-3或其它语言(如ASN.1)描述测试数据。 用TTCN-3描述测试逻辑,生成抽象测试套。 开发适配器模块。 开发编解码模块(已经支持BER,PER,部分XER,HW自定义TLV编码方式)。 开发外部函数库(如果有特殊需要)。 执行抽象测试套,输出测试报告。
TTCN-3脚本构架
现场实例讲解
小结 本课程主要介绍了TTCN-3语言,以及如何在GTR上进行测试套开发的过程,同时介绍了目前TMC所开发的TTCN-3脚本结构,希望可以对大家使用GTR开发测试用例有所帮助。
ANY QUESTIONS?