如何正确地测试类

问题描述:

这是我遇到的一对夫妇问题的第一部分,用不同的线索分开。如何正确地测试类

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

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

谢谢

+0

恕我直言,你的问题是相当过于宽泛。 – 101010 2014-09-23 16:55:33

+0

有趣的是,我不明白我怎么能更具体,但我会努力成为。我在问在定义类时人们应该如何努力测试他们的代码。显然,如果令牌永远不会被其他任何东西使用,我可以在Token.cpp中用main()来测试。但是如果我要在其他文件中使用Token,那么也会有一个main(),Token.cpp中的main()会不会导致问题? – user2386276 2014-09-23 16:58:45

+0

这是Microsoft Visual Studio 2013关于使用C++进行单元测试的资料http://msdn.microsoft.com/zh-cn/library/hh598953.aspx作为单元测试,它听起来就像您想要做的一样。您需要花一些时间阅读C++中的单元测试。如果你想在某个类中加入main()函数,你应该使用预处理器指令来#ifdef它,而不是注释掉它。另请参阅http://stackoverflow.com/questions/87794/c-unit-testing-framework和http://stackoverflow.com/questions/242926/comparison-of-c-unit-test-frameworks – 2014-09-23 16:59:14

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

+0

我曾经想过,但并不完全确定是否有“最佳做法” – user2386276 2014-09-23 17:07:54

这可能很适合Unit Test这几乎总是一个完全独立的可执行文件。我与CPPUnit框架一起工作得很好。

随着软件变得越来越复杂(即更多的类等),单元测试可以帮助您保持一个非常稳定和易于维护的状态。它们当然不是能够解决所有已知问题的银弹,但它们将有助于确保每个班级按照预期工作。

您绝对希望您的测试代码与您的测试代码分离。你并不想让你的代码在测试代码上有任何依赖关系。

在任何规模的项目中,您可能都希望使用unit testing framework在单独的程序集/库中编写测试,但对于足够小的事情,可以考虑通过将命令行参数传递给主函数来运行所有测试。下面是一个简单的荒谬例如:

Greeting.h:

#pragma once 
#include <string> 

std::string getGreeting(); 

Greeting.cpp:

#include "Greeting.h" 

std::string getGreeting() { 
    return "Hello world!"; 
} 

Test.h:

#pragma once 
void test(); 

Test.cpp的:

#include "Test.h" 
#include "Greeting.h" 

#include <cassert> 
#include <iostream> 

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

main.cpp中:

#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(); 
} 

Live demo