嵌入式测试大赛实例解析

明天就是嵌入式大赛的预选赛了,今晚加班写个博客
1、安装环境

下载了官方的安装包之后,官方给出了详细的安装说明,下载请看百度网盘地址:
链接:https://pan.baidu.com/s/1ngYQK3c2P1e367SFC3Q__A 密码:dwud

1.1、首先安装VSDP,具体的文件名为:

vspdxp_install.exe

1.2、配置虚拟串口
运行

vspdconfig.exe

在弹出来的软件页面中选择

COM5
COM6

这两个串口
1.3、安装ETest软件

ETest2018大赛专版-Setup.exe

1.4、运行Etest软件-进程调度服务
1.5、运行测试设计台
1.6、打开给定的测试项目文件
1.7、在“设备规划”上点击右键,选择“编辑”,打开设备规划
1.8、.选中“物理通道”下面的“232”,打开“属性”标签页,选择“端口名”为一对虚拟串口
中的一个
1.9、运行被测软件,启动服务,选择端口号
1.10、打开测试项目中的测试“功能 2”
1.11、首先进行“环境设置”
1.12、点击“运行”
1.13、使用对话框判断测试结果
1.14、查看界面输出结果

2、例题一
题目分享:链接:https://pan.baidu.com/s/1uPS_y3bo_OLRc0FFZqpvkw 密码:rsjg

题目由一个需求文档和测试要求给出,这是关于模拟水流监控计费器的题目
2.1、定义协议:
仿真

如仿真图所示,这里定义了Protocol_1和Protocol_2以及CH_232_1三种自定义通信类型。具体的实现如下

//协议Protocol_1
Protocol Main
  Segment 包头 StandardUInt16 Default=0X55AA ByteOrder=Big
  Segment 阀门控制器ID StandardUInt8 Default=0
  Segment 水流监控计费器ID StandardUInt8 Default=0X20
  Segment 瞬时流量 StandardFloat Default=0.0
  Segment 计费标志 StandardUInt8 Default=0
  Segment 管道压力 StandardFloat Default=0.0
  Segment 校验和 CRC Algorithm=CRC_SUM_8 BitCount=16 Range=(16,0) 
  Segment 包尾 StandardUInt16 Default=0X55AA ByteOrder=Big
End

//协议Protocol_2
Protocol Main
  Segment 包头 StandardUInt16 Default=0X55AA ByteOrder=Big
  Segment 水流监控计费器ID StandardUInt8 Default=0X20
  Segment 阀门控制器ID StandardUInt8 Default=0
  Segment 瞬时流量报警标志 StandardUInt8 Default=0
  Segment 管道压力控制指令 StandardUInt8 Default=0
  Segment 校验和 CRC Algorithm=CRC_SUM_8 BitCount=8 Range=(16,0)
  Segment 包尾 StandardUInt16 Default=0X55AA ByteOrder=Big
End

//协议CH_232_1似乎是系统定义的

遇到了一个报错
报错
提示我协议没有定义,但是实际上协议是定义了的,只不过这两个东西没有嵌入起来
3、例题二
题目分享:链接:https://pan.baidu.com/s/1P16uKgLtrLjIl1o5Jo9y1Q 密码:nmbs
模拟共享单车
这道题是去年秋季赛的分区预赛题目
按照以上的操作,打开待测元器件的服务端(也就是.exe结尾的应用程序),然后打开功能3的测试

//功能三描述
2.3 位置信息的接收处理(GN_WZ)
GPS 模块定时(1s)向外发送位置信息,锁具控制模块接收并处理 GPS 发送
位置信息。
序号 数据名称 单位 范围
1 经度 度 0-180
2 经度标志位 固定值 0X45E-东经),0X57(W-西经)
3 纬度 度 0-90
4 纬度标志位 固定值 0X4EN-北纬),0X53(S-南纬)
由于位置信息是 GPS 模块定时发送的,为可靠性起见,需要进行如下容错处
理:
1、当接收到的位置信息超出范围时,该 GPS 数据帧无效,做丢包处理,锁
具控制模块使用上一帧的信息;
2、经纬度标志位不正确时,锁具控制模块使用上一帧的位置信息。
3、经度、纬度四舍五入方式保留三位小数。

