C 如何在微控制器上对定时器功能进行单元测试

C 如何在微控制器上对定时器功能进行单元测试,c,unit-testing,embedded,C,Unit Testing,Embedded,我对单元测试的概念还不熟悉,目前我正在尝试更熟悉它 我必须对用C编写的微控制器的定时器驱动程序进行单元测试。现在,我听说对一个函数的单元测试不应该依赖于另一个函数的结果。我的问题是,在这种情况下,我们如何测试应该停止计时器的函数?我们不需要启动计时器,见鬼,我们甚至需要初始化它 我想知道我们需要在哪一个层次上考虑我们的单元测试;它是在一个函数的级别上(在这种情况下,我们得到了上面的问题),还是在驱动程序本身的级别上(在这种情况下,我们可以在一个单元测试中使用驱动程序的多个函数) 我很想听听更有经

我对单元测试的概念还不熟悉,目前我正在尝试更熟悉它

我必须对用C编写的微控制器的定时器驱动程序进行单元测试。现在,我听说对一个函数的单元测试不应该依赖于另一个函数的结果。我的问题是,在这种情况下,我们如何测试应该停止计时器的函数?我们不需要启动计时器,见鬼,我们甚至需要初始化它

我想知道我们需要在哪一个层次上考虑我们的单元测试;它是在一个函数的级别上(在这种情况下,我们得到了上面的问题),还是在驱动程序本身的级别上(在这种情况下,我们可以在一个单元测试中使用驱动程序的多个函数)


我很想听听更有经验的人对这个问题的看法,因为我觉得我现在哪儿也去不了。

我将按如下方式处理这个问题:

您可以独立地测试每个函数,以检查它是否遵循其接口并处理参数的越界值(如果这是一个要求,则相反,要求调用方不要调用它越界)

您还可以对每个函数进行代码检查

然后,您可以从更高级别的例程中以一种方式对整个单元进行单元测试:是否可以调用它进行初始化和设置(必须处理wand这里的越界条件),是否可以调用任何回调并正确调用它们


对于与硬件相关的元件,您可以模拟它或为测试创建专用的硬件环境(测试线束、测试台)。

测试计时器驱动程序的正确方法几乎只有一种:

  • 编写一个使用驱动程序所有功能的测试用例应用程序。保持驱动程序代码本身完全不变
  • 需要注意/记录的重要测试参数:时钟速度、时钟精度。也就是说,计时器硬件从哪个时钟源获取时钟,它的速度有多快,预期的精度是多少?您可能会想测试驱动程序是否使用合适的晶体振荡器,而不是内置的RC振荡器。这样,您就可以排除时钟不准确性,并查看驱动程序延迟是什么。系统时钟中的内部PLL/FLL也可能有一定的不准确性
  • 在测试应用程序中,根据驱动程序的编写方式,在您希望计时器停止的位置设置一些GPIO引脚,可能是通过回调函数
  • 用示波器测量实际时间。这是强制性的,没有它您无法测试这样的代码。句号

没什么了。或者,如果您希望进行更深入的测试,您可以包括某种方式的代码覆盖,以查看驱动程序代码的所有部分是否在某个时间执行。

谢谢您的回复。需要明确的是,在第一步中,当独立测试每个函数时,我们只关注函数如何处理输入的边界,而不关注函数的实际功能,对吗?因为例如,在没有计时器初始化的情况下启动计时器启动甚至不会启动计时器。将其视为两部分:测试“外部”(接口行为)和“内部”(功能)。在您的情况下,第2部分无法在我的步骤1中完成,因此您没有。但是你仍然需要测试它,因此我的其他步骤,包括一个专门的测试平台,如果必要的话(以及可能的和预算的…),以及下面的回答/评论,对于功能,你当然必须至少在正常用例中测试功能,但可能取决于正常用例的设计。所以,正常的用例是在计时器运行的情况下读取时间,所以为了准备测试中的功能(读取时间),您自然必须引导并初始化计时器。但是如果read the time(读取时间)函数支持检测计时器未初始化,那么您还需要在计时器未初始化的情况下对其进行专门测试,看看它是否正确检测到。我太关注驱动程序的初始化方面了,以至于几乎忘了准确性的重要性。。。谢谢你提醒我!我还有另一个问题:你会只测试其中一个计时器,并说所有其他计时器都在同一个“等价类”中,还是测试每个计时器?