白盒测试 - 朋友或预处理?

问题描述 投票:4回答:4

试想一下,我们有这样一个类:

class Testee
{
public:
   void Func()
private:
   void auxFunc()
};

我们希望做就可以了白盒单元测试。你认为这是一个更好的办法?要声明的测试类被测者阶级的朋友吗?或使用这样的预处理:

  class Testee
    {
    public:
       void Func()
#ifndef UNITTEST_SYMBOL
    private:
#elif
    public:
#endif
       void auxFunc()
    };

后来在测试文件

#define UNITTEST_SYMBOL
#include "Testee.h"
#undef UNITTEST_SYMBOL

所以,再一次,你认为这是一个更好的办法?或者,也许你可以建议另一种方法。

c++ unit-testing c-preprocessor friend
4个回答
4
投票

怎么样:

#ifndef UNITTEST_SYMBOL
#define semiprivate private 
#else
#define semiprivate public
#endif

并声明你的类,如:

  class Testee
    {
    public:
       void Func()
    semiprivate:
       void auxFunc()
    };

甚至,如果你足够大胆,测试时做#define private public


2
投票

在单元测试文件。你可以试试

#define private public
#include "Testee.h"

这是我做的,这意味着有不相关的头文件中的单元测试什么。我觉得这是因为我觉得很难的时候有很多的#ifdef我的代码中遵循非常有用的。

然后,我有我的所有其他头文件中的#define前


1
投票

使用方法的朋友,该声明将取决于测试类的名称,因此,如果你改变它的名字的声明必须随之改变。此外我使用单元测试++所以实际测试CALSS名由宏形成。

与定义该方法是麻烦小于。另外,我只是把定义为一个全球性的编译器选项,而不是你带路,例如

gcc -DUNIT_TESTING_ON

#ifdef UNIT_TESTING_ON
  public: //or protected maybe
#else
  private:
#endif

任何人阅读这也将看到目的是什么,这比查找朋友的定义,看看到底为什么你做它的朋友更加清晰。


1
投票

下面是人们遵循白盒测试的方式,

#define private friend cTestDriver; private
#define protected friend cTestDriver; protected
//included all your class header from which you like to access
//the private/protected method
#include Testee.h"
#undef private
#undef protected

该类cTestDriver将有包装/ setter方法/干将访问所有的private和protected成员。

你也需要理智约的头文件的顺序。

对于例如:

File1.h

#include "Testee.h"
--
--
--

file TestDriver.h

#include File1.h
#define private friend cTestDriver; private
#define protected friend cTestDriver; protected
//included all your class header from which you like to access
//the private/protected method
#include Testee.h"
#undef private
#undef protected

在上述情况下,同时我们打开File1.h的Testee.h将被打开。因此,宏不会是有效的在这里。

注意:您可能会收到警告有关朋友的多次声明。

© www.soinside.com 2019 - 2024. All rights reserved.