单元测试副作用繁重的代码


10

我开始写C ++代码来运行机器人,如果可以的话,我不知道如何合并单元测试。我提供了一个库,该库允许为机器人创建“命令”,这些命令会自动调度和执行。创建这些命令的机制是继承一个命令基类它们提供,并执行虚拟void Initialize()void Execute()void End()方法。这些功能纯粹是出于其副作用而运行,这些副作用会对机器人产生影响(运行电动机,伸出活塞等)。因此,除了模拟整个库之外,我几乎看不到任何将单元测试附加到代码的地方,这样我就可以检查机器人的虚拟前后状态。有没有一种方法可以对此进行单元测试,而不会造成太大的负担?

编辑

我想我可能对库的功能产生了误导。该库提供了机器人以及命令/调度系统的大部分接口,因此它不像模拟命令基类那么简单,我必须模拟整个硬件接口。不幸的是,我没有时间这样做。


我认为您可以撤消使机器人执行的任何操作,对吗?您不能撤消测试的操作吗?
Neil

1
不幸的是,库没有使用合成而不是继承,因为在这种情况下,您可以模拟命令类。
罗伯特·哈维

@尼尔,我不太确定你在问什么。你能改一下你的问题吗?
Will Kunkel 2013年

Answers:


7

在这种情况下,我要做的就是引入自己的RobotControl接口,并使用与真实库中的方法相对应的方法。

完成此操作后,我将创建一个RobotControlImpl类,该类针对实际的机械手库实现此接口。

因此,我将编写的命令不会扩展基类,而是在您引入的接口上运行。

这样,您可以模拟RobotControl,将模拟传递给任何命令,并验证它在接口上是否调用了正确的方法。

在生产中,您将把RobotControl的真实含义传递给您实现的命令。

我不确定这是否是您的想法并认为很麻烦?

编辑:哦,并且如果您希望命令为了等待完成而进入睡眠状态(噩梦,但是有时这就是您所拥有的),那么我将需要这些命令来调用RobotControl上的sleep方法。这样,您可以在测试期间禁用睡眠,而只需验证命令是否尝试睡眠。


2
+1。不喜欢界面吗?自己做。
Neil

听起来您在建议我模拟整个库。这些命令将要调用的几乎所有函数都在库的内部。
Will Kunkel 2013年

0

我认为可以以最小的侵入性方式使代码可测试。我的意思是,您可以完全按照机器人库作者的意图编写命令。如果您想与不使用中间层的其他人交换代码,那么这可能是有利的。

它确实需要单独的代码“单元测试构建”。

您要做的是,在一个中央头文件中,检查一个编译时定义,以确定这是否是单元测试版本,如果是,则将基类的名称以及机器人库中的其他一些类重新定义为类的名称。您的测试实施。您应该定义与机器人库中相同的虚函数,并为您在机器人上调用的方法提供存根。

然后,您可以将一些命令放入您自己的测试框架中,以调用与机器人库相同的方法。

这将涉及一些存根和模拟,但这在任何单元测试设计中都是不可避免的。

可以使用#define或可能首选的typedef来更改基类名称。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.