Spirent TestCenter 自动化中文版教程(九)门道初探之Result基础

文摘   科技   2024-03-08 12:02   北京  
      

  关注作者了解更多精彩内容

前文回顾




前文对前几期的内容进行了基础实践,带领大家使用Spirent TestCenter进行了基础内容复习,希望大家能够娴熟使用我们常用的API命令,自己创建一套自动化流程代码

往期文章:

Spirent TestCenter 自动化使用指南


我们在使用Spirent TestCenter进行自动化或者手工操作的时候,会查看、保存、分析流量结果。接下来我将在前文的基础上,给大家讲解一下使用Spirent TestCenter的客户端与TCL自动化脚本,进行流量结果的查询、刷新、清除与保存。在这之前我们先要进行一些初始化操作,脚本如下:


# import packageputs "导入SpirentTestCenter包"package require SpirentTestCenter
# creat projectputs "创建项目"set hProject [stc::create project]
# create portputs "创建端口"set szChassisIp 10.61.32.98set hPortTx [stc::create port -under $hProject -location //$szChassisIp/4/5 -useDefaultHost False ]set hPortRx [stc::create port -under $hProject -location //$szChassisIp/4/6 -useDefaultHost False ]
# attach Portputs "占用端口"stc::perform attachPorts -portList [list $hPortTx $hPortRx] -autoConnect TRUE


01
订阅结果


Subscribe:订阅是获取结果的第一步。在自动化脚本执行中,必须通过订阅结果API,才能使用其他API获取到想要的数据结果,否者获取到的结果为空。我们简单查看一下订阅结果的代码格式,然后给大家逐一讲解其中的参数含义。

stc::subscribe -parent handle -ConfigType resultParentType -ResultType resultType -FileNamePrefix filenamePrefix -Interval seconds -ViewAttributeList allrList -RecordsPerPage  256
里面主要参数为:Parent、ResultType、ConfigType。这三个参数是API的必要参数,其他FilenamePrefix,Interval,ViewAttributeList,RecordsPerPage参数是非必要参数,如果不填写,会有默认值。对于这些参数我会一一解释说明。 FilenamePrefix是指我们存储csv文件的名称,默认为空。Interval是指获取数据刷新间隔时间,默认值为1s。ViewAttributeList是指写入csv文件的结果列表,该参数为ResultType参数的一组属性或所有属性,默认为空,表示为所有属性。RecordsPerPage指的是csv文件每页记录数量,默认为100,最高值为256。

我们常用的订阅代码,主要分为两类,一类是对端口进行统计,一类是对stream进行统计。对应的GUI图片展示也一同放在下方。


端口统计(Generator与Analyzer的不同在于Generator是对发送流量统计,Analyzer是对接收流量统计):


set result1 [stc::subscribe -parent project1 -ConfigType Generator -ResultType GeneratorPortResults]set result2 [stc::subscribe -parent project1 -ConfigType Analyzer -ResultType AnalyzerPortResults]

端口-GUI界面:我们通过红色标记的观察模式,对端口查看通过Analyzer与Generator订阅产生的结果。


stream统计(同样TxStreamResults统计发送流量,RxStreamSummaryResults统计接收流量):


set result3 [stc::subscribe -parent project1 -ConfigType StreamBlock -ResultType TxStreamResults ]set result4 [stc::subscribe -parent project1 -ConfigType StreamBlock -ResultType RxStreamSummaryResults]

stream-GUI界面:我们通过红色标记的观察模式,对端口查看通过streamblock订阅产生的结果。

subscribe代码执行结果:

大家看到上面的代码以及执行结果,观察到subscribe(API)使用三个参数就可以执行订阅操作。这三个参数是必要参数,其余参数为非必要参数,视具体情况添加。那么这三个参数的定义是什么,如何使用,以及可以填写的参数内容有哪些?接下来给大家逐一阐述。
subscribe参数讲解表:


Parent

填写的参数必须是Porject对象,可以填写自己创建的Project类或者使用system下自动创建的Project类(上面代码使用project对象就是后者)

