今天介绍下CAPL的测试函数TestWaitForAllJoinedEvents 和 TestWaitForAnyJoinedEvent
引子:
通常在CANoe中,测试脚本是一个序列执行的顺序,那么对于不确定的触发事件,我们应该如何对其判断呢?
举例:
我们有一个诊断功能寻址的测试Case,需要我们测试诊断仪发出功能寻址请求后的一段时间内收到2个不同节点的诊断反馈。但是我们无法确定哪个节点先回哪个后会。(我们在config中已经将这两个不同节点的诊断反馈数据关联到了两个系统变量)
解答:
答案是使用TestJoinXXXXXX函数+TestWaitForAllJoinedEvents函数的组合。
testJoinSysVarEvent+TestWaitForAllJoinedEvents使用流程示意图:
p.s.
- 经过测试,这里所说的触发是指系统变量有变化时,而不是更新时。如果需要更新时也触发,可以使用TestJoinTextEvent来实现(后文会有介绍)。
- 另外TestWaitForAnyJoinedEvent(任意事件触发)与TestWaitForAllJoinedEvents使用方法一致,只是在判断时有任意事件触发即Pass。
代码示例:
下面这段代码,是一个WaitForAllEvents的示例,
testcase WaitForAllEvents()
{
const dword waitDuration = 15000; // [ms]
long eventHandle1, eventHandle2;
int64 eventTime1 , eventTime2 ;
long res;
TestCaseTitle("Demo", "WaitForAllEvents");
eventHandle1 = testJoinSysVarEvent(sysvar::test::Sysvar1);
//首先注册想要判断的触发事件1(这里是一个系统变量1)
eventHandle2 = testJoinSysVarEvent(sysvar::test::Sysvar2);
//首先注册想要判断的触发事件2(这里是一个系统变量2)
res = TestWaitForAllJoinedEvents(waitDuration);
//设置TestWaitForAllJoinedEvents并添加等待时间,当两个事件都被触发时(不分顺序),
//TestWaitForAllJoinedEvents会返回一个大于0的数,反之则为0(具体返回值可以查询帮助文档)。
if (res > 0) // all events ocurred, last one is stored in res
{
write("All expected events occured");
testStepPass("All expected events occured");
}
else
{
write("Timeout after %d ms: Not all expected events occured", waitDuration);
}
//testGetJoinedEventOccured 用于获取某个触发事件的触发时间。
if (testGetJoinedEventOccured(eventHandle1, eventTime1) == 1)
{
write("SysVar1 changed at %I64d", eventTime1);
}
else
{
write("SysVar1 unchanged");
}
//testGetJoinedEventOccured 用于获取某个触发事件的触发时间。
if (testGetJoinedEventOccured(eventHandle2, eventTime2) == 1)
{
write("SysVar2 changed at %I64d", eventTime2);
}
else
{
write("SysVar2 unchanged");
}
}
最后,我们来介绍下TestJoinTextEvent的使用方法,TestJoinTextEvent相对来说也是一种最为自由的添加事件触发的方式,我们可以把TestJoinTextEvent认为是一种用户自定义的触发事件。理论上我们可以通过此方法,实现CAPL中任意事件的触发和收集。
下面是一个使用TestJoinTextEvent的小例子,在这个例子中,我们预期一段时间内,两个系统变量中的任意一个系统变量有更新,如果没有则报错。
//待触发的系统变量1
on sysvar_update Device::JDS2900_Check
{
TestSupplyTextEvent("JDS2900_Check sysvar update!"); //发出特定文字信号
}
//待触发的系统变量2
on sysvar_update Device::JDS2900_CH1_Freq
{
TestSupplyTextEvent("JDS2900_CH1_Freq sysvar update!"); //发出特定文字信号
}
testcase WaitForAnyEvents()
{
const dword waitDuration = 15000; // [ms]
long eventHandle1, eventHandle2;
int64 eventTime1 , eventTime2 ;
long res;
TestCaseTitle("Demo", "WaitForAnyEvents");
eventHandle1 = TestJoinTextEvent("JDS2900_Check sysvar update!"); //将特定文字信号注册为触发事件1
eventHandle2 = TestJoinTextEvent("JDS2900_CH1_Freq sysvar update!"); //将特定文字信号注册为触发事件2
res = TestWaitForAnyJoinedEvent(waitDuration); //等待以上任意触发事件被触发
if (res > 0) // any events ocurred, last one is stored in res
{
write("any expected events occured");
testStepPass("any expected events occured");
}
else
{
write("Timeout after %d ms: Not any expected events occured", waitDuration);
}
//testGetJoinedEventOccured 用于获取某个触发事件的触发时间。
if (testGetJoinedEventOccured(eventHandle1, eventTime1) == 1)
{
write("SysVar1 changed at %I64d", eventTime1);
}
else
{
write("SysVar1 unchanged");
}
//testGetJoinedEventOccured 用于获取某个触发事件的触发时间。
if (testGetJoinedEventOccured(eventHandle2, eventTime2) == 1)
{
write("SysVar2 changed at %I64d", eventTime2);
}
else
{
write("SysVar2 unchanged");
}
}
希望此文可以帮助你理解CANoe中TestWaitForAllJoinedEvents/TestWaitForAnyJoinedEvent,从事件注册到函数调用,最后事件触发的使用流程。
网友评论