This answer to a question about C++ unit test frameworks暗示了我以前没有想到的一种可能性:使用C++/CLI和NUnit为本地C++代码创建单元测试。
我们将 NUnit 用于 C# 测试,因此将它用于 C++ 的可能性似乎很诱人。
我从未使用过托管 C++,所以我担心这种方法是否有任何实际限制?你们很多人都这样做吗?如果是这样,你的经历是怎样的?
This answer to a question about C++ unit test frameworks暗示了我以前没有想到的一种可能性:使用C++/CLI和NUnit为本地C++代码创建单元测试。
我们将 NUnit 用于 C# 测试,因此将它用于 C++ 的可能性似乎很诱人。
我从未使用过托管 C++,所以我担心这种方法是否有任何实际限制?你们很多人都这样做吗?如果是这样,你的经历是怎样的?
我们一直这样做。我们有许多用 C++/CLI 编写的程序集,并使用 C# 和 NUnit 来测试它们。实际上,由于我们的目标是提供与 C# 配合良好的程序集,因此这样做可以确保我们已经实现了这一目标。
您还可以在 C++/CLI 中编写 NUnit 测试并调用非托管 C++。可能最好的方法是将纯非托管 C++ 保存在一个库中,然后制作一个使用 NUnit 并链接到该库的测试程序集。
如果您在混合环境中,它工作得非常好,并为您提供参数化测试以及通用测试运行器和框架的好处。
有两个缺点,在大多数情况下都不严重:
如果您真的很挑剔,那么测试将不再在纯本机环境中运行,因此存在某种外部可能性,即某些东西可能在测试中工作但在运行时失败。我认为你必须做一些相当奇特的事情才能做到这一点。
您依赖于能够将 C++ 代码包含到 C++/CLI 程序中。有时这可能会与标题发生冲突,它会强制您的代码使用 UNICODE 构建正常。总的来说,这是一件好事,因为它可以发现大量代码(例如 Win32 调用的 Ansi 变体的不一致使用)。请记住,它只是包含标头,因此它很可能表明您将标头暴露在太高的级别 - 您的某些包含可能应该在您的 cpp 实现文件中。
我的经验是无法使用 NUnit 通过 C++/CLI 测试 C++ 本机代码,因为您将无法加载和使用本机代码。
我尝试使用 nunit 加载与“just thread”链接的基本 c++/cli 测试 dll,这是 c++ 标准线程库的实现。测试 dll 甚至不会加载最新版本的 NUnit (2.6.2)。
所以绝对不是要走的路!
我从来没有使用过,但是没有端口吗?也许http://cunit.sourceforge.net/documentation.html对你有用。
如果测试需要由非 C++ 开发人员理解或维护,最大的担忧是 C++/CLI 语言(以前的托管 C++)本身的学习曲线。
至少需要 1-2 年的 C++ OOP 经验才能为 C++CLI/NUnit 测试项目做出贡献并解决托管本机代码接口之间出现的各种问题。(通过贡献,我的意思是能够独立工作并能够制作模拟对象,在 C++/CLI 中实现和使用本机接口等以满足所有测试需求。)
有些人可能永远无法掌握 C++/CLI,以至于无法做出贡献。
对于某些类型的具有非常苛刻的测试需求的本机软件库,C++/CLI/NUnit 是唯一能够满足所有单元测试需求同时保持测试代码敏捷并能够响应变化的组合。我推荐这本书xUnit Test Patterns: Refactoring Test Code沿着这个方向发展。