ConfigTypeConfigType是ResultType的父类,是既定参数,在文档里面可查到每个ResultType对应的父类,例如AnalyzerPortResults的父类就是Analyzer。常用的configtype参数有Analyzer,Generator,streamblock。
ResultType

结果类型是已经创建好的数据对象,不需要您单独创建,只需要根据已有的参数填入其中。ResultType可以在文档中通过对应的ConfigType查看其ResultChild,或者通过代码使用Spirent TestCenter获取configtype下的ResultChild

对于上面说到的ConfigType对应的ResultChild,下表将AnalyzerGeneratorstreamblock三种ConfigType的ResultChild展示在下方。大家可以自行尝试订阅不同参数,获取结果,查看有什么差异。
ConfigType对应ResultType表格:
AnalyzerAnalyzerPortResultsDiffServResultsFilteredStreamResultsInterestingStreamsResultsOverflowResultsPortAvgLatencyResultsRxCpuPortResultsRxStreamResultsStreamThresholdResults
GeneratorGeneratorPortResultsTxCpuPortResults
streamblockRxStreamBlockResultsRxStreamSummaryResults, RxStream,TxStreamBlockResultsTxStreamResults

tips:我们上面提到的Interval设置获取数据间隔的时间,同样也可以在Project下的ResultOptions里面设置。我们需要设置TimedRefreshResultViewModeTimedRefreshInterval参数

参数名称定义参数
TimedRefreshInterval当TimedRefreshResultViewMode 选择 PERIODIC 模式为时,以秒为单位定义刷新间隔Default: 10

Range: 1 - 65535

TimedRefreshResultViewMode自动刷新不实时更新结果的结果视图。

Default: MANUAL

MANUAL:不会自动刷新结果视图。

CONTINUOUS:结果视图不断刷新。

PERIODIC:

根据 TimedRefreshInterval 中定义的时间间隔刷新结果视图。

set hProject [stc::create project]set ResultOptions(1) [lindex [stc::get $hProject(1) -children -ResultOptions]0]stc::config $ResultOptions(1) -TimedRefreshResultViewMode "PERIODIC" TimedRefreshintterval "1"



















0

2

获取结果


在使用subscribe(API)前,我占用了两个端口,在两个端口分别创建了一个Device1与Device2,然后创建了一个bound StreamBlock。创建完成以后,开始订阅,一共订阅了四组变量。然后打了一个100size的burst流。我们可以在上面的端口-GUI与stream-GUI图片分别看到结果内容,接下来我们使用API-Get去获取结果数据。

取获结果主要为两种方式,我们把这两种方法分为A与B,A是通过订阅的resultdataset获取结果,B是通过端口(Port)或者流(stream)获取结果,我们可以根据以下代码取作为参考,获取不同情况下,需要的数据结果。

A方法执行代码如下:

#通过设置的变量result获取结果set Generator_List [stc::get $result1 -resultchild]foreach element $Generator_List {  puts "Generator发送:[stc::get $element -GeneratorSigFrameCount] 端口:[stc::get [stc::get $element -parent] -parent]"}set Anlyzer_List [stc::get $result2 -resultchild]foreach element $Anlyzer_List {  puts "Anlyzer接收:[stc::get $element -SigFrameCount] 端口:[stc::get [stc::get $element -parent] -parent]"}  set TxRsult [stc::get [stc::get $result3 -resultchild] -FrameCount]set RxRsult [stc::get [stc::get $result4 -resultchild] -SigFrameCount]set streamBlock_1 [stc::get [stc::get $result4 -resultchild] -parent]puts "流量名称:[stc::get $streamBlock_1 -Name] 接收流量大小:$TxRsult 发送流量大小:$RxRsult "

B方法执行代码如下:

