软件测试技术(六)——白盒测试之控制流覆盖准则+Visual Studio 2013单元测试...

本文介绍了一种单片机通过串口发送A/D转换结果的格式,并详细阐述了如何利用Byte Stuffing技术处理数据包中的特殊字符,确保数据传输的准确性。此外,还介绍了在软件测试中采用的分支覆盖准则,以及使用Visual Studio进行单元测试的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、目标程序

单片机发送的A/D转换结果的整体格式为:[DLE][STX]Message[CHKSUM][DLE][ETX],其中[]括号中的字符为16进制的助记符,并非ASCII码。其中:[DLE]=0x10, [STX]=0x02, [ETX]=0x03。Message: 为AD转换结果+1个字节的ChkSum,Message长度最大为100字节。其中AD转换结果为16进制的传感器数据。例如:x=(1023)D=0x3FF,y=0x201,z=0x301,a=0x3D5,b=0x1A5,则单片机应发送的Message字节内容(big endian模式)应该是{0x03,0xFF ,0x02, 0x01, 0x03, 0x01, 0x03, 0xD5, 0x01, 0xA5,0x70},其中ChkSum为message的其他数据的XOR(异或)并bit取反的结果,即发送的16进制数据为[DLE][STX] 03FF0201030103D501A570[DLE][ETX]。因Message中没有[DLE](即0x10)出现,因此发送的数据是和AD结果一致。但是由于16进制的Message中有可能出现与[DLE][STX]或[DLE][ETX]相同的内容,如果不进行一定的处理,上位机将无法辨认数据包的开始与结束,此时需要使用Byte Stuffing的处理方式将Message的内容进行调整,以便区别于数据包的开始与结束。这里Byte Stuffing的处理方法是,如果 Message中出现[DLE]即0x10的数值则在传送此0x10之前插入一个[DLE]即0x10。ChkSum计算时不包括多插入[DLE]。例如,数据x=0x3FF,  y=0x210, z=0x301, a=0x3D5, b=0x1A5, 则单片机应发送的Message的内容应该是{0x03  0xFF  0x02  [DLE]  0x10  0x03  0x01  0x03  0xD5  0x01  0xA5 0x70 },即在Message中要插入相应的[DLE]字符。如果ChkSum也正好是[DLE]时,则也需要进行Byte Stuffing的处理。

Byte Stuffing的发送数据处理流程如图6-13 所示。可以根据此流程图编写单片机在MH模式下发送数据的处理函数。而在上位机接收数据时,需要将Message中的信息进行Byte De-Stuffing,即去掉单片机发送过程中插入的[DLE]。

单片机发送数据时的程序流程图

 

二、方法介绍:控制流覆盖准则

常见的覆盖方法有

  • 语句覆盖,设计若干测试用例,使每条语句至少被执行一次
  • 分支覆盖,每个判定每个分支至少有一次为真一次为假
  • 谓词覆盖,判定中每个条件的可能取值至少满足一次
  • 路径覆盖,包含所有完整路径(如果P=e1e2…eq是一条路径,且满足H(e1)=Start,T(eq)=End,则P称为完整路径)

针对目标程序每个判定条件没有前后关系,并不会互相影响,我采用了分支覆盖准则。

 

三、有向图

 

四、测试用例

编号

输入

谓词

NODE(LT)

期望输出

实际输出

 

 

 

S,1,2,3,4,8,9,10,11,12,E

不可达到

 

1

Null

Message结束;;ChkSum==0

S,1,2,3,4,8,10,11,12,E

1002001003

1002001003

2

0528

Message未结束;数据非DLE;Message未结束;数据为DLE;Meaasge结束;ChkSum非DLE

S,1,2,3,4,5,6,7,4,5,7,4,8,9,10,11,E

1002021010121003

1002021010121003

 

五、使用VS进行函数功能的实现并进行单元测试

可以参考演练:创建并运行托管代码的单元测试

进行单元测试时,出现了问题。我一开始是直接写了一个win8 app中MainPage下的函数,发现在Test中找不到,将private改为public之后可以找到了,但是会发生 “应用程序调用一个已为另一线程整理的接口”错误,之后我看了一下Microsoft提供的参考,将Byte stuffing封装到了一个类中,之后就可以了。

 

Byte stuffing关键代码

public class Byte_stuffing { int GETNUM = 4; int BUFFER_LEN_LOD = 100; string RS232_DLE = "10"; string RS232_STX = "02"; string RS232_ETX = "03"; public Byte_stuffing() { } public string out_Byte_Stuffing(string input) { try { string output = null; output += RS232_DLE; output += RS232_STX; int chksum = 0; for (int start = 0; start < input.Length; start += 4) { string handle = null; if (start + 4 < input.Length) { handle = input.Substring(start, 4); } else { handle = input.Substring(start, input.Length - start); } string incoming = int.Parse(handle).ToString("x"); //return incoming; if (incoming.Length < 4) { string insert = null; for (int i = 0; i < 4 - incoming.Length; i++) { insert += "0"; } incoming = insert + incoming; } if (incoming.Substring(0, 2).Equals(RS232_DLE)) { output += RS232_DLE; } //return incoming; output += incoming.Substring(0, 2); chksum ^= int.Parse(incoming.Substring(0, 2)); //return incoming; if (incoming.Substring(2, 2).Equals(RS232_DLE)) { output += RS232_DLE; } output += incoming.Substring(2, 2); //return incoming; chksum ^= Convert.ToInt32(incoming.Substring(2, 2), 16); } string chk = chksum.ToString("x"); if (chksum.ToString("x").Length < 2) { string insert = null; for (int i = 0; i < 2 - chksum.ToString("x").Length; i++) { insert += "0"; } chk = insert + chksum.ToString("x"); } if (chk.Equals(RS232_DLE)) { output += RS232_DLE; } output += chk; output += RS232_DLE; output += RS232_ETX; return output; } catch (Exception ex) { return ex.StackTrace; } } }

 

转载于:https://www.cnblogs.com/ocDx01jin/p/4439992.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值