这就是我进行 TDD 编程的方式。首先,我建立了我需要添加的新功能,然后我建立了该功能将具有的所有外部依赖项。例如,我在当前项目中依赖于 ac api,它提供了有关我正在使用的模型的信息。我还依赖于命令行,因为客户端可以输入我必须响应的命令。这个命令行是通过一个特殊的终端,我不感兴趣的细节。
所以我为这些外部依赖创建接口类,然后在我的代码中只使用这些接口。因此,我在进行测试时不需要模型的 c++ 库或终端的 c++ 库(稍后会详细介绍)。下面是一个用于写入命令行的接口示例:
class ICommandLineOutput
{
public:
virtual void WriteLine(std::string&) = 0;
};
因此,假设我被要求编写一个将时间写入命令行的类,称为 WriteTime。然后,我要做的就是将一个ICommandLineOutput类型的对象传递给这个类的构造函数,并且只使用这个接口。我不关心我正在使用什么样的命令行,只关心它的界面。然后,我可以使用任何我想要的命令行类,只要它以 ICommandLineOutput 类为基础。
class WriteTime
{
public:
explicit WriteTime(ICommandLineOutput commandLine): _commandLine(commandLine){}
...
};
因此,在进行单元测试时,我将有一个单独的 C++ 项目,我将在其中测试我编写的每个类。这个项目可以使用谷歌测试,它可以是一个命令行项目。因此,即使您正在编写包含在 GUI C++ 项目中的 GUI 应用程序,测试也有自己的项目。
假设我希望测试我的类,它将时间写入命令行。我将在一个名为 TestWriteTime 的类中执行此操作。我将使用 GoogleMock 创建 ICommandLineOutput 接口的模拟。然后可以通过测试基地在测试中质疑和/或配置模拟,以确定 WriteTime 是否按预期运行。例如,我可以检查 WriteLine() 被调用的次数以及它接收的参数。
最后,在我当前的项目中,我正在使用一个基于 linux 的项目,该项目具有大量依赖项。该应用程序也需要很长时间才能启动。但是,我有一个 Windows 控制台项目,我在其中进行测试。此应用程序的执行时间不到一秒,这对于 TDD 来说是理想的。