用普通类测试类测试C++程序

用普通类测试类测试C++程序,c++,gcc,makefile,g++,C++,Gcc,Makefile,G++,这可能是一个空洞的问题,但我会尽我最大的努力 我有一个简单的C++程序,我需要为它构建测试。除了我实际使用的类之外,我还使用了两个类,它们被称为WebServer和BusinessLogicLayer 为了测试我自己的代码,我制作了这些类的我自己的版本,这些类向我的类提供虚拟数据来测试它的功能 我需要知道一种方法,比如通过一个makefile,告诉源代码如何使用测试类而不是通常使用的类。测试类在不同的测试C++文件中,测试仪C++文件也有自己的头文件。 问候 保罗 另外,这可能是一个措辞糟糕的问

这可能是一个空洞的问题,但我会尽我最大的努力

<>我有一个简单的C++程序,我需要为它构建测试。除了我实际使用的类之外,我还使用了两个类,它们被称为WebServer和BusinessLogicLayer

为了测试我自己的代码,我制作了这些类的我自己的版本,这些类向我的类提供虚拟数据来测试它的功能

我需要知道一种方法,比如通过一个makefile,告诉源代码如何使用测试类而不是通常使用的类。测试类在不同的测试C++文件中,测试仪C++文件也有自己的头文件。 问候

保罗


另外,这可能是一个措辞糟糕的问题,但我不知道有什么更好的方式来回答我的问题。

你可以定义抽象基类来声明组件的公共接口,然后在运行时将对象连接到main或食物链中其他相当高的位置。在测试中,您只需连接不同的对象。

要使用${SRC_DIR_1}和${SRC_DIR_2}目录中的源代码构建程序的调试和发布版本,请执行以下操作:

CXX      := g++
CPPFLAGS  = ...
CXXFLAGS  = ...

SRC_DIR_1 := ...
SRC_DIR_2 := ...

ifeq (${debug},1)
  BIN_DIR  := ./obj_debug
  CXXFLAGS += -g
else
  BIN_DIR  := ./obj_release
  CXXFLAGS += -DNDEBUG
endif

# Make sure that the directory exists.
TEMP := ${shell test -d ${BIN_DIR} || mkdir ${BIN_DIR}}

# Tell make to search each directory
VPATH := ${SRC_DIR_1}:${SRC_DIR_2}

# You can modify this to use a suffix other than .cc
${BIN_DIR}/%.o : %.cc
    ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c $< -o $@

# Build the requested version of the program.
ifeq (${debug},1)
  default: program_name_debug
else
  default: program_name
endif

tidy::
    @${RM} -r ./obj_*
在“项目配置”对话框中,将目标名称指定为“程序名”、“程序名”和“调试”。用程序名替换程序名

要生成程序,请调用make debug=X,并将X替换为0或1


为什么测试仪代码有自己的头文件?您的测试代码应该与它模拟的代码具有相同的接口,并且使用相同的头文件可以避免很多麻烦

无论如何,这将起作用:

real_program: WebServer.o BusinessLogicLayer.o

test_program: tester.o

real_program test_program: MyClass.o OtherThings.o
    $(LINK) $^ -o $@

在运行时连接不同的对象并不是件小事。在堆栈上构建WebServer或BusinessLogicLayer的任何地方都需要重新编码,我承认这些类的位置不多。如果你在高层次上做出决定,比如在main中,那么你必须以某种方式将它传递给需要它的类。WebServer和BusinessLogicLayer可能是您不希望同时拥有真实版本和虚假版本的东西,这意味着您连接的是类,而不是对象。如果它们必须在main执行之前构造,例如静态对象。。。这不是小事。比如说,您可以使用单例接口声明Web服务器。main负责创建适当的派生类实例,并将其指定为要返回的单例。想要与Web服务器交互的代码只需访问singleton API。这是为数不多的单例有效用法之一。如果WebServer和BusinessLogicLayer都可以是单例,那么您可以不受影响。但是,您不能将任何静态成员初始化为指向或引用它们,这在现在或将来的代码修订版中都是很自然的事情。此外,任何想要构建工作版本的人也必须拥有测试代码,否则链接将失败。而且这个方法不可扩展到其他非单例类。是的,单例类也有缺陷。当然,使用单例的方法不止一种。您可以将工厂类定义为singleton,从而允许代码库根据需要实例化尽可能多的Web服务器,而不依赖于静态数据,同时仍将其留给main来决定将创建哪个Web服务器派生类。