是否有一种更干净的方法来揭示实施细节进行测试

Is there a cleaner way to expose implementation details for testing?

本文关键字:施细节 细节 测试 一种 是否 方法      更新时间:2023-10-16

我知道有一个流行的观念,即实施细节不保证测试和/或应公开实施。为了这个问题,请假设测试和最小化API具有优点。

应该如何测试内部免费功能?

// Example for C
static MyType do_something_internal(OtherType * X);
// Or (roughly) equivalently
namespace { MyType do_something_internal(OtherType * X); }

我们当前采取的选项是公开呼叫,但在详细的名称空间中:

// Preserve the friendly function name and internal linkage
static MyType do_something_internal(OtherType * X)
extern MyType detail_do_something_internal(OtherType *X)
  { return do_something_internal(OtherType *X); }
// C++ version preserving the external linkage of the original
namespace detail {MyType do_something_internal(OtherType * X);}

我们可以揭示一个包含对内部功能的引用的单个对象:

struct exposed_for_test {
  auto detail_do_something_internal = do_something_internal;
  auto detail_other = other;
} // Similar in C, but somewhat less convenient to write out

我们可以用不同程度的护理包裹在预处理器宏中的测试界面:

#ifndef TESTING_BUILD
#define LINKAGE extern
#else
#define LINKAGE static
#endif
LINKAGE MyType do_something_internal(OtherType * X)
// or:
#ifdef TESTING_BUILD
static MyType do_something_internal(OtherType * X);
extern MyType detail_do_something_internal(OtherType * X)
{ return MyType do_something_internal(OtherType * X); }
#endif

目前,我倾向于最后选择。任何调用裸露接口的非测试代码都将无法在版本构建中链接。但是,这似乎不可避免地会倍增时间,并且对发布的对象文件测试不同的对象文件感到有些不舒服。也许最好将测试界面放在适当的位置并依靠链接时间优化来剥离它。

我还在考虑使用发行代码编写测试代码,以直接访问静态功能。但是,这在"测试代码"上缩短了"真实代码",这可能是一个有争议的解决方案。

上面的所有选项似乎都很粗糙,所以我想问社区 - 您有更好的想法,还是您喜欢上述一个?谢谢。

如果您愿意走到"内部"测试代码在 *_test.cc文件中包含 *.cc文件怎么办?以我的卑鄙看法,助手功能通常可以在另一个文件中成为公共事业功能的另一个文件中的房屋。否则,它们太小且微不足道,无法进行测试,或者它们的作用没有很好地定义。是的,完全有可能没有其他人会使用其他 *_helper_util.h接口,但是对于很多代码来说都是如此。对吗?

此链接:https://ved789.wordpress.com/2009/11/11/27/coupling-coohesion-abapsulation-apapsulation-polymorplism/

讨论耦合,内聚力,封装,多态性。

出于这个问题的目的,"耦合"是主要兴趣:

这是链接对"耦合"

的说法

(不是特别是第一句话。)

耦合是一个组件对另一个组件的实现的不必要依赖。

此链接:http://searchsqlserver.techtarget.com/definition/data-hiding

将隐藏数据定义为:

数据隐藏是面向对象的编程的特征。由于对象只能与预定义的类或模板中的数据关联,因此对象只能"知道"所需的数据。维护代码的人不可能无意间指向或以其他方式访问错误的数据。因此,可以说对象不需要的所有数据是"隐藏的。"

上面的全部意味着应该隐藏数据/实现。在大型项目中,这成为一个主要问题。