【发布时间】:2011-10-13 20:02:44
【问题描述】:
我们目前正在尝试将单元测试添加到我们的 c++ 应用程序中。该应用程序由生成 29 个 dll 和 1 个 exe 的 30 个项目组成。我们使用 MSTest 来运行我们的单元测试,因为它已经包含在 Visual Studio 2010 中。
它适用于声明为“public”的类。这些类的开头是这样的:
#ifdef RESEAU_IMPL
#define CLASS_DECL _declspec(dllexport)
#else
#define CLASS_DECL _declspec(dllimport)
#endif
但是对于所有其他类(90% 的代码),它们没有被声明为 public,所以我们不能在我们的测试中使用它们。
我在 google 上阅读了有关 InternalVisibleTo 属性的信息,但它似乎只适用于 c# .NET 程序集。我对吗?我还阅读了声明我的班级“as_friend”,但我不确定该放在哪里。
简而言之:我想测试 DLL 中未导出/公开的类。我该怎么做?
谢谢
* 编辑 *
Gishu 评论说单元测试在非托管代码中是不可能的,但它是可能的。看,这是一个测试原生 c++ 代码的 TestMethode。 CVersion 在 C++ MFC 中。
[TestMethod]
void AssignationCVersion()
{
CVersion version1234(1,2,3,4);
CVersion version4321(4,3,2,1);
Assert::IsTrue(version1234 != version4321);
version1234 = version4321;
Assert::IsTrue(version1234 == version4321);
};
但似乎不可能的是使用特殊标签来测试内部功能。我是第一个同意测试内部方法不是好的做法,但这些 DLL 不是实用程序功能,而是“真实”应用程序的一部分(也许这是糟糕的设计,但它是在 15 年前完成的)。有人对这个主题有想法吗?
【问题讨论】:
-
C++ 不支持反射。你不能测试你不能调用的代码。
-
您是否使用托管 C++ 测试 dll 调用非托管 SUT?这是我第一次听说这种用途。也找不到任何有关此的 msdn 文档。我工作场所的人们使用 google 的 fwk 或 cppunit ......但如果你正在寻找 IDE 集成和合作,那就不行了。
-
嗨,这是我们测试“架构”所依据的文档:msdn.microsoft.com/en-us/library/ms243171.aspx。如您所见,它被标记为“不支持”,但他们提供了一种方法并且它有效。这个 MSdn 页面非常具有误导性。
标签: c++ unit-testing mstest