#我们在卡面创建一个streamblock 设置为StreamBlock1puts "获取本次端口$txport$rxport Tx和Rx结果统计"array set port1_Tx_result [stc::get $hPortTx.generator.generatorportresults]array set port1_Rx_result [stc::get $hPortTx.analyzer.analyzerportresults]array set port2_Tx_result [stc::get $hPortRx.generator.generatorportresults]array set port2_Rx_result [stc::get $hPortRx.analyzer.analyzerportresults]puts "TxPort统计信息:发送:$port1_Tx_result(-GeneratorSigFrameCount),接收:$port1_Rx_result(-SigFrameCount)"puts "RxPort统计信息:发送:$port2_Tx_result(-GeneratorSigFrameCount),接收:$port2_Rx_result(-SigFrameCount)"puts "获取本次流量$StreamBlock1,Tx和Rx结果统计"array set streamblock1_Tx_result [stc::get $StreamBlock1.TxStreamResults]array set streamblock1_Rx_result [stc::get $StreamBlock1.RxStreamSummaryResults]puts "流量名称:[stc::get $StreamBlock1-name],接收端口:$streamblock1_Rx_result(-RxPort),发送:$streamblock1_Tx_result(-FrameCount),接收:$streamblock1_Rx_result(-SigFrameCount)"

Port获取结果:

StreamBlock获取结果:

03
刷新数据


我们获取数据的操作,主要是在打流操作的过程中,或者打流结束后。我们立即执行获取流量的API,获取的结果可能会数据不全面,这个时候我可以使用Perform调用RefreshResultView 命令,刷新我们当前的数据结果。
puts "刷新本次结果数据"set hSubscribe [stc::subscribe -parent project1 -ResultType GeneratorPortResults -ConfigType Generator]stc::perform RefreshResultView -ResultDataSet $hSubscribe

04
清除数据


在我们执行测试例中,需要清除数据重新开始时进行收发数据流,获取数据;或者在自动化测试的过程中,需要对其中的stream Block数据清除,重新统计时,我们都要用到清除命令。我们可以使用以下的API去清除我们的已有数据结果 。
执行代码:
#清除数据移动有三种方法puts "清除所有数据统计"stc::perform ResultsClearAll -ExecuteSynchronous True -portList [stc::get project1 -children-Port]stc::perform ResultsClearView -ResultDataset desultdataset1stc::perform ResultsClearView -ResultList rxstreamsummaryresultsX

05
保存数据


我们在自动化运行过程中,对于重要的节点,需要进行数据保存。我们可以使用以下的API去保存我们的已有db数据结果 。注意loopMode后面填写的参数分为两种:appendoverwrite,前者是追加数据,后者是覆盖原来的数据。
set dbfile "C:/Users/**/Desktop/ResultData/SavedbResult.db"stc::perform SaveResults -ResultFileName $dbfile -SaveDetailedResults True -loopMode "append"set pacpfile "C:/Users/**/Desktop/ResultData/SavePacpResult.pacp"stc::perform CaptureDataSaveCommand

Tips1保存抓包文件,分步骤为先去配置抓包参数,开始抓包,打流(然后停流),停止抓包,保存pacp文件。

#配置抓包参数set hCapture [stc::get $hPortTx -children-Capture]stc::config $hCapture -mode "REGULAR_MODE" -srcMode "TX_RX_MODE"#开始抓包stc::perform CaptureStartCommand -CaptureProxyId $hCapture #停止抓包stc::perform CaptureStopCommand -CaptureProxyId $hCapture #保存pacp文件set pacpfile "C:/Users/**/Desktop/ResultData/SavePacpResult.pacp"stc::perform CaptureDataSaveCommand -CaptureProxyId $hCapture -FileName $pacpfile

Tips2保存结果中会,如果不设置保存路径,会有一个默认路径,我们可以提供过命令查看默认路径。

array set sysPaths [stc::perform GetSystemPaths]set userDataPath $sysPaths(-UserDataPath)set commonDataPath $sysPaths(-CommonDataPath)set sessionDataPath $sysPaths(-SessionDataPath)#输出结果-UserDataPath {C:/Users/user/Documents/Spirent/TestCenter x.xx/} -CommonDataPath {C:/ProgramData/Spirent/TestCenter x.xx/} -SessionDataPath {C:/Users/Qhan/Documents/Spirent/TestCenter x.xx/Logs/2024-03-07_10-06-23/}

Tips3如果我们想要修改或者配置log文件的设置,可以修改stcbll.ini文件。在windows系统下,默认位置为:

