4

我使用 VS2010 进行 C++ 开发,我经常最终在一些 dll 项目中工作,并且在一切都编译好之后,我想尝试在某些类上运行虚拟数据,但事实上它是一个 dll 而不是一个 exe main 让它成为不可能。那么有没有一种简单的方法来做我想做的事,或者我被诅咒直到永远将一个大项目的部分 c/p 变成一个小测试?Ofc 更改项目的类型也可以,但我想有一些几乎像迭代 shell 测试功能的方式。

4

5 回答 5

5

我知道这不是一个库或任何东西,但如果你想在 Windows 上运行 dll 而不将其构建成任何东西或编写脚本,你可以在 Windows 中使用 rundll32.exe。它允许您在 dll 中运行任何导出的函数。语法应该类似于:

rundll32.exe PathAndNameofDll,exportedFunctionName [ArgsToTheExportedFunction]

http://best-windows.vlaurie.com/rundll32.html - 是一个关于如何使用这个二进制文件的很好的简单但相关的教程。它有一些很酷的技巧,可能会让你大吃一惊。

如果您想知道 64 位版本,它具有相同的名称(真的是微软?)在这里查看: rundll32.exe 等效于 64 位 DLL

此外,如果你想进入低级别,理论上你可以使用OllyDbg,它带有一个 DLL 加载器来运行你想要调试的 DLL(在汇编中),你可以在其中做相同类型的事情(调用导出的函数并传递args),但调试器更多的是用于逆向工程而不是代码调试。

于 2012-06-20T03:48:29.487 回答
3

我认为您基本上有两种选择。

首先,是对函数使用某种单元测试。对于 C++,你可以找到各种实现,看看CppUnit

第二种选择是打开 DLL,通过 Win32API 获取函数并以这种方式调用它(这在某种程度上仍然符合单元测试的条件)。您可以通过创建执行上述参数化所需信息(例如 dll 路径、函数名称)的可执行文件来概括这种方法,以实现您提到的“交互式外壳”——如果您决定采用此路径,您可以查看这篇关于从 C++ 加载 DLL 的CodeProject 文章

于 2012-06-14T01:19:23.657 回答
2

除了使用 CppUnit 提供的单元测试外,您还可以编写自己的小型测试框架。这样你就可以根据需要设置你的 Dll 项目,加载它,链接它,无论你想要什么,并用一些你喜欢的简单数据来证明它。

如果您有许多相互依赖的 Dll 来完成某项工作,这是很有价值的。(根据我的经验,C++ 中的遗留 Dlls 项目往往难以测试)。

完成一些框架应用程序后,您还可以检查 CppUnit 提供给您的可能性并将其与您的测试框架结合起来。

这样你最终会得到一套很好的自动化测试,它们仍然是有价值的单元测试。如果项目已经有一定规模,开始进行单元测试有点困难。拥有自己的框架可以让您在对 dll 进行一些更改时编写测试。只需将其插入您的框架,测试您期望它做什么并越来越多地增强您的框架。

基本思想是将测试、测试运行程序、测试数据和要进行的断言分开。

于 2012-06-19T20:57:57.327 回答
1

我正在使用 python + ctypes 为我的 DLL 应用程序构建快速测试例程。

如果您使用扩展属性语法,对您来说会很容易。

Google for Python + ctypes + test unit 你会发现几个例子。

于 2012-06-19T12:13:21.313 回答
1

我会推荐 Window Powershell 命令行开关。

如果您查看此处的文章 - http://msdn.microsoft.com/en-us/magazine/cc163430.aspx,您会发现设置起来是多么容易。当然,这篇文章主要是关于测试 C# 代码,但你可以看到他们是如何谈论能够以同样的方式加载任何启用 COM 的 DLL。

在这里您可以看到如何加载 COM 程序集 - http://blogs.technet.com/b/heyscriptingguy/archive/2009/01/26/how-do-i-use-windows-powershell-to-work-with -junk-e-mail-in-office-outlook.aspx

编辑:我认识一家非常成功的存储虚拟化软件公司,它广泛使用 Powershell 来测试它的托管和非托管(驱动程序)代码。

于 2012-06-20T14:25:24.107 回答