【问题标题】:How to properly test classes [closed]如何正确测试课程[关闭]
【发布时间】:2014-11-17 23:36:06
【问题描述】:

这是我提出的几个问题的第一部分,分为不同的主题。

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

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

谢谢

【问题讨论】:

  • 恕我直言,您的问题太宽泛了。
  • 很有趣,我不知道如何更具体,但我会尽量做到。我在问人们在定义类时应该如何努力测试他们的代码。显然,如果 Token 永远不会被其他任何东西使用,我可以使用 main() 在 Token.cpp 中进行测试。但是,如果我要在其他文件中使用 Token,那也会有一个 main(),Token.cpp 中的 main() 是否会导致问题?
  • 这里是关于使用 C++ 进行单元测试的 Microsoft Visual Studio 2013 材料msdn.microsoft.com/en-us/library/hh598953.aspx,因为单元测试听起来像是您想要做的。您将需要花一些时间阅读 C++ 中的单元测试。如果要将main() 函数放入某个类中,则确实应该使用预处理器指令将其#ifdef 去掉而不是注释掉。另见stackoverflow.com/questions/87794/c-unit-testing-frameworkstackoverflow.com/questions/242926/…
  • 另见 Exploring the C++ Unit Testing Framework Jungle 虽然几年前它确实谈到了一些框架的特性。这个A quick introduction to the Google C++ Testing Framework 看起来也很有趣。
  • @RichardChambers 谢谢你,我承认对你评论中列出的大部分内容一无所知,但我相信它会有所帮助。我完全不熟悉单元测试,或者框架工作到底是什么,或者其他人在这些线程中提到的用于测试程序的程序。但我确实认为这有助于巩固测试应该分开等。谢谢。

标签: c++ class testing


【解决方案1】:

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

【讨论】:

  • 我想了很多,但不完全确定是否有“最佳实践”
【解决方案2】:

这很可能是Unit Test 的一个很好的候选对象,它几乎总是一个完全独立的可执行文件。我使用CPPUnit 框架取得了非常好的结果。

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

【讨论】:

    【解决方案3】:

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

    在任何规模的项目中,您可能希望在单独的程序集/库中使用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";
    }
    

    ma​​in.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

    【讨论】:

      猜你喜欢
      • 2022-07-27
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 2012-07-01
      • 1970-01-01
      • 2014-06-08
      • 2021-04-09
      • 2019-05-06
      相关资源
      最近更新 更多