测试代码示例:

import Manu
############标准测试模板#######################
## Test:测试数据执行函数体,【测试数据】每一行数据调用一次Test
## arg:输入参数
## exp:预期输出
def Test(arg,exp):
  print 'Hello World!'
  for a in arg:
    print a
  for e in exp:
    print e

  Protocol_gpstime.Hour.Value=arg[0]
  Protocol_gpstime.Minute.Value=arg[1]
  Protocol_gpstime.Second.Value=arg[2]
  Protocol_gpstime.JingDu.Value=arg[3]
  Protocol_gpstime.Flag_JD.Value=arg[4]
  Protocol_gpstime.WeiDu.Value=arg[5]
  Protocol_gpstime.Flag_WD.Value=arg[6]
  Protocol_gpstime.Write()
  show=[]
  str='输入数据:时%d,分%d,秒%d,经度%f,经度标识%d,纬度%f,纬度标识%d\n' %(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6])
  show.append(str)
  show.append(exp[0])
  passed=Manu.Check(show)
  print '测试结果:%s' %passed


# 断言:根据实际需求修改一下注释的部分 
  assertor=API.Platform.Assertion.Create()
  assertor.AddInput('时',arg[0])
  assertor.AddInput('分',arg[1])
  assertor.AddInput('秒',arg[2])
  assertor.AddInput('经度',arg[3])
  assertor.AddInput('经度标识',arg[4])
  assertor.AddInput('纬度',arg[5])
  assertor.AddInput('纬度标识',arg[6])
  assertor.AddOutput('界面显示',exp[0],passed)
  if passed:#测试通过
    assertor.Pass()
  else:
    assertor.Failed()
  b=assertor.Commit()

## Standard_Test:标准测试的方法入口,使用【测试数据】表循环调用Test方法
Standard_Test(Test)
#############################################


############自定义测试模板#######################
## 如果不希望使用测试数据驱动测试,则将【标准测试模板】删除,使用【自定义模板】
## 否则可以删除本节
#def Main():
#  print 'Hello world'
#Main()
#################################################

测试结果既可以通过应用程序查看
单车模拟
也可以通过日志文件进行查看
单车测试日志

再来看一个接口测试的示例
接口4的需求为:

在骑行状态下,锁具控制模块要在相对固定的时间(6-10S)内向服务器上
报位置信息

为了清除刚才的环境,可以点击清除环境设置,然后点开接口4的测试,自己写上测试代码,点击清理环境。
这是例题给的测试代码:

import time,Manu
############标准测试模板#######################
## Test:测试数据执行函数体,【测试数据】每一行数据调用一次Test
## arg:输入参数
## exp:预期输出
def Test(arg,exp):
  print 'Hello World!'
  print '输入参数:%s' %arg[0]
  print '预期输出:%s' %exp[0]
  arg=arg[0].split(',')
  l=[]
  for a in arg:
    l.append(int(a,16))

  b=RS232通道.Write(l)
  API.Common.Timer.Normal.Sleep(100)

  t1=time.time()
  t2=t1
  out=''
  while t2-t1<10:
    bool=Protocol_ServerOutput.Read()
    t2=time.time()
    if bool and Protocol_ServerOutput.Flag.Value==2:
#      array=Protocol_ServerOutput.ToBytes()
#      for a in array:
#        h='%02X' %a
#        out+=str(h)
#        out+=','
#
#      print '输出的数据:%s' %out[:-1]
      break

  passed=True
  if Protocol_ServerOutput.Head.Value!=0x55AA:
    passed=False
    print '包头错误! %s' %Protocol_ServerOutput.Head.Value
  if Protocol_ServerOutput.BikeID.Value!=0xBB:
    passed=False
    print '包头错误! %s' %Protocol_ServerOutput.Head.Value
  if Protocol_ServerOutput.jiaoyanhe.Checked!=True:
    passed=False
    print '校验和错误!'
  if Protocol_ServerOutput.Tail.Value!=0x55AA:
    passed=False
    print '包尾错误! %s' %Protocol_ServerOutput.Tail.Value