C:\Program Files\Spirent Communications\Spirent TestCenter <version>\Spirent TestCenter Application#举例,要想定期删除日志#打开stcbll.ini#找到[logger]#添加 maxLifeTimeInDays=1

主要可以添加修改参数如下:

maxLifeTimeInDays:在记录后日志保存天数

maxFileSizeInMB:-日志文件的最大大小。当达到文件大小限制时,当前的bll.log将被备份到一个新的文件中(例如bll.log.1),并且当前的日志消息将继续写入bll.log中。(单位)

maxBackup:创建的最大备份文件数,如果达到限制,则删除最旧的备份。outputDirectory:保存日志文件的目录。举例:

outputDirectory=D:/mydir/mylogs

代码总流程:

# 导入SpirentTestCenter包puts "导入SpirentTestCenter包"package require SpirentTestCenter
#创建项目puts "创建项目"set hProject [stc::create project]
#创建端口puts "创建端口"set szChassisIp 10.61.32.98set hPortTx [stc::create port -under $hProject -location //$szChassisIp/4/5 -useDefaultHost False ]set hPortRx [stc::create port -under $hProject -location //$szChassisIp/4/6 -useDefaultHost False ]
#占用端口puts "占用端口"stc::perform attachPorts -portList [list $hPortTx $hPortRx] -autoConnect TRUE
#订阅结果数据puts "订阅结果数据"set result1 [stc::subscribe -parent project1 -ConfigType Analyzer -ResultType AnalyzerPortResults]set result2 [stc::subscribe -parent project1 -ConfigType Generator -ResultType GeneratorPortResults]set result3 [stc::subscribe -parent project1 -ConfigType StreamBlock -ResultType TxStreamResults ]set result4 [stc::subscribe -parent project1 -ConfigType StreamBlock -ResultType RxStreamSummaryResults]

