首页 / 软件开发 / VC.NET / WinUnit:简化的本机C++应用程序单元测试
WinUnit:简化的本机C++应用程序单元测试2010-04-16 MSDN Maria Blees本文讨论:单元测试原理设置 WinUnit构建测试装置实施和自定义本文使用了以下技术:C++和Visual Studio目录立即开始测试WinUnit 入门装置:设置和清除运行 WinUnit实现详细信息深入学习...目前,要想让本机代码开发人员一点也感觉不到压力可能是非常困难的- 好像使用 Microsoft® .NET Framework的开发人员拥有所有出色的工具!我一直以来都对丰富的工程实践经验感兴趣,但所谓的“工程专家”却屡屡让我失望,他们只会赞扬单元测试的优点,而在请他们为本机代码的测试工具提点建议时他们却表示无话可说。我认为能够最简便地集成到自动化生成系统中的工具是针对本机代码的NUnit 等效框架,这也是我真正需要的。也就是说,我希望能够建立一个仅包含测试的DLL,有一个可以运行这些测试的外部测试运行程序,并且能够进行报告和日志记录。我还希望能够一次仅声明一个测试,在我的测试 DLL中额外代码尽可能少。因此,我构建了名为 WinUnit的本机代码单元测试工具。稍后我将对其进行更详细的介绍,在此先简单看一下使用 WinUnit 创建和运行测试 DLL 多么容易。首先,创建一个 CPP 文件,我们在此称为 DummyTest.cpp:#include "WinUnit.h"
BEGIN_TEST(DummyTest)
{
WIN_ASSERT_TRUE(3 > 4, _T("You should see this error message."));
}
END_TEST
使用以下命令将其构建到 DLL中:cl /EHsc /LD DummyTest.cpp
然后对其执行 WinUnit:>WinUnit DummyTest.dll
Processing [DummyTest.dll]...
(DummyTest)
DummyTest.cpp(5): error : WIN_ASSERT_TRUE failed: "3 > 4". You should see this error message.
FAILED: DummyTest.
[DummyTest.dll] FAILED. Tests run: 1; Failures: 1.
There were errors.
Tests run: 1; Failed: 1.
当然,将 3 > 4 更改为 True 表达式 4 > 3 将不会失败。WinUnit 将接受任意数量的DLL 或目录,对它们进行处理,报告总体结果,并返回退出代码。顺便说一下,顾名思义,WinUnit 将仅在 Windows® 上运行。我承认在我编写自己的工具之前,世界上并不乏针对C++ 单元测试的其他选择。但是,我发现现有的单元测试工具中存在一个问题,通常,与易于理解和可直接使用相比,它们为可移植性设定的优先级更高。CppUnitLite 是我最喜欢的一种可移植装置,但由于它的设计具有极高的可自定义性,因此在设置它时所需的开销比预期的要高。由于测试运行程序与测试都在同一二进制文件中完成,这两者之间的界线已经模糊,因此需要编写实际调用测试运行功能的代码并将其放在某处。此外,由于很难向同事解释清楚复杂的宏实现,导致宏实现很难被采用。但是,如果您需要能够移植到其他操作系统,CppUnitLite 绝对值得一看。在相当长的一段时间内,其他可用于C++ 单元测试的选项与可用于测试 .NET 代码的选项是相同的,最值得一提的是 NUnit和Visual Studio® Team Test 单元测试框架。因为这两种框架都可以执行任何具有适当属性的.NET 程序集,所以可以将这些工具用于使用托管 C++(现在为 C++/CLI)编写的测试。我发现这一做法的主要不便之处在于,这些工具是专门面向 .NET 开发的,而不是面向本机代码的。这一点可能并不出人意料。但是,很难将提供的大多数 Assert 方法用于本机 C++(因为这些方法需要 .NET 风格的对象),而作为开发人员,您至少需要非常熟悉 C++/CLI(或 C++的托管扩展)才能编写测试。您可以从“Visual Studio 2005 产品功能比较”页 (msdn2.microsoft.com/vstudio/aa700921.aspx)的脚注中找到有关此做法的局限性的更多详细信息。如前所述,我发现“容易说服我的同事使用它”这一因素很重要,而使用托管工具则会在这一方面设置额外的障碍。