## 断言:根据实际需求修改一下注释的部分 
  assertor=API.Platform.Assertion.Create()
  assertor.AddInput('输入数据:',arg[0])
  assertor.AddOutput('输出数据:',exp[0],out)
  if passed:#测试通过
    assertor.Pass()
    print "服务器位置与时间上报输出接口正确。"
  else:
    assertor.Failed()
    print "服务器位置与时间上报输出接口错误!"
  b=assertor.Commit()

## Standard_Test:标准测试的方法入口,使用【测试数据】表循环调用Test方法
Standard_Test(Test)
#############################################

运行结果为
接口测试运行结果

性能测试示例:
需求:

在骑行状态下,锁具控制模块定时上报位置与时间信息要控制在 6-10s 之间

示例代码:

import time
t1=time.time()
def Test(arg,exp):
  global t1
  print 'Hello World!'
  t2=time.time()
  while True:
    bool=Protocol_ServerOutput.Read()
    t2=time.time()
    if bool:
      break

  print 'GPS上报时间间隔为:%.2f秒' %(t2-t1)
  passed=False
  if int(t2-t1)>=6 and int(t2-t1)<=10:
    passed=True

## 断言:根据实际需求修改一下注释的部分 
  assertor=API.Platform.Assertion.Create()
  assertor.AddOutput('输出参数1',exp[0],str(t2-t1))

  if passed:#测试通过
    assertor.Pass()
  else:
    assertor.Failed()

  t1=t2
  b=assertor.Commit()

## Standard_Test:标准测试的方法入口,使用【测试数据】表循环调用Test方法
Standard_Test(Test)
#############################################

测试结果:
性能测试运行结果

4、例题三
题目分享:链接:https://pan.baidu.com/s/1OmASWyIFUvYCzqtJX8SFJA 密码:n06t
模拟空调
2017年嵌入式测试分区决赛题目
注意:

1.端口设置错误,可能会出现“打开XXX通道失败,可能会导致部分测试脚本失效”的问题
2.如果服务端口与协议端口重复,会导致服务端口不可用,所以最好(一定)每个协议使用不
同的端口,且端口号不能与.exe的应用程序用到的端口冲突。

4.1、温度测试

import Manu
############标准测试模板#######################
## Test:测试数据执行函数体,【测试数据】每一行数据调用一次Test
## arg:输入参数
## exp:预期输出
def Test(arg,exp):
  print '测试用例%d:命令设定温度值为%d' % (arg[1],arg[0])
  Protocol_1.Tmp.Value=arg[0]
  Protocol_1.Write()
  API.Common.Timer.Normal.Sleep(1000)

  show=[]
  str = '遥控器设定温度为:%d,界面预期显示为:%d' % (arg[0],exp[0])
  show.append(str)
  show.append('界面室温显示是否正确?')
  passed=Manu.Check(show)

  if(passed):
      print '界面显示与预期一致,界面判断通过'
  else:
      print '界面显示与预期不一致,界面判断不通过'

  ## 断言:根据实际需求修改一下注释的部分 
  assertor=API.Platform.Assertion.Create()
  assertor.AddInput('命令设置温度',arg[0])
  assertor.AddOutput('界面显示温度',exp[0],passed)

  if (arg[0]<16 and exp[0]==16 and passed) or (arg[0]>30 and exp[0]==30 and passed) or (16<=arg[0]<=30 and exp[0]==arg[0] and passed) :#测试通过
    print '本次测试通过。'
    assertor.Pass()
  else:
    print '本次测试不通过,请输入测试问题'
    assertor.Failed()
  b=assertor.Commit()


## Standard_Test:标准测试的方法入口,使用【测试数据】表循环调用Test方法
Standard_Test(Test)

这里写图片描述

每次重新进行测试时最好清理环境,避免因上一个测试用例的结果影响到接下来的测试

猜你喜欢

转载自blog.csdn.net/xielinrui123/article/details/80638028