C++ 如何正确地测试类

C++ 如何正确地测试类,c++,class,testing,C++,Class,Testing,这是我的两个问题的第一部分,用不同的思路分开 首先,当我创建一个用于其他程序的类时,我应该将测试代码放在哪里。如果我的类将被其他文件使用,我应该使用单独的文件还是在同一个文件中测试我的类 例如:我正在创建一个类令牌,它是在Token.h中声明的,并在Token.cpp中实现的,但是当我进行测试以确保一切正常时,我可以在我的Token.cpp中使用main()方法吗?或者当我以后想使用令牌时,这会导致问题吗?如果不在Token.cpp中,我假设我将使用单独的文件进行测试,比如Token_test.

这是我的两个问题的第一部分,用不同的思路分开

首先,当我创建一个用于其他程序的类时,我应该将测试代码放在哪里。如果我的类将被其他文件使用,我应该使用单独的文件还是在同一个文件中测试我的类

例如:我正在创建一个类令牌,它是在Token.h中声明的,并在Token.cpp中实现的,但是当我进行测试以确保一切正常时,我可以在我的Token.cpp中使用main()方法吗?或者当我以后想使用令牌时,这会导致问题吗?如果不在Token.cpp中,我假设我将使用单独的文件进行测试,比如Token_test.cpp?或者我想我可以用main()在Token中进行测试,然后在确信它能按预期工作时进行注释


谢谢

尽可能将代码与测试分开。理想情况下,测试不应该干扰您的代码,但这并不总是可能的。

对于几乎总是完全独立的可执行文件的。我使用该框架取得了非常好的效果


当您的软件变得更复杂(即更多类等)时,单元测试可以帮助您保持非常稳定且易于维护的状态。它们当然不是解决所有已知问题的灵丹妙药,但它们将有助于确保每个类都能按预期工作。

您肯定希望测试代码与被测试代码分开。您并不真的希望您的测试代码对您的测试代码有任何依赖性

在任何大小的项目中,您可能希望使用单独的程序集/库中的A编写测试,但对于足够小的内容,可以考虑通过将命令行参数传递到主函数来运行所有的测试。下面是一个非常简单的例子:

问候语。h:

#pragma once
#include <string>

std::string getGreeting();
#include "Greeting.h"

std::string getGreeting() {
  return "Hello world!";
}
#pragma once
void test();
#include "Test.h"
#include "Greeting.h"

#include <cassert>
#include <iostream>

void test() {
  auto greeting = getGreeting();
  assert(greeting == "Hello world!");
  std::cout << "Test passes!\n";
}
#include "Test.h"
#include "Greeting.h"

#include <iostream>

void run() {
  std::cout << getGreeting() << "\n";
}

int main(int argc, char *argv[]) {
  if (argc > 1 && strcmp(argv[1], "-t") == 0)
    test();
  else
    run();
}
Test.h:

#pragma once
#include <string>

std::string getGreeting();
#include "Greeting.h"

std::string getGreeting() {
  return "Hello world!";
}
#pragma once
void test();
#include "Test.h"
#include "Greeting.h"

#include <cassert>
#include <iostream>

void test() {
  auto greeting = getGreeting();
  assert(greeting == "Hello world!");
  std::cout << "Test passes!\n";
}
#include "Test.h"
#include "Greeting.h"

#include <iostream>

void run() {
  std::cout << getGreeting() << "\n";
}

int main(int argc, char *argv[]) {
  if (argc > 1 && strcmp(argv[1], "-t") == 0)
    test();
  else
    run();
}
Test.cpp:

#pragma once
#include <string>

std::string getGreeting();
#include "Greeting.h"

std::string getGreeting() {
  return "Hello world!";
}
#pragma once
void test();
#include "Test.h"
#include "Greeting.h"

#include <cassert>
#include <iostream>

void test() {
  auto greeting = getGreeting();
  assert(greeting == "Hello world!");
  std::cout << "Test passes!\n";
}
#include "Test.h"
#include "Greeting.h"

#include <iostream>

void run() {
  std::cout << getGreeting() << "\n";
}

int main(int argc, char *argv[]) {
  if (argc > 1 && strcmp(argv[1], "-t") == 0)
    test();
  else
    run();
}
#包括“Test.h”
#包括“Greeting.h”
#包括
#包括
无效测试(){
自动问候语=getGreeting();
断言(问候语==“你好,世界!”);

std::cout IMHO你的问题太宽泛了。有趣的是,我不认为我可以更具体,但我会尽量做到。我想问的是,人们在定义类时应该如何努力测试他们的代码。显然,如果令牌永远不会被其他任何东西使用,我可以使用main()在Token.cpp中进行测试。但是如果我要在其他文件中使用令牌,那么也会有一个main()将main()在微软上,用VisualStudio 2013进行单元测试,用C++作为单元测试,这是它听起来像你想做的。你需要花一些时间阅读C++中的单元测试。
函数到某个类中,你真的应该使用预处理器指令来定义它,而不是注释它。另外,请看几年前的文章,它确实讲述了一些框架的特征。这看起来也很有趣。@RichardChambers谢谢你,我承认我对大多数人一无所知您的评论中列出了一些东西,但我确实相信这会有所帮助。我对单元测试、框架结构或其他线程中提到的用于测试程序的程序一点也不熟悉。但我确实认为这有助于巩固测试应该是分开的等等。谢谢。我也考虑了很多,但不完全确定是否有“最佳做法”