做测试两年,今天开始记录平时的工作总结:
- SCR应该要有CASE覆盖
- 提的SCR 一定要弄明白为什么会出现这个现象,不能发现问题了就扔给开发,
- 写case 的时候应该要注意写清楚 是怎么设计这个CASE的,怎么造故障的, 莱茵comments
- 代码升版的时候,回归时要注重返回值的修改, 在修改的过程中可能会遗漏返回值, I2C 刘罗 BSP
- 测试的全面, 验证三种组合, 该功能做了,该功能没做,该功能做失败了三种情况
eg, 1,能检测到温度,2,温度检测失败,3检测不到温度三种情况 - 在写测试case时尽量一条case对应一条需求,不要一条case追踪了多条需求,因为如果需求有变更,可以只改对应的case就可以
但若一条case对应了多条需求,若其中一条需求更改了,那这条case是改还是不改呢,很难判断,需要再比较该case对应的其他需求是否更改。 2018-1-11, 机场线obcu_ATP_SwRS case更新
有的情况可能一条case可以对应两条需求,例如,1:OBCU 会EB,2:obcu会将EB信息发给ATS/DMI
需要一条case对应两条需求时,在Tital中写清楚两个验证的点,并和requirement ID的 需求号一一对应。便于后期维护case.
1. 边界值的变化, 比如一个累加变量的范围为[ 1- 255] 从255到1 的变化过程应该被测试
2. 返回值的判断, 有可能会漏掉某种情况的返回值赋值,
if()
{
….
return ok;
}
else
{
……..
return error;
}
3. 循环中有标志位判断时,循环退出后应该将标志位置为初始化数据, 保证下次进入循环时的数据是初始化的数据,
否则有可能下次循环错误时,但保存的值是上次更改的值
for (ulLoop = 0U; ulLoop < ulItemNum; ulLoop++)
{
iRet = VPLT_ERR;
ASSERT(NULL != g_astInitCtrlBlock[ulLoop].fModuleInit);
iRet = g_astInitCtrlBlock[ulLoop].fModuleInit();
if(VPLT_OK != iRet)
{
TF("[Init]module(0x%x) err(%08x)\n", g_astInitCtrlBlock[ulLoop].ulInitID, iRet);
ulErrId = g_astInitCtrlBlock[ulLoop].ulInitID;
break;
}
else
{
TF("[Init]module(0x%x) ok\n", g_astInitCtrlBlock[ulLoop].ulInitID);
ulInitStat |= (UINT32)((UINT32)1U << g_astInitCtrlBlock[ulLoop].ulInitID);
}
}
4. while((TRUE == bNeedSendR1Flag) || (TRUE == bNeedSendR2Flag))
应该分为 bNeedSendR1Flag = True/False , bNeedSendR2Flag = True/False几种情况测试
5. 错误计数增加时, 需要注意该计数值什么时候被清空,有多少种情况应该被清空
6. 测试连接断开时,还应该测试重新连接后 是否通信正常。
7.时间的配置, 比如 周期容忍时间 1ms, 速度10ms采集一次,温度10ms检查一次,需要注意 时间是否配置正确。