#创建device1puts "创建device1"set TEmulatedDevice [stc::create "EmulatedDevice" -under $hProject -AffiliatedPort $hPortTx -Name {Tdevice}]#创建以太协议puts "创建以太协议"set eth2 [stc::create "EthIIIf" -under $TEmulatedDevice]
#set eth2 [stc::create "EthIIIf" -under $TEmulatedDevice -SourceMac "00:10:94:00:00:02" -SrcMacStep " 00:00:00:00:00:01" -SrcMacStepMask "00:00:FF:FF:FF:FF" -SrcMacRepeatCount 0]#Generated values will be 00:10:94:00:00:02, 00:10:94:00:00:03, 00:10:94:00:00:02, 00:10:94:00:00:03, and so on.
# Create Vlan#set TVlan [stc::create "VlanIf" -under $TEmulatedDevice -VlanId "100" -StackedOn $eth2]
# Create Ipv4Ifputs "创建IPV4协议"set Ip2 [stc::create "Ipv4If" -under $TEmulatedDevice -StackedOnEndpoint-targets $eth2 -Address "192.168.11.2" -Gateway "192.168.11.1"]#expample#set Ip2 [stc::create "Ipv4If" -under $TEmulatedDevice -StackedOn $TVlan -Address "192.168.11.2" -Gateway "192.168.11.1"]#Address = 1.1.1.1, AddrRepeatCount = 0, AddrStep = 0.0.0.1, AddrStepMask = 0.0.0.255, IfRecycleCount = 3#The generated values for Address will be 1.1.1.1, 1.1.1.2, 1.1.1.3, 1.1.1.1, 1.1.1.2, 1.1.1.3, and so on.
#load Configputs "加载配置"stc::config $TEmulatedDevice -TopLevelIf "$Ip2"stc::config $TEmulatedDevice -PrimaryIf-targets "$Ip2"stc::apply
# Create EmulatedDevice2set REmulatedDevice [stc::create "EmulatedDevice" -under $hProject -AffiliatedPort $hPortRx -Name {Rdevice}]
# Create EthIIIfset eth3 [stc::create "EthIIIf" -under $REmulatedDevice]
# Create Vlan#set TVlan [stc::create "VlanIf" -under $REmulatedDevice -VlanId "100" -StackedOn $eth3]
# Create Ipv4Ifset Ip3 [stc::create "Ipv4If" -under $REmulatedDevice -StackedOnEndpoint-targets $eth3 -Address "192.168.11.1" -Gateway "192.168.11.2"]
#load Configstc::config $REmulatedDevice -TopLevelIf "$Ip3"stc::config $REmulatedDevice -PrimaryIf-targets "$Ip3"stc::apply
# Create StreamBlockputs "创建stream流"set StreamBlock1 [stc::create "StreamBlock" -under $hPortTx]stc::config $StreamBlock1 -SrcBinding-targets " $Ip2 "stc::config $StreamBlock1 -DstBinding-targets " $Ip3 "
#Load Configurationstc::apply
puts "清除所有结果记录"stc::perform ResultsClearAllputs "启动流量"stc::perform GeneratorStart
#set streamList#set hStreams [StreamBlock1]#puts "启动流量"#stc::perform StreamBlockStartCommand -StreamBlockList $hStreams#puts "停止流量"#stc::perform StreamBlockStopCommand -StreamBlockList $hStreams
puts "等待10s"stc::sleep 10puts "停止流量"stc::perform GeneratorStopputs "等待2s"stc::sleep 2
#get Generator_List Resultputs "获取端口发送的流量"set Generator_List [stc::get $result2 -resultchild]foreach element $Generator_List { puts "Generator发送:[stc::get $element -GeneratorSigFrameCount] 端口:[stc::get [stc::get $element -parent] -parent]" }
#get Anlyzer_List Resultputs "获取端口接收的流量"set Anlyzer_List [stc::get $result1 -resultchild]foreach element $Anlyzer_List { puts "Anlyzer接收:[stc::get $element -SigFrameCount] 端口:[stc::get [stc::get $element -parent] -parent]" }set TxRsult [stc::get [stc::get $result3 -resultchild] -FrameCount]set RxRsult [stc::get [stc::get $result4 -resultchild] -SigFrameCount]set streamBlock_1 [stc::get [stc::get $result4 -resultchild] -parent]puts "流量名称:[stc::get $streamBlock_1 -Name] 接收流量大小:$TxRsult 发送流量大小:$RxRsult "
puts "保存配置文件在执行路径下$env(TCL_RUNNING_DIR)stc_demo.xml"stc::perform SaveAsXmlCommand -FileName $env(TCL_RUNNING_DIR)stc_demo.xml
puts "断开机框连接"stc::disconnect $szChassisIpputs "退出进程"exit

以上就是Spirent TestCenter关于Result的自动化代码,讲解到此结束,谢谢大家观看。


关键词
Spirent TesterCenter,Tcl,Automation,Subscribe,Analyzer,Generator,StreamBlock,STC,SaveResult,自动化

延伸阅读:
Spirent TestCenter 自动化中文版教程(一)书山有路之Hello World!
Spirent TestCenter 自动化中文版教程(二)门道初探之port基础
Spirent TestCenter 自动化中文版教程(三)门道初探之port技巧
Spirent TestCenter自动化中文教程(四)门道初探之调试技巧
Spirent TestCenter自动化中文教程(五)门道初探之streamBlock基础

Spirent TestCenter 自动化中文版教程(六)门道初探之Device和绑定流

Spirent TestCenter 自动化中文版教程(七)门道初探之Generator基础 

Spirent TestCenter 自动化中文版教程(八)门道初探之基础实践 


联系我们:

思博伦官方网站: www.spirent.cn

技术中心热线:400-810-9529

支持邮箱:support@spirent.com

售后网站:support.spirent.com


版权归思博伦通信科技(北京)有限公司所有,思博伦技术中心(SpirentServices)原创发布,转载请联系授权。


长按识别二维码,关注思博伦技术中心

思博伦技术中心
思博伦技术中心由思博伦全球服务部的技术团队管理和维护。我们致力于提供完善的技术支持,并定期更新。通过我们的微信平台您将获取最新的产品发布信息,全面的产品使用技巧,实用的常见问题解决方案,以及完善的售后服务流程。
 最新文章