Qt:使用 Visual Studio 进行单元测试

Posted

技术标签:

【中文标题】Qt:使用 Visual Studio 进行单元测试【英文标题】:Qt : Unit Test with Visual Studio 【发布时间】:2018-08-28 06:05:15 【问题描述】:

我有一个 Visual Studio 项目,想为它编写一些单元测试。 我尝试通过使用“本机单元测试项目”来做到这一点。 问题是,当我在测试中使用 QString 时,测试失败并显示以下消息:

消息:无法设置执行上下文来运行测试

关于如何使用 Qt 编写单元测试有什么建议吗?

#include "stdafx.h"
#include "CppUnitTest.h"

#include <QtCore/QCoreApplication>

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace Test
       
    TEST_CLASS(UnitTest1)
    
    public:     
        TEST_METHOD(TestMethod1)
        
            QString a = "Test";
            Assert::IsTrue(true);
        

    ;

【问题讨论】:

您的问题实际上是“使用 Visual Studio 单元测试框架进行单元测试” 你可能想看看github.com/Microsoft/vstest/issues/1657 嗨乔纳斯,我已经尝试过你上面的例子,我能够编译单元测试。这些是我除了复制您的代码之外所做的以下更改。检查您的 QT 是使用 32 位还是 64 位编译器构建的。您需要在解决方案平台中进行相同设置。您需要在项目属性中添加包含目录路径和 lib 文件路径(Qt5Cored.lib)。要运行单元测试,您需要将 Qt5Cored.dll 文件复制到生成 exe 文件的文件夹中(编译后)。 @sonulohani 提交您的评论作为答案。 @UmNyobe,好的,谢谢 【参考方案1】:

我已尝试使用您的上述示例,并且能够编译单元测试。这些是我除了复制您的代码之外所做的以下更改。

检查您的 QT 是使用 32 位还是 64 位编译器构建的。 您需要在解决方案平台中进行相同设置。 需要添加include目录路径和lib文件路径(Qt5Cored.lib(对于 debug)/Qt5Core.lib(for release)) 在项目属性中。 要运行单元测试,您需要复制 Qt5Cored.dll/Qt5Core.dll 文件位于生成单元测试 dll 文件的文件夹中(编译后)。

PS:- 我使用的是 VS 2015,但这没关系。

【讨论】:

我尝试了您的解决方案,但遗憾的是它到目前为止还没有奏效。我必须在哪里复制 Qt5Core(d).dll?因为我开始测试时VS启动了testhost.exe,所以没有生成.exe文件。 嗨@Jonas,告诉我一件事。正如您所提到的,如果您使用 QString ,那么您的测试将失败。你确定吗?对不起,我提到 exe 的部分,它实际上是 dll 而不是 exe。同时您可以通过此链接:docs.microsoft.com/en-us/visualstudio/test/…,它将告诉您有关如何设置测试环境和运行测试的更多详细信息。【参考方案2】:

我在使用 Qt Visual Studio Tools extension for Visual Studio 2019 创建的项目中也遇到了 Qt6 的这个问题。

QString 是构建过程中出现的错误之一,但还有更多错误。我的解决方案如下:

    转到Microsoft Unit Testing Framework for C++项目的属性(右键单击解决方案,菜单“属性”的底部选项)

    正如@sonulohani 的回复中提到的,我让它默认运行在 x64 中。

    Configuration Properties > Linker > General Additional Library Directories 下,我在列表顶部添加了指向我的 QT 安装位置 libs 文件夹的路径(对我来说这是C:\Qt\6.1.2\msvc2019_64\lib)。

    Configuration Properties > Linker > Input Additional Dependencies 我添加了一个链接,指向来自同一个 QT 安装的所有“*.lib”文件(对我来说,这是C:\Qt\6.1.2\msvc2019_64\lib\*.lib AND 一个指向 Qt 项目的构建输出 .obj 文件的链接($(SolutionDir)&lt;MY PROJECT NAME&gt;\$(IntDir)*.obj 其中 是我的项目名称)。第二部分可能不一定需要。

    按照@sonulohani 的建议仅复制 Qt6Core.dll/Qt6Cored.dll 不起作用。它仍然缺少东西。所以在属性中,Configuration Properties > Build Events > Post-Build Event Command Line 我添加了这个脚本来复制所有Qt6 dll文件到测试项目.dll输出目录: for %%f in (C:\Qt\6.1.2\msvc2019_64\bin\Qt6*.dll) do @copy /y %%f $(SolutionDir)$(Platform)\$(Configuration)\Tests\

现在我遇到了另一个问题,因为我的测试项目和我的实际 Qt 项目都将其文件转储到同一个输出目录中,而 Qt 项目不喜欢将所有这些 dll 放在那里并且不再运行.所以我在常规输出目录中创建了$(SolutionDir)$(Platform)\$(Configuration)\Tests\ 目录,并将这个\Tests\ 子目录设置为测试项目的输出目录(Configuration Properties > GeneralOutput Directory)。

【讨论】:

以上是关于Qt:使用 Visual Studio 进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

使用 Visual Studio 2019 对 BizTalk 2020 人工制品进行单元测试会导致 Intellisense 问题

Visual Studio里使用Qt

使用本机单元测试项目在 Visual Studio 2017 中对 C 代码进行单元测试

如何在 Visual Studio 2005 中进行单元测试?

在 Visual Studio 2013 中使用 HttpClient 进行单元测试/集成测试 Web API

Qt - Visual Studio - 在多台计算机上处​​理项目